api: add event deletion (#59792)
This commit is contained in:
parent
5e4675f533
commit
e88da83b6d
|
@ -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()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue