Overview over user's orders

This commit is contained in:
Raphael Michel
2015-03-14 13:55:26 +01:00
parent 197fbbd180
commit 8875a6328f
10 changed files with 155 additions and 21 deletions

View File

@@ -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'),
),
]

View File

@@ -1264,11 +1264,13 @@ class Order(Versionable):
) )
event = VersionedForeignKey( event = VersionedForeignKey(
Event, Event,
verbose_name=_("Event") verbose_name=_("Event"),
related_name="orders"
) )
user = models.ForeignKey( user = models.ForeignKey(
User, null=True, blank=True, User, null=True, blank=True,
verbose_name=_("User") verbose_name=_("User"),
related_name="orders"
) )
datetime = models.DateTimeField( datetime = models.DateTimeField(
verbose_name=_("Date") verbose_name=_("Date")

View File

@@ -10,3 +10,11 @@ footer {
padding: 10px 0; padding: 10px 0;
font-size: 11px; font-size: 11px;
} }
.page-header {
position: relative;
}
.page-header .loginbox {
position: absolute;
right: 0;
bottom: 20px;
}

View File

@@ -17,7 +17,23 @@
</head> </head>
<body> <body>
<div class="container event"> <div class="container event">
<h1>{{ event.name }} <small>{{ event.date_from|date }}{% if event.show_date_to %} {{ event.date_to|date }}{% endif %}</small></h1> <div class="page-header">
<div class="pull-right loginbox">
{% if request.user.is_authenticated %}
{% blocktrans trimmed with name=request.user.identifier %}
Hello, {{ name }}!
{% endblocktrans %} &middot;
<a href="{% url "presale:event.orders" event=request.event.slug organizer=request.event.organizer.slug %}">
{% trans "My orders" %}</a> &middot;
<a href="{% url "presale:event.logout" event=request.event.slug organizer=request.event.organizer.slug %}">
{% trans "Logout" %}</a>
{% else %}
<a href="{% url "presale:event.checkout.login" event=request.event.slug organizer=request.event.organizer.slug %}">
{% trans "Login" %}</a>
{% endif %}
</div>
<h1>{{ event.name }} <small>{{ event.date_from|date }}{% if event.show_date_to %} {{ event.date_to|date }}{% endif %}</small></h1>
</div>
{% if messages %} {% if messages %}
{% for message in messages %} {% for message in messages %}
<div class="alert {{ message.tags }}"> <div class="alert {{ message.tags }}">

View File

@@ -10,7 +10,10 @@
<div class="panel panel-primary cart"> <div class="panel panel-primary cart">
<div class="panel-heading"> <div class="panel-heading">
<div class="pull-right"> <div class="pull-right">
<a href="{% url "presale:event.index" organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Modify" %}</a> <a href="{% url "presale:event.index" organizer=request.event.organizer.slug event=request.event.slug %}">
<span class="fa fa-edit"></span>
{% trans "Modify" %}
</a>
</div> </div>
<h3 class="panel-title"> <h3 class="panel-title">
{% trans "Your cart" %} {% trans "Your cart" %}
@@ -37,7 +40,10 @@
<div class="panel panel-primary"> <div class="panel panel-primary">
<div class="panel-heading"> <div class="panel-heading">
<div class="pull-right"> <div class="pull-right">
<a href="{% url "presale:event.checkout.payment" organizer=request.event.organizer.slug event=request.event.slug %}">{% trans "Modify" %}</a> <a href="{% url "presale:event.checkout.payment" organizer=request.event.organizer.slug event=request.event.slug %}">
<span class="fa fa-edit"></span>
{% trans "Modify" %}
</a>
</div> </div>
<h3 class="panel-title"> <h3 class="panel-title">
{% trans "Payment" %} {% trans "Payment" %}

View File

@@ -0,0 +1,13 @@
{% load i18n %}
{% load bootstrap3 %}
{% if order.status == "n" %}
<span class="label label-warning {{ class }}">{% trans "Payment pending" %}</span>
{% elif order.status == "p" %}
<span class="label label-success {{ class }}">{% trans "Paid" %}</span>
{% elif order.status == "e" %}
<span class="label label-danger {{ class }}">{% trans "Payment pending" %}</span>
{% elif order.status == "c" %}
<span class="label label-danger {{ class }}">{% trans "Cancelled" %}</span>
{% elif order.status == "r" %}
<span class="label label-danger {{ class }}">{% trans "Refunded" %}</span>
{% endif %}

View File

