From ff7d4683a6e2dc004d70ab9174aac77d7748117d Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 12 Mar 2015 23:35:55 +0100 Subject: [PATCH] Cancel orders (fixing #24) --- .../templates/pretixpresale/event/order.html | 8 +-- .../pretixpresale/event/order_cancel.html | 32 ++++++++++++ src/pretix/presale/urls.py | 2 + src/pretix/presale/views/order.py | 51 ++++++++++++++++--- 4 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 src/pretix/presale/templates/pretixpresale/event/order_cancel.html diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index 51e01fa77..c0dba2b6e 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -47,10 +47,10 @@ {% if order.status == "n" %}
-
- {% csrf_token %} - -
+

+ {% trans "Cancel order" %} +

{% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/event/order_cancel.html b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html new file mode 100644 index 000000000..8a0aafc38 --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/event/order_cancel.html @@ -0,0 +1,32 @@ +{% extends "pretixpresale/event/base.html" %} +{% load i18n %} +{% block title %}{% trans "Cancel order" %}{% endblock %} +{% block content %} +

+ {% blocktrans trimmed with code=order.code %} + Cancel order: {{ code }} + {% endblocktrans %} +

+

{% blocktrans trimmed %} + Do you really want to cancel this order? You cannot revert this action. + {% endblocktrans %}

+ +
+ {% csrf_token %} +
+ +
+ +
+
+
+
+ +{% endblock %} diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 45c29ac27..c1d29d777 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -21,6 +21,8 @@ urlpatterns = patterns( name='event.checkout.confirm'), url(r'^order/(?P[^/]+)/$', pretix.presale.views.order.OrderDetails.as_view(), name='event.order'), + url(r'^order/(?P[^/]+)/cancel$', pretix.presale.views.order.OrderCancel.as_view(), + name='event.order.cancel'), url(r'^login$', pretix.presale.views.event.EventLogin.as_view(), name='event.checkout.login'), ) )), diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index bcbca5502..bdb0352f9 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -1,15 +1,16 @@ from itertools import groupby -from django.db.models import Q +from django.core.urlresolvers import reverse +from django.shortcuts import redirect +from django.utils.translation import ugettext_lazy as _ from django.utils.functional import cached_property from django.views.generic import TemplateView -from django.http import HttpResponseNotFound +from django.http import HttpResponseNotFound, HttpResponseForbidden from pretix.base.models import Order, OrderPosition from pretix.base.signals import register_payment_providers from pretix.presale.views import EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin -class OrderDetails(EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin, TemplateView): - template_name = "pretixpresale/event/order.html" +class OrderDetailMixin: @cached_property def order(self): @@ -18,14 +19,19 @@ class OrderDetails(EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin, Te user=self.request.user, event=self.request.event, code=self.kwargs['order'], - ) + ) except Order.DoesNotExist: return None + +class OrderDetails(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin, + CartDisplayMixin, TemplateView): + template_name = "pretixpresale/event/order.html" + def get(self, request, *args, **kwargs): self.kwargs = kwargs if not self.order: - return HttpResponseNotFound + return HttpResponseNotFound(_('Unknown order code or order does belong to another user.')) return super().get(request, *args, **kwargs) def itemlist_cartlike(self): @@ -88,3 +94,36 @@ class OrderDetails(EventViewMixin, EventLoginRequiredMixin, CartDisplayMixin, Te elif self.order.status == Order.STATUS_PAID: ctx['payment'] = self.payment_provider.order_paid_render(self.request, self.order) return ctx + + +class OrderCancel(EventViewMixin, EventLoginRequiredMixin, OrderDetailMixin, + TemplateView): + template_name = "pretixpresale/event/order_cancel.html" + + def post(self, request, *args, **kwargs): + self.kwargs = kwargs + if not self.order: + return HttpResponseNotFound(_('Unknown order code or order does belong to another user.')) + if self.order.status != Order.STATUS_PENDING: + return HttpResponseForbidden(_('You cannot cancel this order')) + order = self.order.clone() + order.status = Order.STATUS_CANCELLED + order.save() + return redirect(reverse('presale:event.order', kwargs={ + 'event': self.request.event.slug, + 'organizer': self.request.event.organizer.slug, + 'order': order.code, + })) + + def get(self, request, *args, **kwargs): + self.kwargs = kwargs + if not self.order: + return HttpResponseNotFound(_('Unknown order code or order does belong to another user.')) + if self.order.status != Order.STATUS_PENDING: + return HttpResponseForbidden(_('You cannot cancel this order')) + return super().get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + ctx['order'] = self.order + return ctx