api: add event deletion (#59792)

This commit is contained in:
Valentin Deniaud 2021-12-22 15:13:22 +01:00
parent 5e4675f533
commit e88da83b6d
2 changed files with 87 additions and 0 deletions

View File

@ -2233,6 +2233,21 @@ class Events(APIView):
event = serializer.save()
return Response({'err': 0, 'data': get_event_detail(request, event)})
def delete(self, request, agenda_identifier, event_identifier):
event = self.get_object(agenda_identifier, event_identifier)
cannot_delete = bool(
event.booking_set.filter(cancellation_datetime__isnull=True).exists()
and event.start_datetime > now()
or event.has_recurrences_booked()
)
if cannot_delete:
raise APIError(_('This cannot be removed as there are bookings for a future date.'))
event.delete()
return Response({'err': 0})
events = Events.as_view()

View File

@ -519,3 +519,75 @@ def test_update_event(app, user):
assert not resp.json['err']
event = Event.objects.filter(agenda=agenda).get(slug=event.slug)
assert event.recurrences.count() == 5
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_event(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
)
# no authentication
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug), status=401)
assert Event.objects.count() == 1
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert not Event.objects.exists()
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_event_forbidden(app, user, freezer):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
)
booking = Booking.objects.create(event=event)
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 1
assert 'This cannot be removed' in resp.json['err_desc']
freezer.move_to('2021-11-10 10:00')
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert not Event.objects.exists()
event = Event.objects.create(
slug='event', start_datetime=now() + datetime.timedelta(days=5), places=1, agenda=agenda
)
booking = Booking.objects.create(event=event)
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 1
booking.cancellation_datetime = now()
booking.save()
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert not Event.objects.exists()
@pytest.mark.freeze_time('2021-11-01 10:00')
def test_delete_recurring_event_forbidden(app, user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
start_datetime = now() + datetime.timedelta(days=10)
event = Event.objects.create(
start_datetime=start_datetime, places=10, agenda=agenda, recurrence_days=[start_datetime.weekday()]
)
event_recurrence = event.get_or_create_event_recurrence(event.start_datetime)
booking = Booking.objects.create(event=event_recurrence)
app.authorization = ('Basic', ('john.doe', 'password'))
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 1
assert 'This cannot be removed' in resp.json['err_desc']
booking.cancellation_datetime = now()
booking.save()
resp = app.delete('/api/agenda/%s/event/%s/' % (agenda.slug, event.slug))
assert resp.json['err'] == 0
assert not Event.objects.exists()