From 37a36ccf2da40c81096d16af59aba13052729436 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 3 Aug 2021 14:16:50 +0200 Subject: [PATCH 1/2] manager: hide secondary bookings during event check (#55900) --- .../templates/chrono/manager_event_check.html | 6 +-- .../manager_event_check_booking_fragment.html | 2 +- chrono/manager/views.py | 21 ++++++++-- tests/manager/test_event.py | 40 +++++++++++++++++++ 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/chrono/manager/templates/chrono/manager_event_check.html b/chrono/manager/templates/chrono/manager_event_check.html index 6781d58..277ae34 100644 --- a/chrono/manager/templates/chrono/manager_event_check.html +++ b/chrono/manager/templates/chrono/manager_event_check.html @@ -11,7 +11,7 @@ {% block content %}

- {% blocktrans with places=object.places booked_places=booked|length %}Bookings ({{ booked_places }}/{{ places }}){% endblocktrans %} + {% blocktrans with places=object.places %}Bookings ({{ booked_places }}/{{ places }}){% endblocktrans %}

@@ -76,13 +76,13 @@ {% if object.waiting_list_places %}

- {% blocktrans with places=object.waiting_list_places booked_places=waiting|length %}Waiting List ({{ booked_places }}/{{ places }}){% endblocktrans %} + {% blocktrans with places=object.waiting_list_places %}Waiting List ({{ waiting_places }}/{{ places }}){% endblocktrans %}

{% for booking in waiting %} - + {% endfor %}
{{ booking.get_user_block }}
{{ booking.get_user_block }}{% if booking.places_count > 1 %} ({{ booking.places_count }} {% trans "places" %}){% endif %}
diff --git a/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html b/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html index 08af918..9a5f60a 100644 --- a/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html +++ b/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html @@ -1,6 +1,6 @@ {% load i18n %} -{{ booking.get_user_block }} +{{ booking.get_user_block }}{% if booking.places_count > 1 %} ({{ booking.places_count }} {% trans "places" %}){% endif %} {{ booking.user_was_present|yesno:_('Present,Absent,-') }} {% if booking.user_was_present is False and booking.user_absence_reason %} diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 50ef9ca..12befea 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -25,7 +25,7 @@ import requests from django.contrib import messages from django.core.exceptions import PermissionDenied from django.db import transaction -from django.db.models import BooleanField, Max, Min, Q, Value +from django.db.models import BooleanField, Count, Max, Min, Q, Sum, Value from django.http import Http404, HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, redirect, render from django.template.defaultfilters import title @@ -2013,12 +2013,19 @@ class EventCheckView(ViewableAgendaMixin, DetailView): context = super().get_context_data(**kwargs) event = self.object - booked_qs = event.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=False) + booked_qs = event.booking_set.filter( + cancellation_datetime__isnull=True, in_waiting_list=False, primary_booking__isnull=True + ) + booked_qs = booked_qs.annotate( + places_count=Value(1) + + Count('secondary_booking_set', filter=Q(cancellation_datetime__isnull=True)) + ) filterset = BookingCheckFilterSet(self.request.GET, queryset=booked_qs, agenda=self.agenda) context['filterset'] = filterset # build booking list context['booked'] = filterset.qs.order_by('user_last_name', 'user_first_name') + context['booked_places'] = context['booked'].aggregate(places=Sum('places_count'))['places'] context['booked_without_status'] = any(e.user_was_present is None for e in context['booked']) if context['booked_without_status']: context['absence_form'] = BookingAbsenceReasonForm(agenda=self.agenda) @@ -2026,9 +2033,15 @@ class EventCheckView(ViewableAgendaMixin, DetailView): booking.form = BookingAbsenceReasonForm( agenda=self.agenda, initial={'reason': booking.user_absence_reason} ) - context['waiting'] = event.booking_set.filter( - cancellation_datetime__isnull=True, in_waiting_list=True + waiting_qs = event.booking_set.filter( + cancellation_datetime__isnull=True, in_waiting_list=True, primary_booking__isnull=True ).order_by('user_last_name', 'user_first_name') + waiting_qs = waiting_qs.annotate( + places_count=Value(1) + + Count('secondary_booking_set', filter=Q(cancellation_datetime__isnull=True)) + ) + context['waiting'] = waiting_qs + context['waiting_places'] = waiting_qs.aggregate(places=Sum('places_count'))['places'] return context diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 69b0913..bc68326 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -1555,3 +1555,43 @@ def test_event_check_all_bookings(app, admin_user): params={'csrfmiddlewaretoken': token}, status=404, ) + + +def test_event_check_primary_booking(app, admin_user): + group = AbsenceReasonGroup.objects.create(label='Foo bar') + agenda = Agenda.objects.create(label='Events', kind='events') + event = Event.objects.create( + label='xyz', + start_datetime=now() - datetime.timedelta(days=1), + places=10, + waiting_list_places=5, + agenda=agenda, + ) + booking = Booking.objects.create(event=event, user_first_name='User', user_last_name='42') + booking_2 = Booking.objects.create(event=event, user_first_name='John', user_last_name='Doe') + booking_3 = Booking.objects.create( + event=event, user_first_name='Jane', user_last_name='Doe', in_waiting_list=True + ) + # create secondary bookings + Booking.objects.create(event=event, user_first_name='User', user_last_name='42', primary_booking=booking) + Booking.objects.create(event=event, user_first_name='User', user_last_name='42', primary_booking=booking) + Booking.objects.create( + event=event, + user_first_name='Jane', + user_last_name='Doe', + primary_booking=booking_3, + in_waiting_list=True, + ) + + login(app) + resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk)) + assert 'Bookings (4/10)' in resp.text + user_bookings = resp.pyquery.find('td.booking-username.main-list') + assert len(user_bookings) == 2 + assert user_bookings[0].text == 'User 42 (3 places)' + assert user_bookings[1].text == 'John Doe' + + assert 'Waiting List (2/5)' in resp.text + user_bookings = resp.pyquery.find('td.booking-username.waiting') + assert len(user_bookings) == 1 + assert user_bookings[0].text == 'Jane Doe (2 places)' -- 2.20.1