forked from DGNum/gestioCOF
Update while working on Django 1.5 upgrade
This commit is contained in:
parent
2479b0a24d
commit
9c989d886b
25 changed files with 1112 additions and 357 deletions
|
@ -1,6 +1,8 @@
|
|||
# coding: utf-8
|
||||
|
||||
from django.conf import settings
|
||||
from django.db.models import Max
|
||||
|
||||
import random
|
||||
|
||||
class Algorithm(object):
|
||||
|
@ -10,37 +12,41 @@ class Algorithm(object):
|
|||
origranks = None
|
||||
double = None
|
||||
|
||||
def __init__(self, shows, members):
|
||||
def __init__(self, shows, members, choices):
|
||||
"""Initialisation :
|
||||
- on aggrège toutes les demandes pour chaque spectacle dans
|
||||
show.requests
|
||||
- on crée des tables de demandes pour chaque personne, afin de
|
||||
pouvoir modifier les rankings"""
|
||||
self.max_group = 2 * choices.aggregate(Max('priority'))['priority__max']
|
||||
self.shows = []
|
||||
showdict = {}
|
||||
for show in shows:
|
||||
show.nrequests = 0
|
||||
showdict[show] = show
|
||||
show.requests = []
|
||||
self.shows.append(show)
|
||||
self.ranks = {}
|
||||
self.origranks = {}
|
||||
self.double = {}
|
||||
self.choices = {}
|
||||
for member in members:
|
||||
ranks = {}
|
||||
double = {}
|
||||
for i in range(1, settings.NUM_CHOICES + 1):
|
||||
choice = getattr(member, "choice%d" % i)
|
||||
if not choice:
|
||||
continue
|
||||
# Noter les doubles demandes
|
||||
if choice in double:
|
||||
double[choice] = True
|
||||
else:
|
||||
showdict[choice].requests.append(member)
|
||||
ranks[choice] = i
|
||||
double[choice] = False
|
||||
member_choices = {}
|
||||
member_shows = {}
|
||||
#next_priority = 1
|
||||
next_rank = 1
|
||||
for choice in member.choixspectacle_set.order_by('priority').all():
|
||||
if choice.spectacle in member_shows: continue
|
||||
else: member_shows[choice.spectacle] = True
|
||||
#assert choice.priority == next_priority
|
||||
#next_priority += 1
|
||||
showdict[choice.spectacle].requests.append(member)
|
||||
showdict[choice.spectacle].nrequests += 2 if choice.double else 1
|
||||
ranks[choice.spectacle] = next_rank
|
||||
next_rank += 2 if choice.double else 1
|
||||
member_choices[choice.spectacle] = choice
|
||||
self.ranks[member] = ranks
|
||||
self.double[member] = double
|
||||
self.choices[member] = member_choices
|
||||
self.origranks[member] = dict(ranks)
|
||||
|
||||
def IncrementRanks(self, member, currank, increment = 1):
|
||||
|
@ -52,30 +58,37 @@ class Algorithm(object):
|
|||
l.append((member,
|
||||
self.ranks[member][show],
|
||||
self.origranks[member][show],
|
||||
self.double[member][show]))
|
||||
self.choices[member][show].double))
|
||||
|
||||
"""
|
||||
Pour les 2 Walkyries: c'est Sandefer
|
||||
|
||||
Pour les 4 places pour l'Oratorio c'est Maxence Arutkin
|
||||
"""
|
||||
|
||||
def __call__(self, seed):
|
||||
random.seed(seed)
|
||||
results = []
|
||||
for show in self.shows:
|
||||
shows = sorted(self.shows, key = lambda x: float(x.nrequests) / x.slots, reverse = True)
|
||||
for show in shows:
|
||||
# On regroupe tous les gens ayant le même rang
|
||||
groups = {}
|
||||
for i in range(1, settings.NUM_CHOICES + 1):
|
||||
groups[i] = []
|
||||
groups = dict([(i, []) for i in range(1, self.max_group + 1)])
|
||||
for member in show.requests:
|
||||
if self.ranks[member][show] == 0:
|
||||
raise RuntimeError, (member, show.title)
|
||||
groups[self.ranks[member][show]].append(member)
|
||||
# On passe à l'attribution
|
||||
winners = []
|
||||
losers = []
|
||||
for i in range(1, settings.NUM_CHOICES + 1):
|
||||
for i in range(1, self.max_group + 1):
|
||||
group = list(groups[i])
|
||||
random.shuffle(group)
|
||||
for member in group:
|
||||
if self.double[member][show]: # double
|
||||
if self.choices[member][show].double: # double
|
||||
if len(winners) + 1 < show.slots:
|
||||
self.appendResult(winners, member, show)
|
||||
self.appendResult(winners, member, show)
|
||||
elif not member.autoquit and len(winners) < show.slots:
|
||||
elif not self.choices[member][show].autoquit and len(winners) < show.slots:
|
||||
self.appendResult(winners, member, show)
|
||||
self.appendResult(losers, member, show)
|
||||
else:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue