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 %}
-
{% 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')