@@ -7,17 +7,7 @@
{% blocktrans trimmed with code=order.code %} {% blocktrans trimmed with code=order.code %}
Your order: {{ code }} Your order: {{ code }}
{% endblocktrans %} {% endblocktrans %}
{% if order.status == "n" %} {% include "pretixpresale/event/fragment_order_status.html" with order=order class="pull-right" %}
<span class="label label-warning pull-right">{% trans "Payment pending" %}</span>
{% elif order.status == "p" %}
<span class="label label-success pull-right">{% trans "Paid" %}</span>
{% elif order.status == "e" %}
<span class="label label-danger pull-right">{% trans "Payment pending" %}</span>
{% elif order.status == "c" %}
<span class="label label-danger pull-right">{% trans "Cancelled" %}</span>
{% elif order.status == "r" %}
<span class="label label-danger pull-right">{% trans "Refunded" %}</span>
{% endif %}
</h2> </h2>
{% if order.status == "n" %} {% if order.status == "n" %}
<div class="panel panel-danger"> <div class="panel panel-danger">
@@ -39,6 +29,7 @@
{% if order.can_modify_answers %} {% if order.can_modify_answers %}
<div class="pull-right"> <div class="pull-right">
<a href="{% url "presale:event.order.modify" organizer=request.event.organizer.slug event=request.event.slug order=order.code %}"> <a href="{% url "presale:event.order.modify" organizer=request.event.organizer.slug event=request.event.slug order=order.code %}">
<span class="fa fa-edit"></span>
{% trans "Change answers" %} {% trans "Change answers" %}
</a> </a>
</div> </div>
@@ -56,7 +47,10 @@
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<p> <p>
<a href="{% url 'presale:event.order.cancel' event=request.event.slug organizer=request.event.organizer.slug order=order.code %}" <a href="{% url 'presale:event.order.cancel' event=request.event.slug organizer=request.event.organizer.slug order=order.code %}"
class="btn btn-danger">{% trans "Cancel order" %}</a> class="btn btn-danger">
<span class="fa fa-remove"></span>
{% trans "Cancel order" %}
</a>
</p> </p>
</div> </div>
</div> </div>

View File

@@ -0,0 +1,47 @@
{% extends "pretixpresale/event/base.html" %}
{% load i18n %}
{% block title %}{% trans "Your orders" %}{% endblock %}
{% block content %}
<h2>{% trans "Welcome back!" %}</h2>
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">{% trans "Your orders" %}</h3>
</div>
<div class="panel-body">
<table class="table">
<thead>
<th>{% trans "Order code" %}</th>
<th>{% trans "Date" %}</th>
<th>{% trans "Total" %}</th>
<th>{% trans "Status" %}</th>
<th></th>
</thead>
<tbody>
{% for order in orders %}
<tr>
<td>{{ order.code }}</td>
<td>{{ order.datetime|date }}</td>
<td>{{ event.currency }} {{ order.total|floatformat:2 }}</td>
<td>{% include "pretixpresale/event/fragment_order_status.html" with order=order %}</td>
<td><a href="{% url "presale:event.order" event=request.event.slug organizer=request.event.organizer.slug order=order.code %}">
{% trans "View details" %}
</a></td>
</tr>
{% empty %}
<tr>
<td colspan="5">
<em>{% trans "You did not yet place any orders." %}</em>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="{% url "presale:event.index" event=request.event.slug organizer=request.event.organizer.slug %}"
class="btn btn-primary btn-lg">
<span class="fa fa-plus"></span>
{% trans "Place new order" %}
</a>
</div>
</div>
{% endblock %}

View File

@@ -23,5 +23,7 @@ urlpatterns = [
url(r'^order/(?P<order>[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(), url(r'^order/(?P<order>[^/]+)/modify$', pretix.presale.views.order.OrderModify.as_view(),
name='event.order.modify'), name='event.order.modify'),
url(r'^login$', pretix.presale.views.event.EventLogin.as_view(), name='event.checkout.login'), 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'),
])), ])),
] ]

View File

@@ -1,5 +1,5 @@
import json import json
from django.contrib.auth import authenticate from django.contrib.auth import authenticate, logout
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from django.db.models import Count from django.db.models import Count
@@ -8,12 +8,12 @@ from django.shortcuts import redirect
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm from django.contrib.auth.forms import AuthenticationForm as BaseAuthenticationForm
from django.contrib.auth import login 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.utils.translation import ugettext_lazy as _
from django.conf import settings from django.conf import settings
from pretix.base.models import User 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 from pretix.presale.views.cart import CartAdd
@@ -222,7 +222,7 @@ class EventLogin(EventViewMixin, TemplateView):
return redirect(self.request.GET.get('next')) return redirect(self.request.GET.get('next'))
else: else:
return redirect(reverse( return redirect(reverse(
'presale:event.index', kwargs={ 'presale:event.orders', kwargs={
'organizer': self.request.event.organizer.slug, 'organizer': self.request.event.organizer.slug,
'event': self.request.event.slug, 'event': self.request.event.slug,
} }
@@ -290,3 +290,23 @@ class EventLogin(EventViewMixin, TemplateView):
context['global_registration_form'] = self.global_registration_form context['global_registration_form'] = self.global_registration_form
context['local_registration_form'] = self.local_registration_form context['local_registration_form'] = self.local_registration_form
return context 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