api: allow changing bookings from date in recurring fillslots (#78921)
gitea/chrono/pipeline/head This commit looks good
Details
gitea/chrono/pipeline/head This commit looks good
Details
This commit is contained in:
parent
f371341d7d
commit
60f31525ee
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue