diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index aa005b59b7..3063037db7 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -639,6 +639,9 @@ class SubEvent(EventMixin, LoggedModel): data.update({v.property.name: v.value for v in self.meta_values.select_related('property').all()}) return data + def allow_delete(self): + return self.event.subevents.count() > 1 + def delete(self, *args, **kwargs): super().delete(*args, **kwargs) if self.event: diff --git a/src/pretix/control/views/subevents.py b/src/pretix/control/views/subevents.py index 9d974e8dbe..e2f8392d46 100644 --- a/src/pretix/control/views/subevents.py +++ b/src/pretix/control/views/subevents.py @@ -101,10 +101,13 @@ class SubEventDelete(EventPermissionRequiredMixin, DeleteView): self.object = self.get_object() success_url = self.get_success_url() - if self.get_object().orderposition_set.count() > 0: + if self.object.orderposition_set.count() > 0: messages.error(request, pgettext_lazy('subevent', 'A date can not be deleted if orders already have been ' 'placed.')) return HttpResponseRedirect(self.get_success_url()) + elif not self.object.allow_delete(): # checking if this is the last date in the event series + messages.error(request, pgettext_lazy('subevent', 'The last date of an event series can not be deleted.')) + return HttpResponseRedirect(self.get_success_url()) else: self.object.log_action('pretix.subevent.deleted', user=self.request.user) self.object.delete() diff --git a/src/tests/control/test_events.py b/src/tests/control/test_events.py index 0a625b1dda..f4e860dabf 100644 --- a/src/tests/control/test_events.py +++ b/src/tests/control/test_events.py @@ -8,7 +8,7 @@ from pytz import timezone from tests.base import SoupTest, extract_form_fields from pretix.base.models import ( - Event, Order, OrderPosition, Organizer, Team, User, + Event, Order, OrderPosition, Organizer, SubEvent, Team, User, ) from pretix.base.models.items import SubEventItem from pretix.testutils.mock import mocker_context @@ -594,6 +594,7 @@ class SubEventsTest(SoupTest): self.client.login(email='dummy@dummy.dummy', password='dummy') self.subevent1 = self.event1.subevents.create(name='SE1', date_from=now()) + self.subevent2 = self.event1.subevents.create(name='SE2', date_from=now()) def test_list(self): doc = self.get_doc('/control/event/ccc/30c3/subevents/') @@ -699,7 +700,11 @@ class SubEventsTest(SoupTest): assert doc.select("button") doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent1.pk, {}) assert doc.select(".alert-success") - assert not SubEventItem.objects.filter(pk=self.subevent1.pk).exists() + # deleting the second event + doc = self.post_doc('/control/event/ccc/30c3/subevents/%d/delete' % self.subevent2.pk, {}) + assert doc.select(".alert-danger") + assert SubEvent.objects.filter(pk=self.subevent2.pk).exists() + assert not SubEvent.objects.filter(pk=self.subevent1.pk).exists() def test_delete_with_orders(self): o = Order.objects.create(