From 0a5347c08b5722d83260dd398f57d6d35519fb4c Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 5 Nov 2018 10:55:06 +0100 Subject: [PATCH] Allow to delete organizers --- src/pretix/base/models/event.py | 10 ++-- src/pretix/base/models/organizer.py | 14 +++++ src/pretix/control/forms/organizer.py | 23 ++++++++ src/pretix/control/logdisplay.py | 1 + .../pretixcontrol/organizers/base.html | 6 +++ .../pretixcontrol/organizers/delete.html | 45 ++++++++++++++++ src/pretix/control/urls.py | 1 + src/pretix/control/views/organizer.py | 52 +++++++++++++++++-- 8 files changed, 143 insertions(+), 9 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/organizers/delete.html diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 3498f13f2..099d13a8b 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -282,10 +282,10 @@ class Event(EventMixin, LoggedModel): if not really: raise TypeError("Pass really=True as a parameter.") - OrderPosition.objects.all().delete(order__event=self) - OrderFee.objects.all().delete(order__event=self) - OrderPayment.objects.all().delete(order__event=self) - OrderRefund.objects.all().delete(order__event=self) + OrderPosition.objects.filter(order__event=self).delete() + OrderFee.objects.filter(order__event=self).delete() + OrderPayment.objects.filter(order__event=self).delete() + OrderRefund.objects.filter(order__event=self).delete() self.orders.all().delete() def save(self, *args, **kwargs): @@ -301,7 +301,7 @@ class Event(EventMixin, LoggedModel): return [] return self.plugins.split(",") - def get_cache(self) -> "pretix.base.cache.ObjectRelatedCache": + def get_cache(self): """ Returns an :py:class:`ObjectRelatedCache` object. This behaves equivalent to Django's built-in cache backends, but puts you into an isolated environment for diff --git a/src/pretix/base/models/organizer.py b/src/pretix/base/models/organizer.py index a8b5e23e7..af4e60a05 100644 --- a/src/pretix/base/models/organizer.py +++ b/src/pretix/base/models/organizer.py @@ -82,6 +82,20 @@ class Organizer(LoggedModel): return ObjectRelatedCache(self) + def allow_delete(self): + from . import Order, Invoice + return ( + not Order.objects.filter(event__organizer=self).exists() and + not Invoice.objects.filter(event__organizer=self).exists() and + not self.devices.exists() + ) + + def delete_sub_objects(self): + for e in self.events.all(): + e.delete_sub_objects() + e.delete() + self.teams.all().delete() + def generate_invite_token(): return get_random_string(length=32, allowed_chars=string.ascii_lowercase + string.digits) diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index cee791c72..6a8a8b146 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -31,6 +31,29 @@ class OrganizerForm(I18nModelForm): return slug +class OrganizerDeleteForm(forms.Form): + error_messages = { + 'slug_wrong': _("The slug you entered was not correct."), + } + slug = forms.CharField( + max_length=255, + label=_("Event slug"), + ) + + def __init__(self, *args, **kwargs): + self.organizer = kwargs.pop('organizer') + super().__init__(*args, **kwargs) + + def clean_slug(self): + slug = self.cleaned_data.get('slug') + if slug != self.organizer.slug: + raise forms.ValidationError( + self.error_messages['slug_wrong'], + code='slug_wrong', + ) + return slug + + class OrganizerUpdateForm(OrganizerForm): def __init__(self, *args, **kwargs): diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index b1d58f276..c006883bf 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -215,6 +215,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs): 'pretix.user.settings.notifications.enabled': _('Notifications have been enabled.'), 'pretix.user.settings.notifications.disabled': _('Notifications have been disabled.'), 'pretix.user.settings.notifications.changed': _('Your notification settings have been changed.'), + 'pretix.organizer.deleted': _('The organizer "{name}" has been deleted.'), 'pretix.user.oauth.authorized': _('The application "{application_name}" has been authorized to access your ' 'account.'), 'pretix.control.auth.user.forgot_password.mail_sent': _('Password reset mail sent.'), diff --git a/src/pretix/control/templates/pretixcontrol/organizers/base.html b/src/pretix/control/templates/pretixcontrol/organizers/base.html index 7a67d8f70..e4dfc1fb2 100644 --- a/src/pretix/control/templates/pretixcontrol/organizers/base.html +++ b/src/pretix/control/templates/pretixcontrol/organizers/base.html @@ -12,6 +12,12 @@ {% trans "Edit" %} {% endif %} + {% if request.user.is_staff and staff_session %} + + + + {% endif %}