api: add unbook action to recurring fillslots endpoint (#60255)

This commit is contained in:
Valentin Deniaud 2022-01-06 11:01:35 +01:00
parent 58ade5be61
commit 6b22764afd
3 changed files with 105 additions and 2 deletions

View File

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

View File

@ -1633,6 +1633,11 @@ class RecurringFillslots(APIView):
payload['slots'], start_datetime, end_datetime, user_external_id
)
events_to_unbook = []
elif data['action'] == 'unbook':
events_to_book = Event.objects.none()
events_to_unbook = self.get_event_recurrences(
payload['slots'], start_datetime, end_datetime, user_external_id
).values_list('pk', flat=True)
events_to_book = events_to_book.exclude(booking__user_external_id=user_external_id)

View File

@ -2404,6 +2404,90 @@ def test_recurring_events_api_fillslots_change_bookings(app, user, freezer):
assert Booking.objects.filter(user_external_id='user_id', event=normal_event).count() == 1
def test_recurring_events_api_unbook(app, user, freezer):
freezer.move_to('2021-09-06 12:00')
agenda = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
event = Event.objects.create(
label='Event',
start_datetime=now(),
recurrence_days=[0, 1, 3, 4], # Monday, Tuesday, Thursday, Friday
places=2,
waiting_list_places=1,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=364),
)
event.create_all_recurrences()
sunday_event = Event.objects.create(
label='Sunday Event',
start_datetime=now(),
recurrence_days=[6],
places=2,
waiting_list_places=1,
agenda=agenda,
recurrence_end_date=now() + datetime.timedelta(days=364),
)
sunday_event.create_all_recurrences()
app.authorization = ('Basic', ('john.doe', 'password'))
fillslots_url = '/api/agendas/recurring-events/fillslots/?agendas=%s' % agenda.slug
params = {'user_external_id': 'user_id'}
params['slots'] = 'foo-bar@event:0,foo-bar@event:3,foo-bar@sunday-event:6'
resp = app.post_json(fillslots_url + '&action=book', params=params)
assert resp.json['booking_count'] == 156
assert Booking.objects.count() == 156
assert Booking.objects.filter(event__primary_event=event).count() == 104
assert Booking.objects.filter(event__primary_event=sunday_event).count() == 52
params['slots'] = 'foo-bar@event:0'
resp = app.post_json(fillslots_url + '&action=unbook', params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 52
assert Booking.objects.count() == 104
assert Booking.objects.filter(event__primary_event=event).count() == 52
assert Booking.objects.filter(event__primary_event=sunday_event).count() == 52
params['slots'] = 'foo-bar@sunday-event:6'
resp = app.post_json(
fillslots_url + '&action=unbook&date_start=2022-01-01&date_end=2022-03-01', params=params
)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 9
assert Booking.objects.count() == 95
assert Booking.objects.filter(event__primary_event=event).count() == 52
assert Booking.objects.filter(event__primary_event=sunday_event).count() == 43
assert not Booking.objects.filter(
event__primary_event=sunday_event,
event__start_datetime__range=(
datetime.date(year=2022, month=1, day=1),
datetime.date(year=2022, month=3, day=1),
),
).exists()
freezer.move_to('2022-01-01 12:00')
# old bookings are not unbooked
params['slots'] = 'foo-bar@event:3'
resp = app.post_json(fillslots_url + '&action=unbook', params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 35
assert Booking.objects.count() == 60
assert Booking.objects.filter(event__primary_event=event).count() == 17
assert not Booking.objects.filter(
event__primary_event=event, event__start_datetime__gt=datetime.date(year=2022, month=1, day=1)
).exists()
assert Booking.objects.filter(event__primary_event=sunday_event).count() == 43
# unbooking when there are no bookings does nothing
params['user_external_id'] = 'user_id_2'
resp = app.post_json(fillslots_url + '&action=unbook', params=params)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 0
@pytest.mark.freeze_time('2021-09-06 12:00')
def test_recurring_events_api_fillslots_subscribed(app, user):
category = Category.objects.create(label='Category A')
@ -2559,12 +2643,26 @@ def test_recurring_events_api_fillslots_multiple_agendas(app, user):
assert Booking.objects.filter(event__primary_event=event_b).count() == 0
assert Booking.objects.filter(event__primary_event=event_c).count() == 8
# unbook last week bookings
params = {'user_external_id': 'user_id', 'slots': 'first-agenda@a:2,second-agenda@c:2'}
date_start_param = '&date_start=%s' % (end - datetime.timedelta(days=7)).strftime('%Y-%m-%d')
resp = app.post_json(
(fillslots_url % ('unbook', 'first-agenda,second-agenda')) + date_start_param, params=params
)
assert resp.json['booking_count'] == 0
assert resp.json['cancelled_booking_count'] == 2
assert Booking.objects.count() == 19
assert Booking.objects.filter(event__primary_event=event_a).count() == 12
assert Booking.objects.filter(event__primary_event=event_b).count() == 0
assert Booking.objects.filter(event__primary_event=event_c).count() == 7
# update bookings
params = {'user_external_id': 'user_id', 'slots': 'first-agenda@b:1'}
resp = app.post_json(fillslots_url % ('update', 'first-agenda,second-agenda'), params=params)
assert resp.json['booking_count'] == 5
assert resp.json['cancelled_booking_count'] == 21
assert resp.json['cancelled_booking_count'] == 19
assert Booking.objects.filter(event__primary_event=event_a).count() == 0
assert Booking.objects.filter(event__primary_event=event_b).count() == 5
assert Booking.objects.filter(event__primary_event=event_c).count() == 0