Fix #634 -- Do not allow deleting the last date of an event series (#675)

* Checking for the last date in the event series before deleting a date. Last date in a event series should never be delted.

* Adding check to ensure that last date in a event series is not deleted. Editing unit test around deleting subevent to assert on alert-danger

* Increasing the scope of test_delete. We are now creating 2 subevents and testing deleting one and ensuring that the last one is not deleted

* Fixing alert text. Removing a redundant if condition for checking subevent count

* Adding assert for second event to ensure its not deleted

* Minor fixes and rebase
This commit is contained in:
Aiman Parvaiz
2018-01-14 04:54:22 -08:00
committed by Raphael Michel
parent 50575d45c1
commit dd42037f21
3 changed files with 14 additions and 3 deletions

View File

@@ -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:

View File

@@ -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()

View File

@@ -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(