forked from DGNum/gestioCOF
PEP8: fixed ' = ' → '=' on parameters
'unexpected spaces around keyword / parameter equals'
This commit is contained in:
parent
7de11f2285
commit
c7a3656ded
18 changed files with 496 additions and 379 deletions
16
bda/admin.py
16
bda/admin.py
|
@ -19,23 +19,25 @@ class AttributionInline(admin.TabularInline):
|
|||
class ParticipantAdmin(admin.ModelAdmin):
|
||||
inlines = [AttributionInline]
|
||||
def get_queryset(self, request):
|
||||
return Participant.objects.annotate(nb_places = Count('attributions'),
|
||||
total = Sum('attributions__price'))
|
||||
return Participant.objects.annotate(nb_places=Count('attributions'),
|
||||
total=Sum('attributions__price'))
|
||||
def nb_places(self, obj):
|
||||
return obj.nb_places
|
||||
nb_places.admin_order_field = "nb_places"
|
||||
nb_places.short_description = "Nombre de places"
|
||||
def total(self, obj):
|
||||
tot = obj.total
|
||||
if tot: return u"%.02f €" % tot
|
||||
else: return u"0 €"
|
||||
if tot:
|
||||
return u"%.02f €" % tot
|
||||
else:
|
||||
return u"0 €"
|
||||
total.admin_order_field = "total"
|
||||
total.short_description = "Total à payer"
|
||||
list_display = ("user", "nb_places", "total", "paid", "paymenttype",
|
||||
"tirage")
|
||||
list_filter = ("paid", "tirage")
|
||||
search_fields = ('user__username', 'user__first_name', 'user__last_name')
|
||||
actions = ['send_attribs',]
|
||||
actions = ['send_attribs', ]
|
||||
actions_on_bottom = True
|
||||
list_per_page = 400
|
||||
readonly_fields = ("total",)
|
||||
|
@ -97,7 +99,7 @@ Le Bureau des Arts
|
|||
mail = mail % (name, attribs_text, deadline.strftime('%d %b %Y'))
|
||||
send_mail ("Résultats du tirage au sort", mail,
|
||||
"bda@ens.fr", [member.user.email],
|
||||
fail_silently = True)
|
||||
fail_silently=True)
|
||||
count = len(queryset.all())
|
||||
if count == 1:
|
||||
message_bit = u"1 membre a"
|
||||
|
@ -110,7 +112,7 @@ Le Bureau des Arts
|
|||
|
||||
class AttributionAdminForm(forms.ModelForm):
|
||||
def clean(self):
|
||||
cleaned_data=super(AttributionAdminForm, self).clean()
|
||||
cleaned_data = super(AttributionAdminForm, self).clean()
|
||||
participant = cleaned_data.get("participant")
|
||||
spectacle = cleaned_data.get("spectacle")
|
||||
if participant and spectacle:
|
||||
|
|
|
@ -39,8 +39,10 @@ class Algorithm(object):
|
|||
member_shows[member] = {}
|
||||
for choice in choices:
|
||||
member = choice.participant
|
||||
if choice.spectacle in member_shows[member]: continue
|
||||
else: member_shows[member][choice.spectacle] = True
|
||||
if choice.spectacle in member_shows[member]:
|
||||
continue
|
||||
else:
|
||||
member_shows[member][choice.spectacle] = True
|
||||
showdict[choice.spectacle].requests.append(member)
|
||||
showdict[choice.spectacle].nrequests += 2 if choice.double else 1
|
||||
self.ranks[member][choice.spectacle] = next_rank[member]
|
||||
|
@ -49,7 +51,7 @@ class Algorithm(object):
|
|||
for member in members:
|
||||
self.origranks[member] = dict(self.ranks[member])
|
||||
|
||||
def IncrementRanks(self, member, currank, increment = 1):
|
||||
def IncrementRanks(self, member, currank, increment=1):
|
||||
for show in self.ranks[member]:
|
||||
if self.ranks[member][show] > currank:
|
||||
self.ranks[member][show] -= increment
|
||||
|
@ -63,7 +65,7 @@ class Algorithm(object):
|
|||
def __call__(self, seed):
|
||||
random.seed(seed)
|
||||
results = []
|
||||
shows = sorted(self.shows, key = lambda x: x.nrequests / x.slots, reverse = True)
|
||||
shows = sorted(self.shows, key=lambda x: x.nrequests / x.slots, reverse=True)
|
||||
for show in shows:
|
||||
# On regroupe tous les gens ayant le même rang
|
||||
groups = dict([(i, []) for i in range(1, self.max_group + 1)])
|
||||
|
@ -78,7 +80,7 @@ class Algorithm(object):
|
|||
group = list(groups[i])
|
||||
random.shuffle(group)
|
||||
for member in group:
|
||||
if self.choices[member][show].double: # double
|
||||
if self.choices[member][show].double: # double
|
||||
if len(winners) + 1 < show.slots:
|
||||
self.appendResult(winners, member, show)
|
||||
self.appendResult(winners, member, show)
|
||||
|
@ -89,12 +91,11 @@ class Algorithm(object):
|
|||
self.appendResult(losers, member, show)
|
||||
self.appendResult(losers, member, show)
|
||||
self.IncrementRanks(member, i, 2)
|
||||
else: # simple
|
||||
else: # simple
|
||||
if len(winners) < show.slots:
|
||||
self.appendResult(winners, member, show)
|
||||
else:
|
||||
self.appendResult(losers, member, show)
|
||||
self.IncrementRanks(member, i)
|
||||
results.append((show,winners,losers))
|
||||
results.append((show, winners, losers))
|
||||
return results
|
||||
|
||||
|
|
|
@ -9,7 +9,8 @@ class BaseBdaFormSet(BaseInlineFormSet):
|
|||
"""Checks that no two articles have the same title."""
|
||||
super(BaseBdaFormSet, self).clean()
|
||||
if any(self.errors):
|
||||
# Don't bother validating the formset unless each form is valid on its own
|
||||
# Don't bother validating the formset unless each form is valid on
|
||||
# its own
|
||||
return
|
||||
spectacles = []
|
||||
for i in range(0, self.total_form_count()):
|
||||
|
@ -32,10 +33,9 @@ class SpectacleModelChoiceField(forms.ModelChoiceField):
|
|||
obj.location, obj.price)
|
||||
|
||||
class ResellForm(forms.Form):
|
||||
count = forms.ChoiceField(choices = (("1","1"),("2","2"),))
|
||||
count = forms.ChoiceField(choices=(("1", "1"), ("2", "2"),))
|
||||
spectacle = SpectacleModelChoiceField(queryset=Spectacle.objects.none())
|
||||
|
||||
def __init__(self, participant, *args, **kwargs):
|
||||
super(ResellForm, self).__init__(*args, **kwargs)
|
||||
self.fields['spectacle'].queryset = participant.attributions.all().distinct()
|
||||
|
||||
|
|
|
@ -18,12 +18,12 @@ class Tirage(models.Model):
|
|||
|
||||
def __unicode__(self):
|
||||
return u"%s - %s" % (self.title, self.date_no_seconds())
|
||||
|
||||
|
||||
class Salle(models.Model):
|
||||
name = models.CharField("Nom", max_length = 300)
|
||||
name = models.CharField("Nom", max_length=300)
|
||||
address = models.TextField("Adresse")
|
||||
|
||||
def __unicode__ (self):
|
||||
def __unicode__(self):
|
||||
return self.name
|
||||
|
||||
class Spectacle(models.Model):
|
||||
|
@ -39,9 +39,9 @@ class Spectacle(models.Model):
|
|||
|
||||
class Meta:
|
||||
verbose_name = "Spectacle"
|
||||
ordering = ("priority", "date","title",)
|
||||
ordering = ("priority", "date", "title",)
|
||||
|
||||
def __repr__ (self):
|
||||
def __repr__(self):
|
||||
return u"[%s]" % self.__unicode__()
|
||||
|
||||
def timestamp(self):
|
||||
|
@ -50,15 +50,15 @@ class Spectacle(models.Model):
|
|||
def date_no_seconds(self):
|
||||
return self.date.strftime('%d %b %Y %H:%M')
|
||||
|
||||
def __unicode__ (self):
|
||||
def __unicode__(self):
|
||||
return u"%s - %s, %s, %.02f€" % (self.title, self.date_no_seconds(),
|
||||
self.location, self.price)
|
||||
|
||||
PAYMENT_TYPES = (
|
||||
("cash",u"Cash"),
|
||||
("cb","CB"),
|
||||
("cheque",u"Chèque"),
|
||||
("autre",u"Autre"),
|
||||
("cash", u"Cash"),
|
||||
("cb", "CB"),
|
||||
("cheque", u"Chèque"),
|
||||
("autre", u"Autre"),
|
||||
)
|
||||
|
||||
class Participant(models.Model):
|
||||
|
@ -69,12 +69,12 @@ class Participant(models.Model):
|
|||
attributions = models.ManyToManyField(Spectacle,
|
||||
through="Attribution",
|
||||
related_name="attributed_to")
|
||||
paid = models.BooleanField (u"A payé", default=False)
|
||||
paid = models.BooleanField(u"A payé", default=False)
|
||||
paymenttype = models.CharField(u"Moyen de paiement",
|
||||
max_length=6, choices=PAYMENT_TYPES, blank=True)
|
||||
tirage = models.ForeignKey(Tirage)
|
||||
|
||||
def __unicode__ (self):
|
||||
|
||||
def __unicode__(self):
|
||||
return u"%s" % (self.user)
|
||||
|
||||
DOUBLE_CHOICES = (
|
||||
|
@ -109,6 +109,5 @@ class Attribution(models.Model):
|
|||
spectacle = models.ForeignKey(Spectacle, related_name="attribues")
|
||||
given = models.BooleanField(u"Donnée", default=False)
|
||||
|
||||
def __unicode__ (self):
|
||||
def __unicode__(self):
|
||||
return u"%s -- %s" % (self.participant, self.spectacle)
|
||||
|
||||
|
|
|
@ -21,14 +21,14 @@ urlpatterns = patterns('',
|
|||
name='bda-etat-places'),
|
||||
url(r'tirage/(?P<tirage_id>\d+)$', 'bda.views.tirage'),
|
||||
url(r'spectacles/(?P<tirage_id>\d+)$',
|
||||
SpectacleListView.as_view() ,
|
||||
name ="bda-liste-spectacles"),
|
||||
SpectacleListView.as_view(),
|
||||
name="bda-liste-spectacles"),
|
||||
url(r'spectacles/(?P<tirage_id>\d+)/(?P<spectacle_id>\d+)$',
|
||||
"bda.views.spectacle",
|
||||
name="bda-spectacle"),
|
||||
url(r'spectacles-ics/(?P<tirage_id>\d+)$',
|
||||
'bda.views.liste_spectacles_ics',
|
||||
name ="bda-liste-spectacles-ics"),
|
||||
name="bda-liste-spectacles-ics"),
|
||||
url(r'spectacles/unpaid/(?P<tirage_id>\d+)$',
|
||||
"bda.views.unpaid",
|
||||
name="bda-unpaid"),
|
||||
|
|
65
bda/views.py
65
bda/views.py
|
@ -10,7 +10,7 @@ from django.core import serializers
|
|||
from django.forms.models import inlineformset_factory
|
||||
import hashlib
|
||||
|
||||
from django.core.mail import send_mail
|
||||
from django.core.mail import send_mail
|
||||
from django.utils import timezone
|
||||
from django.views.generic.list import ListView
|
||||
|
||||
|
@ -23,6 +23,7 @@ from bda.algorithm import Algorithm
|
|||
|
||||
from bda.forms import BaseBdaFormSet, TokenForm, ResellForm
|
||||
|
||||
|
||||
@cof_required
|
||||
def etat_places(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -30,13 +31,13 @@ def etat_places(request, tirage_id):
|
|||
.filter(spectacle__tirage=tirage) \
|
||||
.filter(double_choice="1") \
|
||||
.all() \
|
||||
.values('spectacle','spectacle__title') \
|
||||
.values('spectacle', 'spectacle__title') \
|
||||
.annotate(total=models.Count('spectacle'))
|
||||
spectacles2 = ChoixSpectacle.objects \
|
||||
.filter(spectacle__tirage=tirage) \
|
||||
.exclude(double_choice="1") \
|
||||
.all() \
|
||||
.values('spectacle','spectacle__title') \
|
||||
.values('spectacle', 'spectacle__title') \
|
||||
.annotate(total=models.Count('spectacle'))
|
||||
spectacles = tirage.spectacle_set.all()
|
||||
spectacles_dict = {}
|
||||
|
@ -50,22 +51,24 @@ def etat_places(request, tirage_id):
|
|||
spectacles_dict[spectacle["spectacle"]].ratio = \
|
||||
spectacles_dict[spectacle["spectacle"]].total / \
|
||||
spectacles_dict[spectacle["spectacle"]].slots
|
||||
total += spectacle["total"]
|
||||
total += spectacle["total"]
|
||||
for spectacle in spectacles2:
|
||||
spectacles_dict[spectacle["spectacle"]].total += 2*spectacle["total"]
|
||||
spectacles_dict[spectacle["spectacle"]].ratio = \
|
||||
spectacles_dict[spectacle["spectacle"]].total / \
|
||||
spectacles_dict[spectacle["spectacle"]].slots
|
||||
total += spectacle["total"]
|
||||
total += spectacle["total"]
|
||||
return render(request, "etat-places.html",
|
||||
{"spectacles": spectacles, "total": total, 'tirage': tirage})
|
||||
|
||||
|
||||
def _hash_queryset(queryset):
|
||||
data = serializers.serialize("json", queryset)
|
||||
hasher = hashlib.sha256()
|
||||
hasher.update(data)
|
||||
return hasher.hexdigest()
|
||||
|
||||
|
||||
@cof_required
|
||||
def places(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -99,7 +102,8 @@ def places(request, tirage_id):
|
|||
"total": total,
|
||||
"warning": warning})
|
||||
|
||||
@cof_required
|
||||
|
||||
@cof_required
|
||||
def places_ics(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
|
@ -114,7 +118,8 @@ def places_ics(request, tirage_id):
|
|||
places_dict[place.spectacle].double = True
|
||||
else:
|
||||
place.double = False
|
||||
place.spectacle.dtend = place.spectacle.date + timedelta(seconds=7200)
|
||||
place.spectacle.dtend = place.spectacle.date + \
|
||||
timedelta(seconds=7200)
|
||||
places_dict[place.spectacle] = place
|
||||
spectacles.append(place.spectacle)
|
||||
filtered_places.append(place)
|
||||
|
@ -122,6 +127,7 @@ def places_ics(request, tirage_id):
|
|||
{"participant": participant,
|
||||
"places": filtered_places}, content_type="text/calendar")
|
||||
|
||||
|
||||
@cof_required
|
||||
def inscription(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -130,7 +136,7 @@ def inscription(request, tirage_id):
|
|||
tirage.ouverture.strftime('%d %b %Y à %H:%M'))
|
||||
return render(request, 'resume_inscription.html',
|
||||
{ "error_title": "Le tirage n'est pas encore ouvert !",
|
||||
"error_description": error_desc })
|
||||
"error_description": error_desc})
|
||||
if timezone.now() > tirage.fermeture:
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
user=request.user, tirage=tirage)
|
||||
|
@ -146,7 +152,7 @@ def inscription(request, tirage_id):
|
|||
BdaFormSet = inlineformset_factory(
|
||||
Participant,
|
||||
ChoixSpectacle,
|
||||
fields=("spectacle","double_choice","priority"),
|
||||
fields=("spectacle", "double_choice", "priority"),
|
||||
formset=BaseBdaFormSet,
|
||||
formfield_callback=formfield_callback)
|
||||
participant, created = Participant.objects.get_or_create(
|
||||
|
@ -170,7 +176,8 @@ def inscription(request, tirage_id):
|
|||
total_price = 0
|
||||
for choice in participant.choixspectacle_set.all():
|
||||
total_price += choice.spectacle.price
|
||||
if choice.double: total_price += choice.spectacle.price
|
||||
if choice.double:
|
||||
total_price += choice.spectacle.price
|
||||
return render(request, "inscription-bda.html",
|
||||
{ "formset": formset,
|
||||
"success": success,
|
||||
|
@ -179,6 +186,7 @@ def inscription(request, tirage_id):
|
|||
'tirage': tirage,
|
||||
"stateerror": stateerror})
|
||||
|
||||
|
||||
def do_tirage(request, tirage_id):
|
||||
tirage_elt = get_object_or_404(Tirage, id=tirage_id)
|
||||
form = TokenForm(request.POST)
|
||||
|
@ -221,8 +229,9 @@ def do_tirage(request, tirage_id):
|
|||
data["duration"] = time.time() - start
|
||||
if request.user.is_authenticated():
|
||||
members2 = {}
|
||||
members_uniq = {} # Participant objects are not shared accross spectacle results,
|
||||
# So assign a single object for each Participant id
|
||||
# Participant objects are not shared accross spectacle results,
|
||||
# so assign a single object for each Participant id
|
||||
members_uniq = {}
|
||||
for (show, members, _) in results:
|
||||
for (member, _, _, _) in members:
|
||||
if member.id not in members_uniq:
|
||||
|
@ -249,6 +258,7 @@ def do_tirage(request, tirage_id):
|
|||
else:
|
||||
return render(request, "bda-attrib.html", data)
|
||||
|
||||
|
||||
@buro_required
|
||||
def tirage(request, tirage_id):
|
||||
if request.POST:
|
||||
|
@ -259,6 +269,7 @@ def tirage(request, tirage_id):
|
|||
form = TokenForm()
|
||||
return render(request, "bda-token.html", {"form": form})
|
||||
|
||||
|
||||
def do_resell(request, form):
|
||||
spectacle = form.cleaned_data["spectacle"]
|
||||
count = form.cleaned_data["count"]
|
||||
|
@ -273,9 +284,10 @@ Contactez moi par email si vous êtes intéressé·e·s !
|
|||
request.user.email)
|
||||
send_mail("%s" % spectacle, mail,
|
||||
request.user.email, ["bda-revente@lists.ens.fr"],
|
||||
fail_silently = False)
|
||||
fail_silently=False)
|
||||
return render(request, "bda-success.html", {"show": spectacle, "places": places})
|
||||
|
||||
|
||||
@login_required
|
||||
def revente(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -291,6 +303,7 @@ def revente(request, tirage_id):
|
|||
form = ResellForm(participant)
|
||||
return render(request, "bda-revente.html", {"form": form, 'tirage': tirage})
|
||||
|
||||
|
||||
@buro_required
|
||||
def spectacle(request, tirage_id, spectacle_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -299,37 +312,41 @@ def spectacle(request, tirage_id, spectacle_id):
|
|||
participants = {}
|
||||
for attrib in attributions:
|
||||
participant = attrib.participant
|
||||
participant_info = {'lastname': participant.user.last_name,
|
||||
'name': participant.user.get_full_name,
|
||||
'username': participant.user.username,
|
||||
'email': participant.user.email,
|
||||
'given': int(attrib.given),
|
||||
'paid': participant.paid,
|
||||
participant_info = {'lastname': participant.user.last_name,
|
||||
'name': participant.user.get_full_name,
|
||||
'username': participant.user.username,
|
||||
'email': participant.user.email,
|
||||
'given': int(attrib.given),
|
||||
'paid': participant.paid,
|
||||
'nb_places': 1}
|
||||
if participant.id in participants:
|
||||
participants[participant.id]['nb_places'] += 1
|
||||
participants[participant.id]['nb_places'] += 1
|
||||
participants[participant.id]['given'] += attrib.given
|
||||
else:
|
||||
participants[participant.id] = participant_info
|
||||
|
||||
participants_info = sorted(participants.values(),
|
||||
participants_info = sorted(participants.values(),
|
||||
key=lambda part: part['lastname'])
|
||||
return render(request, "bda-participants.html",
|
||||
return render(request, "bda-participants.html",
|
||||
{"spectacle": spectacle, "participants": participants_info})
|
||||
|
||||
|
||||
class SpectacleListView(ListView):
|
||||
model = Spectacle
|
||||
template_name = 'spectacle_list.html'
|
||||
|
||||
def get_queryset(self):
|
||||
self.tirage = get_object_or_404(Tirage, id=self.kwargs['tirage_id'])
|
||||
categories = self.tirage.spectacle_set.all()
|
||||
return categories
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(SpectacleListView, self).get_context_data(**kwargs)
|
||||
context['tirage_id'] = self.tirage.id
|
||||
context['tirage_name'] = self.tirage.title
|
||||
return context
|
||||
|
||||
|
||||
@buro_required
|
||||
def unpaid(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
|
@ -338,7 +355,8 @@ def unpaid(request, tirage_id):
|
|||
.filter(paid=False, nb_attributions__gt=0).all()
|
||||
return render(request, "bda-unpaid.html", {"unpaid": unpaid})
|
||||
|
||||
@buro_required
|
||||
|
||||
@buro_required
|
||||
def liste_spectacles_ics(request, tirage_id):
|
||||
tirage = get_object_or_404(Tirage, id=tirage_id)
|
||||
spectacles = tirage.spectacle_set.order_by("date").all()
|
||||
|
@ -347,4 +365,3 @@ def liste_spectacles_ics(request, tirage_id):
|
|||
return render(request, "liste_spectacles.ics",
|
||||
{"spectacles": spectacles, "tirage": tirage},
|
||||
content_type="text/calendar")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue