diff --git a/bda/views.py b/bda/views.py index 96060de2..99168787 100644 --- a/bda/views.py +++ b/bda/views.py @@ -271,6 +271,7 @@ def revente(request, tirage_id): if not participant.paid: return render(request, "bda-notpaid.html", {}) if request.method == 'POST': + # On met en vente une place if 'resell' in request.POST: resellform = ResellForm(participant, request.POST, prefix='resell') annulform = AnnulForm(participant, prefix='annul') @@ -279,9 +280,10 @@ def revente(request, tirage_id): attributions = resellform.cleaned_data["attributions"] with transaction.atomic(): for attribution in attributions: - revente, created = SpectacleRevente.objects.get_or_create( - attribution=attribution, - defaults={'seller': participant}) + revente, created = \ + SpectacleRevente.objects.get_or_create( + attribution=attribution, + defaults={'seller': participant}) if not created: revente.seller = participant revente.date = timezone.now() @@ -289,21 +291,25 @@ def revente(request, tirage_id): revente.notif_sent = False revente.tirage_done = False revente.shotgun = False - mail_subject = "BdA-Revente : {:s}".format(attribution.spectacle.title) - mail_body = loader.render_to_string('bda/mails/revente-new.txt', { - 'vendeur': participant.user, - 'spectacle': attribution.spectacle, - 'revente': revente, - }) + mail_subject = "BdA-Revente : {:s}".format( + attribution.spectacle.title) + mail_body = loader.render_to_string( + 'bda/mails/revente-new.txt', + {'vendeur': participant.user, + 'spectacle': attribution.spectacle, + 'revente': revente} + ) mails.append(mail.EmailMessage( mail_subject, mail_body, from_email=settings.MAIL_DATA['revente']['FROM'], to=[participant.user.email], - reply_to=[settings.MAIL_DATA['revente']['REPLYTO']], + reply_to=[ + settings.MAIL_DATA['revente']['REPLYTO'] + ], )) revente.save() mail.get_connection().send_messages(mails) - + # On annule une revente elif 'annul' in request.POST: annulform = AnnulForm(participant, request.POST, prefix='annul') resellform = ResellForm(participant, prefix='resell') @@ -311,7 +317,8 @@ def revente(request, tirage_id): attributions = annulform.cleaned_data["attributions"] for attribution in attributions: attribution.revente.delete() - + # On confirme une vente en transférant la place à la personne qui a + # gagné le tirage elif 'transfer' in request.POST: resellform = ResellForm(participant, prefix='resell') annulform = AnnulForm(participant, prefix='annul') @@ -324,7 +331,9 @@ def revente(request, tirage_id): attrib = revente.attribution attrib.participant = revente.soldTo attrib.save() - + # On annule la revente après le tirage au sort (par exemple si + # la personne qui a gagné le tirage ne se manifeste pas). La place est + # alors remise en vente elif 'reinit' in request.POST: resellform = ResellForm(participant, prefix='resell') annulform = AnnulForm(participant, prefix='annul') @@ -398,16 +407,24 @@ def list_revente(request, tirage_id): for spectacle in choices: qset = SpectacleRevente.objects.filter( attribution__spectacle=spectacle) - if qset.exists(): - # On l'inscrit à l'un des tirages au sort - for revente in qset.all(): - if revente.shotgun and not revente.soldTo: - deja_revente = True - else: - revente.answered_mail.add(participant) - revente.save() - inscrit_revente = True - break + if qset.filter(shotgun=True, soldTo__isnull=True).exists(): + # Une place est disponible au shotgun, on suggère à + # l'utilisateur d'aller la récupérer + deja_revente = True + else: + # La place n'est pas disponible au shotgun, si des reventes + # pour ce spectacle existent déjà, on inscrit la personne à + # la revente ayant le moins d'inscrits + min_resell = ( + qset.filter(shotgun=False) + .annotate(nb_subscribers=Count('answered_mail')) + .order_by('nb_subscribers') + .first() + ) + if min_resell is not None: + min_resell.answered_mail.add(participant) + min_resell.save() + inscrit_revente = True success = True else: form = InscriptionReventeForm(