Update while working on Django 1.5 upgrade

This commit is contained in:
root 2013-09-05 22:20:52 +02:00
parent 2479b0a24d
commit 9c989d886b
25 changed files with 1112 additions and 357 deletions

View file

@ -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: