From 8875a6328f54418309b19d92eb670038f83cd907 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sat, 14 Mar 2015 13:55:26 +0100 Subject: [PATCH] Overview over user's orders --- .../migrations/0019_auto_20150314_1247.py | 26 ++++++++++ src/pretix/base/models.py | 6 ++- .../static/pretixpresale/less/main.less | 8 ++++ .../templates/pretixpresale/event/base.html | 18 ++++++- .../pretixpresale/event/checkout_confirm.html | 10 +++- .../event/fragment_order_status.html | 13 +++++ .../templates/pretixpresale/event/order.html | 18 +++---- .../templates/pretixpresale/event/orders.html | 47 +++++++++++++++++++ src/pretix/presale/urls.py | 2 + src/pretix/presale/views/event.py | 28 +++++++++-- 10 files changed, 155 insertions(+), 21 deletions(-) create mode 100644 src/pretix/base/migrations/0019_auto_20150314_1247.py create mode 100644 src/pretix/presale/templates/pretixpresale/event/fragment_order_status.html create mode 100644 src/pretix/presale/templates/pretixpresale/event/orders.html diff --git a/src/pretix/base/migrations/0019_auto_20150314_1247.py b/src/pretix/base/migrations/0019_auto_20150314_1247.py new file mode 100644 index 000000000..9c11f6cd2 --- /dev/null +++ b/src/pretix/base/migrations/0019_auto_20150314_1247.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import versions.models +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0018_auto_20150314_1232'), + ] + + operations = [ + migrations.AlterField( + model_name='order', + name='event', + field=versions.models.VersionedForeignKey(to='pretixbase.Event', related_name='orders', verbose_name='Event'), + ), + migrations.AlterField( + model_name='order', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, blank=True, related_name='orders', null=True, verbose_name='User'), + ), + ] diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 3b5d9f737..fa4d1eb21 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -1264,11 +1264,13 @@ class Order(Versionable): ) event = VersionedForeignKey( Event, - verbose_name=_("Event") + verbose_name=_("Event"), + related_name="orders" ) user = models.ForeignKey( User, null=True, blank=True, - verbose_name=_("User") + verbose_name=_("User"), + related_name="orders" ) datetime = models.DateTimeField( verbose_name=_("Date") diff --git a/src/pretix/presale/static/pretixpresale/less/main.less b/src/pretix/presale/static/pretixpresale/less/main.less index 640417ec1..c5c342be5 100644 --- a/src/pretix/presale/static/pretixpresale/less/main.less +++ b/src/pretix/presale/static/pretixpresale/less/main.less @@ -10,3 +10,11 @@ footer { padding: 10px 0; font-size: 11px; } +.page-header { + position: relative; +} +.page-header .loginbox { + position: absolute; + right: 0; + bottom: 20px; +} \ No newline at end of file diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index de4590c1d..a94d056c0 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -17,7 +17,23 @@
-

{{ event.name }} {{ event.date_from|date }}{% if event.show_date_to %} – {{ event.date_to|date }}{% endif %}

+ {% if messages %} {% for message in messages %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html index 603027a5c..632c67711 100644 --- a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html +++ b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html @@ -10,7 +10,10 @@

{% trans "Your cart" %} @@ -37,7 +40,10 @@

{% trans "Payment" %} diff --git a/src/pretix/presale/templates/pretixpresale/event/fragment_order_status.html b/src/pretix/presale/templates/pretixpresale/event/fragment_order_status.html new file mode 100644 index 000000000..02c53427d --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/event/fragment_order_status.html @@ -0,0 +1,13 @@ +{% load i18n %} +{% load bootstrap3 %} +{% if order.status == "n" %} + {% trans "Payment pending" %} +{% elif order.status == "p" %} + {% trans "Paid" %} +{% elif order.status == "e" %} + {% trans "Payment pending" %} +{% elif order.status == "c" %} + {% trans "Cancelled" %} +{% elif order.status == "r" %} + {% trans "Refunded" %} +{% endif %} diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html index 100e011fc..c3b42a05c 100644 --- a/src/pretix/presale/templates/pretixpresale/event/order.html +++ b/src/pretix/presale/templates/pretixpresale/event/order.html @@ -7,17 +7,7 @@ {% blocktrans trimmed with code=order.code %} Your order: {{ code }} {% endblocktrans %} - {% if order.status == "n" %} - {% trans "Payment pending" %} - {% elif order.status == "p" %} - {% trans "Paid" %} - {% elif order.status == "e" %} - {% trans "Payment pending" %} - {% elif order.status == "c" %} - {% trans "Cancelled" %} - {% elif order.status == "r" %} - {% trans "Refunded" %} - {% endif %} + {% include "pretixpresale/event/fragment_order_status.html" with order=order class="pull-right" %}

{% if order.status == "n" %}
@@ -39,6 +29,7 @@ {% if order.can_modify_answers %} @@ -56,7 +47,10 @@

{% trans "Cancel order" %} + class="btn btn-danger"> + + {% trans "Cancel order" %} +

diff --git a/src/pretix/presale/templates/pretixpresale/event/orders.html b/src/pretix/presale/templates/pretixpresale/event/orders.html new file mode 100644 index 000000000..1ff3a0b2f --- /dev/null +++ b/src/pretix/presale/templates/pretixpresale/event/orders.html @@ -0,0 +1,47 @@ +{% extends "pretixpresale/event/base.html" %} +{% load i18n %} +{% block title %}{% trans "Your orders" %}{% endblock %} + +{% block content %} +

{% trans "Welcome back!" %}

+
+
+

{% trans "Your orders" %}

+
+
+ + + + + + + + + + {% for order in orders %} + + + + + + + + {% empty %} + + + + {% endfor %} + +
{% trans "Order code" %}{% trans "Date" %}{% trans "Total" %}{% trans "Status" %}
{{ order.code }}{{ order.datetime|date }}{{ event.currency }} {{ order.total|floatformat:2 }}{% include "pretixpresale/event/fragment_order_status.html" with order=order %} + {% trans "View details" %} +
+ {% trans "You did not yet place any orders." %} +
+ + + {% trans "Place new order" %} + +
+
+{% endblock %} \ No newline at end of file diff --git a/src/pretix/presale/urls.py b/src/pretix/presale/urls.py index 11853e783..ce17de4a4 100644 --- a/src/pretix/presale/urls.py +++ b/src/pretix/presale/urls.py @@ -23,5 +23,7 @@ urlpatterns = [ url(r'^order/(?P[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(), name='event.order.modify'), url(r'^login$', pretix.presale.views.event.EventLogin.as_view(), name='event.checkout.login'), + url(r'^logout$', pretix.presale.views.event.EventLogout.as_view(), name='event.logout'), + url(r'^orders$', pretix.presale.views.event.EventOrders.as_view(), name='event.orders'), ])), ] diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py index b54e7cd5f..689c0e77c 100644 --- a/src/pretix/presale/views/event.py +++ b/src/pretix/presale/views/event.py @@ -1,5 +1,5 @@ import json -from django.contrib.auth import authenticate +from django.contrib.auth import authenticate, logout from django.core.urlresolvers import reverse from django.core.validators import RegexValidator from django.db.models import Count @@ -8,12 +8,12 @@ from django.shortcuts import redirect from django.utils.functional import cached_property from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm from django.contrib.auth import login -from django.views.generic import TemplateView +from django.views.generic import TemplateView, View from django.utils.translation import ugettext_lazy as _ from django.conf import settings from pretix.base.models import User -from pretix.presale.views import EventViewMixin, CartDisplayMixin +from pretix.presale.views import EventViewMixin, CartDisplayMixin, EventLoginRequiredMixin from pretix.presale.views.cart import CartAdd @@ -222,7 +222,7 @@ class EventLogin(EventViewMixin, TemplateView): return redirect(self.request.GET.get('next')) else: return redirect(reverse( - 'presale:event.index', kwargs={ + 'presale:event.orders', kwargs={ 'organizer': self.request.event.organizer.slug, 'event': self.request.event.slug, } @@ -290,3 +290,23 @@ class EventLogin(EventViewMixin, TemplateView): context['global_registration_form'] = self.global_registration_form context['local_registration_form'] = self.local_registration_form return context + + +class EventLogout(EventViewMixin, View): + def get(self, request, *args, **kwargs): + logout(request) + return redirect(reverse( + 'presale:event.index', kwargs={ + 'organizer': self.request.event.organizer.slug, + 'event': self.request.event.slug, + } + )) + + +class EventOrders(EventLoginRequiredMixin, EventViewMixin, TemplateView): + template_name = 'pretixpresale/event/orders.html' + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context['orders'] = self.request.user.orders.all() + return context