diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 10dda9c615..2a095a9a86 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -1748,7 +1748,8 @@ class OrderPosition(ObjectWithAnswers, Versionable): ) item = VersionedForeignKey( Item, - verbose_name=_("Item") + verbose_name=_("Item"), + related_name='positions' ) variation = VersionedForeignKey( ItemVariation, diff --git a/src/pretix/control/templates/pretixcontrol/item/delete.html b/src/pretix/control/templates/pretixcontrol/item/delete.html new file mode 100644 index 0000000000..0dce6c837d --- /dev/null +++ b/src/pretix/control/templates/pretixcontrol/item/delete.html @@ -0,0 +1,33 @@ +{% extends "pretixcontrol/items/base.html" %} +{% load i18n %} +{% load bootstrap3 %} +{% block title %}{% trans "Delete product" %}{% endblock %} +{% block inside %} +

{% trans "Delete product" %}

+ {% if not possible and not item.active %} +

{% blocktrans %}You cannot delete the product {{ item }} because it already has been ordered.{% endblocktrans %}

+
+ + {% trans "Cancel" %} + +
+
+ {% else %} +
+ {% csrf_token %} + {% if possible %} +

{% blocktrans %}Are you sure you want to delete the product {{ item }}?{% endblocktrans %}

+ {% else %} +

{% blocktrans %}You cannot delete the product {{ item }} because it already has been ordered, but you can deactive it.{% endblocktrans %}

+ {% endif %} +
+ + {% trans "Cancel" %} + + +
+
+ {% endif %} +{% endblock %} diff --git a/src/pretix/control/templates/pretixcontrol/items/index.html b/src/pretix/control/templates/pretixcontrol/items/index.html index 4dcd6b6e07..d7bd1d4b35 100644 --- a/src/pretix/control/templates/pretixcontrol/items/index.html +++ b/src/pretix/control/templates/pretixcontrol/items/index.html @@ -21,6 +21,7 @@ {% trans "Product name" %} {% trans "Category" %} + @@ -35,6 +36,7 @@ + {% endfor %} {% endfor %} diff --git a/src/pretix/control/templates/pretixcontrol/items/property_delete.html b/src/pretix/control/templates/pretixcontrol/items/property_delete.html index a4c72c9cb2..23275d6e24 100644 --- a/src/pretix/control/templates/pretixcontrol/items/property_delete.html +++ b/src/pretix/control/templates/pretixcontrol/items/property_delete.html @@ -14,7 +14,7 @@ {% else %}
{% csrf_token %} -

{% blocktrans %}Are you sure you want to the property {{ property }}?{% endblocktrans %}

+

{% blocktrans %}Are you sure you want to delete the property {{ property }}?{% endblocktrans %}

{% trans "Cancel" %} diff --git a/src/pretix/control/templates/pretixcontrol/items/question_delete.html b/src/pretix/control/templates/pretixcontrol/items/question_delete.html index 11fae37822..36aaf3e88a 100644 --- a/src/pretix/control/templates/pretixcontrol/items/question_delete.html +++ b/src/pretix/control/templates/pretixcontrol/items/question_delete.html @@ -6,7 +6,7 @@

{% trans "Delete question" %}

{% csrf_token %} -

{% blocktrans %}Are you sure you want to the question {{ question }}?{% endblocktrans %}

+

{% blocktrans %}Are you sure you want to delete the question {{ question }}?{% endblocktrans %}

{% if dependent|length > 0 %}

{% blocktrans %}All answers to the question given by the buyers of the following products will be lost.{% endblocktrans %}

{% for item in dependent %} diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 6ac6ea7c85..9652dac757 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -32,6 +32,7 @@ urlpatterns = [ name='event.item.restrictions'), url(r'^items/(?P[0-9a-f-]+)/up$', item.item_move_up, name='event.items.up'), url(r'^items/(?P[0-9a-f-]+)/down$', item.item_move_down, name='event.items.down'), + url(r'^items/(?P[0-9a-f-]+)/delete$', item.ItemDelete.as_view(), name='event.items.delete'), url(r'^categories/$', item.CategoryList.as_view(), name='event.items.categories'), url(r'^categories/(?P[0-9a-f-]+)/delete$', item.CategoryDelete.as_view(), name='event.items.categories.delete'), diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 7b74d63a51..6533541ceb 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -894,3 +894,47 @@ class ItemRestrictions(ItemDetailMixin, EventPermissionRequiredMixin, TemplateVi 'event': self.request.event.slug, 'item': self.object.identity }) + + +class ItemDelete(EventPermissionRequiredMixin, DeleteView): + model = Item + template_name = 'pretixcontrol/item/delete.html' + permission = 'can_change_items' + context_object_name = 'item' + + def get_context_data(self, *args, **kwargs) -> dict: + context = super().get_context_data(*args, **kwargs) + context['possible'] = self.is_allowed() + return context + + def is_allowed(self) -> bool: + return not self.get_object().positions.current.exists() + + def get_object(self, queryset=None) -> Property: + if not hasattr(self, 'object') or not self.object: + try: + self.object = self.request.event.items.current.get( + identity=self.kwargs['item'] + ) + except Property.DoesNotExist: + raise Http404(_("The requested product does not exist.")) + return self.object + + def delete(self, request, *args, **kwargs): + success_url = self.get_success_url() + if self.is_allowed(): + self.get_object().delete() + messages.success(request, _('The selected product has been deleted.')) + return HttpResponseRedirect(success_url) + else: + o = self.get_object() + o.active = False + o.save() + messages.success(request, _('The selected product has been deactivated.')) + return HttpResponseRedirect(success_url) + + def get_success_url(self) -> str: + return reverse('control:event.items', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + })