api: add unbook action to recurring fillslots endpoint (#60255)
This commit is contained in:
parent
58ade5be61
commit
6b22764afd
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue