api: allow changing bookings from date in recurring fillslots (#78921)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2023-08-10 15:02:52 +02:00
parent f371341d7d
commit 60f31525ee
3 changed files with 65 additions and 2 deletions

View File

@ -446,7 +446,7 @@ class AgendaOrSubscribedSlugsSerializer(AgendaOrSubscribedSlugsMixin, DateRangeM
class RecurringFillslotsQueryStringSerializer(AgendaOrSubscribedSlugsSerializer):
action = serializers.ChoiceField(required=True, choices=['update', 'book', 'unbook'])
action = serializers.ChoiceField(required=True, choices=['update', 'update-from-date', 'book', 'unbook'])
class RecurringEventsListSerializer(AgendaOrSubscribedSlugsSerializer):

View File

@ -1708,6 +1708,16 @@ class RecurringFillslots(APIView):
guardian_external_id,
)
events_to_unbook = self.get_events_to_unbook(agendas, events_to_book)
elif data['action'] == 'update-from-date':
events_to_book = self.get_event_recurrences(
agendas,
payload['slots'],
start_datetime,
end_datetime,
user_external_id,
guardian_external_id,
)
events_to_unbook = self.get_events_to_unbook(agendas, events_to_book, start_datetime)
elif data['action'] == 'book':
events_to_book = self.get_event_recurrences(
agendas,
@ -1870,7 +1880,7 @@ class RecurringFillslots(APIView):
return events
def get_events_to_unbook(self, agendas, events_to_book):
def get_events_to_unbook(self, agendas, events_to_book, start_datetime=None):
events_to_book_ids = set(events_to_book.values_list('pk', flat=True))
events_to_unbook = [
e
@ -1881,6 +1891,7 @@ class RecurringFillslots(APIView):
and e.pk not in events_to_book_ids
and (not agenda.minimal_booking_delay or e.start_datetime >= agenda.min_booking_datetime)
and (not agenda.maximal_booking_delay or e.start_datetime <= agenda.max_booking_datetime)
and (not start_datetime or e.start_datetime >= start_datetime)
]
return events_to_unbook

View File

@ -1283,6 +1283,58 @@ def test_recurring_events_api_fillslots_multiple_agendas(app, user):
]
@pytest.mark.freeze_time('2021-09-06 12:00')
def test_recurring_events_api_fillslots_update_from_date(app, user):
agenda = Agenda.objects.create(
label='Foo bar', kind='events', minimal_booking_delay=0, maximal_booking_delay=0
)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
label='Event',
start_datetime=now(),
recurrence_days=[1, 2, 4, 5], # Monday, Tuesday, Thursday, Friday
places=1,
waiting_list_places=1,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=28), # 4 weeks
)
event.create_all_recurrences()
app.authorization = ('Basic', ('john.doe', 'password'))
fillslots_url = '/api/agendas/recurring-events/fillslots/?agendas=foo-bar&'
params = {'user_external_id': 'user_id'}
# Book Monday and Thursday
params['slots'] = 'foo-bar@event:1,foo-bar@event:4'
resp = app.post_json(fillslots_url + 'action=book', params=params)
assert resp.json['booking_count'] == 8
assert resp.json['cancelled_booking_count'] == 0
bookings = Booking.objects.filter(cancellation_datetime__isnull=True)
assert [x.strftime('%A %d/%m') for x in bookings.values_list('event__start_datetime', flat=True)] == [
'Monday 06/09',
'Thursday 09/09',
'Monday 13/09',
'Thursday 16/09',
'Monday 20/09',
'Thursday 23/09',
'Monday 27/09',
'Thursday 30/09',
]
# Book only Friday from 20/09
params['slots'] = 'foo-bar@event:5'
resp = app.post_json(fillslots_url + 'action=update-from-date&date_start=2021-09-20', params=params)
assert resp.json['booking_count'] == 2
assert resp.json['cancelled_booking_count'] == 4
assert [x.strftime('%A %d/%m') for x in bookings.values_list('event__start_datetime', flat=True)] == [
'Monday 06/09',
'Thursday 09/09',
'Monday 13/09',
'Thursday 16/09',
'Friday 24/09',
'Friday 01/10',
]
@pytest.mark.freeze_time('2021-09-06 12:00')
def test_recurring_events_api_fillslots_multiple_agendas_queries(app, user):
events_type = EventsType.objects.create(label='Foo')