diff --git a/bda/urls.py b/bda/urls.py index cefde4a2..5b452362 100644 --- a/bda/urls.py +++ b/bda/urls.py @@ -23,7 +23,11 @@ urlpatterns = [ views.spectacle, name="bda-spectacle", ), - url(r"^spectacles/unpaid/(?P\d+)$", views.unpaid, name="bda-unpaid"), + url( + r"^spectacles/unpaid/(?P\d+)$", + views.UnpaidParticipants.as_view(), + name="bda-unpaid", + ), url( r"^spectacles/autocomplete$", views.spectacle_autocomplete, diff --git a/bda/views.py b/bda/views.py index c0f4a079..40595cbf 100644 --- a/bda/views.py +++ b/bda/views.py @@ -41,7 +41,7 @@ from bda.models import ( SpectacleRevente, Tirage, ) -from gestioncof.decorators import buro_required, cof_required +from gestioncof.decorators import BuroRequiredMixin, buro_required, cof_required from utils.views.autocomplete import Select2QuerySetView @@ -378,7 +378,7 @@ def revente_manage(request, tirage_id): - Annulation d'une revente après que le tirage a eu lieu """ tirage = get_object_or_404(Tirage, id=tirage_id) - participant, created = Participant.objects.get_or_create( + participant, created = Participant.objects_paid.get_or_create( user=request.user, tirage=tirage ) @@ -695,12 +695,13 @@ def spectacle(request, tirage_id, spectacle_id): "username": participant.user.username, "email": participant.user.email, "given": int(attrib.given), - "paid": participant.paid, + "paid": True, "nb_places": 1, } if participant.id in participants: participants[participant.id]["nb_places"] += 1 participants[participant.id]["given"] += attrib.given + participants[participant.id]["paid"] &= attrib.paid else: participants[participant.id] = participant_info @@ -728,15 +729,14 @@ class SpectacleListView(ListView): return context -@buro_required -def unpaid(request, tirage_id): - tirage = get_object_or_404(Tirage, id=tirage_id) - unpaid = ( - tirage.participant_set.annotate(nb_attributions=Count("attribution")) - .filter(paid=False, nb_attributions__gt=0) - .select_related("user") - ) - return render(request, "bda-unpaid.html", {"unpaid": unpaid}) +class UnpaidParticipants(BuroRequiredMixin, ListView): + context_object_name = "unpaid" + template_name = "bda-unpaid.html" + + def get_queryset(self): + return Participant.objects_paid.filter( + tirage__id=self.kwargs["tirage_id"], paid=False + ).select_related("user") @buro_required diff --git a/gestioncof/decorators.py b/gestioncof/decorators.py index 37d93c7f..4f6eb0e4 100644 --- a/gestioncof/decorators.py +++ b/gestioncof/decorators.py @@ -1,6 +1,7 @@ from functools import wraps from django.contrib.auth.decorators import login_required, user_passes_test +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import PermissionDenied from django.shortcuts import render @@ -53,3 +54,19 @@ def buro_required(view_func): return render(request, "buro-denied.html", status=403) return login_required(_wrapped_view) + + +class CofRequiredMixin(PermissionRequiredMixin): + def has_permission(self): + try: + return self.request.user.profile.is_cof + except AttributeError: + return False + + +class BuroRequiredMixin(PermissionRequiredMixin): + def has_permission(self): + try: + return self.request.user.profile.is_buro + except AttributeError: + return False