From 8892bd7bcb83f73ff4d816936b665df79dc9cb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Fri, 17 Mar 2023 10:40:37 +0100 Subject: [PATCH] manager: lock check if flag check_locked is enabled (#75416) --- .../chrono/manager_agenda_event_fragment.html | 3 + .../manager_event_check_booking_fragment.html | 62 +++++++++--------- .../chrono/manager_event_detail.html | 1 + chrono/manager/views.py | 3 + tests/manager/test_event.py | 65 +++++++++++++++++++ 5 files changed, 104 insertions(+), 30 deletions(-) diff --git a/chrono/manager/templates/chrono/manager_agenda_event_fragment.html b/chrono/manager/templates/chrono/manager_agenda_event_fragment.html index a963cbe6..536f91b1 100644 --- a/chrono/manager/templates/chrono/manager_agenda_event_fragment.html +++ b/chrono/manager/templates/chrono/manager_agenda_event_fragment.html @@ -49,6 +49,9 @@ {% if event.main_list_full %} {% trans "Full" %} {% endif %} + {% if event.check_locked %} + {% trans "Check locked" %} + {% endif %} {% if event.checked %} {% trans "Checked" %} {% 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 1460e30a..582c29cf 100644 --- a/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html +++ b/chrono/manager/templates/chrono/manager_event_check_booking_fragment.html @@ -16,7 +16,7 @@ ({% trans "Cancelled" %}) {% endif %} {% if not event.checked or not agenda.disable_check_update %} - {% if booking.user_was_present is not None %} + {% if booking.user_was_present is not None and not event.check_locked %}
{% csrf_token %} {% trans "Reset" context "check" %} @@ -33,45 +33,47 @@ {% endif %} {% endif %} -{% if not event.checked or not agenda.disable_check_update %} - +{% if not event.check_locked %} + {% if not event.checked or not agenda.disable_check_update %} + + {% if booking.kind == "subscription" %} + + {% else %} + + {% endif %} + {% csrf_token %} + + {% if booking.presence_form.check_type.field.choices.1 %}{{ booking.presence_form.check_type }}{% endif %} + +
{% if booking.kind == "subscription" %} -
+ {% else %} - + {% endif %} {% csrf_token %} - {% if booking.presence_form.check_type.field.choices.1 %}{{ booking.presence_form.check_type }}{% endif %} + {% if booking.user_was_present is False %}disabled{% endif %} + >{% trans "Absence" %} + {% if booking.absence_form.check_type.field.choices.1 %}{{ booking.absence_form.check_type }}{% endif %} -
- {% if booking.kind == "subscription" %} -
- {% else %} - +
+ {% endif %} - {% csrf_token %} - - {% if booking.absence_form.check_type.field.choices.1 %}{{ booking.absence_form.check_type }}{% endif %} - - - {% endif %} diff --git a/chrono/manager/templates/chrono/manager_event_detail.html b/chrono/manager/templates/chrono/manager_event_detail.html index ac2650df..0feef473 100644 --- a/chrono/manager/templates/chrono/manager_event_detail.html +++ b/chrono/manager/templates/chrono/manager_event_detail.html @@ -27,6 +27,7 @@
{% if event.cancellation_status %}{{ event.cancellation_status }}{% endif %} {% if event.main_list_full %}{% trans "Full" %}{% endif %} + {% if event.check_locked %}{% trans "Check locked" %}{% endif %} {% if event.checked %}{% trans "Checked" %}{% endif %} {% if event.is_day_past and not event.cancelled %} {% if event.present_count %}{% blocktrans with count=event.present_count %}Presents {{ count }}{% endblocktrans %}{% endif %} diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 9651db64..6b8e10bc 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -2671,6 +2671,7 @@ class EventCheckMixin: pk=kwargs.get('event_pk'), agenda=self.agenda, cancelled=False, + check_locked=False, ) def get_bookings(self): @@ -3495,6 +3496,7 @@ class BookingCheckMixin: pk=kwargs['booking_pk'], event__agenda=self.agenda, event__cancelled=False, + event__check_locked=False, in_waiting_list=False, primary_booking__isnull=True, ) @@ -3596,6 +3598,7 @@ class SubscriptionCheckMixin(BookingCheckMixin): Q(start_datetime__date__lte=now().date()) | Q(agenda__enable_check_for_future_events=True), agenda=self.agenda, cancelled=False, + check_locked=False, pk=kwargs['event_pk'], ) subscription = get_object_or_404( diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index 30068802..998d1e6a 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -1716,6 +1716,7 @@ def test_event_checked(app, admin_user): for url in urls: resp = app.get(url) assert 'Checked' not in resp + assert 'check-locked' not in resp assert 'Presents 3' in resp assert 'Absents 4' in resp assert 'Not checked 1' in resp @@ -1736,6 +1737,7 @@ def test_event_checked(app, admin_user): for url in urls: resp = app.get(url) assert 'Checked' in resp + assert 'check-locked' not in resp assert 'Presents 4' in resp assert 'Absents 4' in resp assert 'meta meta-disabled' not in resp @@ -1761,6 +1763,29 @@ def test_event_checked(app, admin_user): status=302, ) + # event check is locked + event.checked = False + event.check_locked = True + event.save() + urls = [ + '/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk), + '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), + '/manage/agendas/%s/month/%d/%d/%d/' + % (agenda.pk, event.start_datetime.year, event.start_datetime.month, event.start_datetime.day), + '/manage/agendas/%s/week/%d/%d/%d/' + % (agenda.pk, event.start_datetime.year, event.start_datetime.month, event.start_datetime.day), + '/manage/agendas/%s/day/%d/%d/%d/' + % (agenda.pk, event.start_datetime.year, event.start_datetime.month, event.start_datetime.day), + ] + for url in urls: + resp = app.get(url) + assert 'Check locked' in resp + app.post( + '/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + @mock.patch('chrono.manager.forms.get_agenda_check_types') def test_event_check_filters(check_types, app, admin_user): @@ -2416,7 +2441,32 @@ def test_event_check_booking(check_types, app, admin_user): status=302, ) + # event check is locked + event.check_locked = True + event.save() + resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk)) + assert '/manage/agendas/%s/bookings/%s/presence' % (agenda.pk, booking.pk) not in resp + assert '/manage/agendas/%s/bookings/%s/absence' % (agenda.pk, booking.pk) not in resp + assert '/manage/agendas/%s/bookings/%s/reset' % (agenda.pk, booking.pk) not in resp + app.post( + '/manage/agendas/%s/bookings/%s/absence' % (agenda.pk, booking.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + app.post( + '/manage/agendas/%s/bookings/%s/presence' % (agenda.pk, booking.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + app.post( + '/manage/agendas/%s/bookings/%s/reset' % (agenda.pk, booking.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + # now disable check update + event.check_locked = False + event.save() agenda.disable_check_update = True agenda.save() resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk)) @@ -2790,6 +2840,21 @@ def test_event_check_subscription(check_types, app, admin_user): params={'csrfmiddlewaretoken': token}, status=302, ) + Booking.objects.all().delete() + + # event check is locked + event.check_locked = True + event.save() + app.post( + '/manage/agendas/%s/subscriptions/%s/absence/%s' % (agenda.pk, subscription.pk, event.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + app.post( + '/manage/agendas/%s/subscriptions/%s/presence/%s' % (agenda.pk, subscription.pk, event.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) @mock.patch('chrono.manager.forms.get_agenda_check_types')