From 203e4d260dcc698c7a291adf217a4c5a4188a8f9 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Wed, 4 Aug 2021 12:27:05 +0200 Subject: [PATCH 2/2] agendas: propagate check status to secondary bookings (#55900) --- chrono/agendas/models.py | 14 +++++++++---- chrono/manager/views.py | 1 + tests/manager/test_event.py | 40 +++++++++++++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index 5ad7b13..68afb92 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1811,14 +1811,20 @@ class Booking(models.Model): def mark_user_absence(self, reason=None): self.user_absence_reason = reason self.user_was_present = False - self.save() - self.event.set_is_checked() + with transaction.atomic(): + self.secondary_booking_set.update(user_absence_reason=reason) + self.secondary_booking_set.update(user_was_present=False) + self.save() + self.event.set_is_checked() def mark_user_presence(self): self.user_absence_reason = '' self.user_was_present = True - self.save() - self.event.set_is_checked() + with transaction.atomic(): + self.secondary_booking_set.update(user_absence_reason='') + self.secondary_booking_set.update(user_was_present=True) + self.save() + self.event.set_is_checked() def get_user_block(self): template_vars = Context(settings.TEMPLATE_VARS) diff --git a/chrono/manager/views.py b/chrono/manager/views.py index 12befea..8fcf3bc 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -2805,6 +2805,7 @@ class BookingCheckMixin: event__cancelled=False, cancellation_datetime__isnull=True, in_waiting_list=False, + primary_booking__isnull=True, ) def response(self, request, booking): diff --git a/tests/manager/test_event.py b/tests/manager/test_event.py index bc68326..c99d292 100644 --- a/tests/manager/test_event.py +++ b/tests/manager/test_event.py @@ -1090,6 +1090,9 @@ def test_event_check(app, admin_user): booking7 = Booking.objects.create( event=event, user_first_name='User', user_last_name='Waiting', in_waiting_list=True ) + booking8 = Booking.objects.create( + event=event, user_first_name='User', user_last_name='Secondary', primary_booking=booking1 + ) login(app) # event not in past @@ -1108,10 +1111,10 @@ def test_event_check(app, admin_user): app.get('/manage/agendas/%s/events/%s/check' % (agenda2.pk, event.pk), status=404) resp = resp.click('Check') - assert 'Bookings (5/10)' in resp + assert 'Bookings (6/10)' in resp assert 'Waiting List (1/5)' in resp assert ( - resp.text.index('Bookings (5/10)') + resp.text.index('Bookings (6/10)') < resp.text.index('User 01') < resp.text.index('User 05') < resp.text.index('User 17') @@ -1153,6 +1156,18 @@ def test_event_check(app, admin_user): status=404, ) + # secondary booking + app.post( + '/manage/agendas/%s/bookings/%s/presence' % (agenda.pk, booking8.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + app.post( + '/manage/agendas/%s/bookings/%s/absence' % (agenda.pk, booking8.pk), + params={'csrfmiddlewaretoken': token}, + status=404, + ) + # unknown agenda app.post( '/manage/agendas/%s/bookings/%s/presence' % (0, booking1.pk), @@ -1321,6 +1336,9 @@ def test_event_check_booking(app, admin_user): agenda=agenda, ) booking = Booking.objects.create(event=event, user_first_name='User', user_last_name='42') + secondary_booking = Booking.objects.create( + event=event, user_first_name='User', user_last_name='42', primary_booking=booking + ) assert agenda.mark_event_checked_auto is False login(app) @@ -1342,6 +1360,9 @@ def test_event_check_booking(app, admin_user): booking.refresh_from_db() assert booking.user_was_present is True assert booking.user_absence_reason == '' + secondary_booking.refresh_from_db() + assert secondary_booking.user_was_present is True + assert secondary_booking.user_absence_reason == '' event.refresh_from_db() assert event.checked is False @@ -1359,6 +1380,9 @@ def test_event_check_booking(app, admin_user): booking.refresh_from_db() assert booking.user_was_present is False assert booking.user_absence_reason == '' + secondary_booking.refresh_from_db() + assert secondary_booking.user_was_present is False + assert secondary_booking.user_absence_reason == '' event.refresh_from_db() assert event.checked is True @@ -1380,6 +1404,9 @@ def test_event_check_booking(app, admin_user): booking.refresh_from_db() assert booking.user_was_present is False assert booking.user_absence_reason == 'Foo reason' + secondary_booking.refresh_from_db() + assert secondary_booking.user_was_present is False + assert secondary_booking.user_absence_reason == 'Foo reason' # set as present app.post( @@ -1389,6 +1416,9 @@ def test_event_check_booking(app, admin_user): booking.refresh_from_db() assert booking.user_was_present is True assert booking.user_absence_reason == '' + secondary_booking.refresh_from_db() + assert secondary_booking.user_was_present is True + assert secondary_booking.user_absence_reason == '' # mark the event as checked event.checked = True @@ -1504,6 +1534,9 @@ def test_event_check_all_bookings(app, admin_user): assert '/manage/agendas/%s/events/%s/absence' % (agenda.pk, event.pk) not in resp booking2 = Booking.objects.create(event=event, user_first_name='User', user_last_name='35') + secondary_booking = Booking.objects.create( + event=event, user_first_name='User', user_last_name='35', primary_booking=booking2 + ) resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk)) assert 'Mark all bookings without status' in resp assert '/manage/agendas/%s/events/%s/presence' % (agenda.pk, event.pk) in resp @@ -1518,6 +1551,9 @@ def test_event_check_all_bookings(app, admin_user): booking2.refresh_from_db() assert booking2.user_was_present is True assert booking2.user_absence_reason == '' + secondary_booking.refresh_from_db() + assert secondary_booking.user_was_present is True + assert secondary_booking.user_absence_reason == '' event.refresh_from_db() assert event.checked is True -- 2.20.1