From 478d6af248c5fb2b4eac8e0069d02a5b2e127580 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 13 Aug 2015 18:27:19 +0200 Subject: [PATCH] Fixed #87 -- Added deletion of products --- src/pretix/base/models.py | 3 +- .../templates/pretixcontrol/item/delete.html | 33 ++++++++++++++ .../templates/pretixcontrol/items/index.html | 2 + .../pretixcontrol/items/property_delete.html | 2 +- .../pretixcontrol/items/question_delete.html | 2 +- src/pretix/control/urls.py | 1 + src/pretix/control/views/item.py | 44 +++++++++++++++++++ 7 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 src/pretix/control/templates/pretixcontrol/item/delete.html diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 10dda9c61..2a095a9a8 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 000000000..0dce6c837 --- /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 4dcd6b6e0..d7bd1d4b3 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 a4c72c9cb..23275d6e2 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 11fae3782..36aaf3e88 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 6ac6ea7c8..9652dac75 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 7b74d63a5..6533541ce 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, + })