mirror of
https://github.com/pretix/pretix.git
synced 2026-05-21 17:54:08 +00:00
move to individual pages with own paged querysets
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
{% extends "pretixpresale/organizers/customer_base.html" %}
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% load money %}
|
||||
{% load bootstrap3 %}
|
||||
{% block title %}{% trans "Your account" %}{% endblock %}
|
||||
{% block inner %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
<span class="fa fa-shopping-cart" aria-hidden="true"></span> <b>{% trans "Orders" %}</b> ({{ page_obj.paginator.count }})
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if invoice_addresses %}
|
||||
<ol class="full-width-list alternating-rows">
|
||||
{% for ia in invoice_addresses %}
|
||||
<li class="row">
|
||||
{{ ia.describe|linebreaksbr }}
|
||||
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.address.delete" id=ia.id %}"
|
||||
class="btn btn-danger">
|
||||
<span class="fa fa-trash" aria-hidden="true"></span>
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% else %}
|
||||
<p class="text-center">{% trans "You don’t have any addresses in your account yet." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% include "pretixcontrol/pagination.html" %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,60 @@
|
||||
{% extends "pretixpresale/organizers/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% load bootstrap3 %}
|
||||
{% block content %}
|
||||
<h2>
|
||||
{% trans "Your account" %}
|
||||
</h2>
|
||||
<div class="blank-after">
|
||||
<dl class="row">
|
||||
<div class="col-sm-6">
|
||||
<dt>{{ customer.name }}</dt>
|
||||
<dd>{{ customer.email }}</dd>
|
||||
{% if customer.phone %}
|
||||
<dd><spani class="fa fa-phone" aria-hidden="true"></span> {{ customer.phone }}</dd>
|
||||
{% endif %}
|
||||
<dd>
|
||||
<ul class="list-inline">
|
||||
<li><a href="{% eventurl request.organizer "presale:organizer.customer.change" %}">
|
||||
<span class="fa fa-edit" aria-hidden=true></span> {% trans "Change account information" %}</a></li>
|
||||
<li><a href="{% eventurl request.organizer "presale:organizer.customer.password" %}">
|
||||
<span class="fa fa-key" aria-hidden=true></span> {% trans "Change password" %}</a></li>
|
||||
</ul>
|
||||
</dd>
|
||||
<dd>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-sm-6 text-right">
|
||||
<dt>{% trans "Customer ID" %}</dt>
|
||||
<dd>#{{ customer.identifier }}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<nav class="row" aria-label="{% trans "customer account information" %}">
|
||||
<ul class="list-inline blank-after col-xs-12">
|
||||
<li>
|
||||
<a href="{% eventurl request.organizer "presale:organizer.customer.index" %}">
|
||||
<span class="fa fa-shopping-cart" aria-hidden="true"></span>{% trans "Orders" %}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% eventurl request.organizer "presale:organizer.customer.memberships" %}">
|
||||
<span class="fa fa-unlock-alt" aria-hidden="true"></span>{% trans "Memberships" %}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% eventurl request.organizer "presale:organizer.customer.addresses" %}">
|
||||
<span class="fa fa-address-card-o" aria-hidden="true"></span>{% trans "Addresses" %}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{% eventurl request.organizer "presale:organizer.customer.profiles" %}">
|
||||
<span class="fa fa-users" aria-hidden="true"></span>{% trans "Attendee profiles" %}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
{% block inner %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,112 @@
|
||||
{% extends "pretixpresale/organizers/customer_base.html" %}
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% load money %}
|
||||
{% load bootstrap3 %}
|
||||
{% block title %}{% trans "Your account" %}{% endblock %}
|
||||
{% block inner %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
<span class="fa fa-shopping-cart" aria-hidden="true"></span> <b>{% trans "Memberships" %}</b> ({{ page_obj.paginator.count }})
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if memberships %}
|
||||
<ol class="full-width-list alternating-rows">
|
||||
{% for m in memberships %}
|
||||
<li class="row">
|
||||
<dl>
|
||||
<dt>{% trans "Membership type" %}</dt>
|
||||
<dd>
|
||||
{% if m.canceled %}<del>{% endif %}
|
||||
{{ m.membership_type.name }}
|
||||
{% if m.canceled %}</del>{% endif %}
|
||||
{% if m.testmode %}<span class="label label-warning">{% trans "TEST MODE" %}</span>{% endif %}
|
||||
</dd>
|
||||
<dt>{% trans "Valid from" %}</dt>
|
||||
<dd>{{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}</dd>
|
||||
<dt>{% trans "Valid until" %}</dt>
|
||||
<dd>{{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}</dd>
|
||||
<dt>{% trans "Attendee name" %}</dt>
|
||||
<dd>{{ m.attendee_name }}</dd>
|
||||
<dt>{% trans "Usages" %}</dt>
|
||||
<dd>
|
||||
<div class="quotabox">
|
||||
<div class="progress">
|
||||
<div class="progress-bar progress-bar-success progress-bar-{{ m.percent }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="numbers">
|
||||
{{ m.usages }} /
|
||||
{{ m.membership_type.max_usages|default_if_none:"∞" }}
|
||||
</div>
|
||||
</div>
|
||||
</dd>
|
||||
<dt class="sr-only">{% trans "Actions" %}</dt>
|
||||
<dd class="text-right">
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}"
|
||||
target="_blank">
|
||||
<span class="fa fa-list-ul" aria-hidden="true"></span>
|
||||
{% trans "Details" %}
|
||||
</a></dd>
|
||||
</dl>
|
||||
|
||||
<dl>
|
||||
<div class="col-md-4 col-sm-5 col-xs-8">
|
||||
<dt class="sr-only">{% trans "Order" %}</dt>
|
||||
<dd><strong>
|
||||
<a href="{% abseventurl o.event "presale:event.order" order=o.code secret=o.secret %}" target="_blank">
|
||||
<i class="fa fa-shopping-cart" aria-hidden="true"></i>
|
||||
{{ o.code }}</a>
|
||||
</strong>
|
||||
{% if o.customer_id != customer.pk %}
|
||||
<span class="fa fa-compress text-muted"
|
||||
data-toggle="tooltip"
|
||||
title="{% trans "Matched to the account based on the email address." %}"
|
||||
></span>
|
||||
{% endif %}
|
||||
<small>{% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}</small>
|
||||
</dd>
|
||||
<dd><time datetime="{{ o.datetime|date:"Y-m-d H:i" }}" class="text-muted small">{{ o.datetime|date:"SHORT_DATETIME_FORMAT" }}</time></dd>
|
||||
{% if o.testmode and False %}
|
||||
<dd><span class="label label-warning">{% trans "TEST MODE" %}</span></dd>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-2 col-xs-4 text-right">
|
||||
<dt class="sr-only">{% trans "Order total" %}</dt>
|
||||
<dd>{{ o.total|money:o.event.currency }}</dd>
|
||||
<dt class="sr-only">{% trans "Positions" %}</dt>
|
||||
<dd class="text-muted"><small>{% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}</small>
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-md-4 col-sm-3 col-xs-8">
|
||||
<dt class="sr-only">{% trans "Event" %}</dt>
|
||||
<dd>
|
||||
{{ o.event }}
|
||||
{% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
|
||||
<br><small class="text-muted">{{ o.event.get_date_range_display }}</small>
|
||||
{% endif %}
|
||||
</dd>
|
||||
</div>
|
||||
<div class="col-sm-2 col-xs-4">
|
||||
<dt class="sr-only">{% trans "Actions" %}</dt>
|
||||
<dd class="text-right">
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.membership" id=m.id %}"
|
||||
target="_blank">
|
||||
<span class="fa fa-list-ul" aria-hidden="true"></span>
|
||||
{% trans "Details" %}
|
||||
</a></dd>
|
||||
</div>
|
||||
</dl>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% else %}
|
||||
<p class="text-center">{% trans "You don’t have any memberships in your account yet." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% include "pretixcontrol/pagination.html" %}
|
||||
{% endblock %}
|
||||
@@ -0,0 +1,36 @@
|
||||
{% extends "pretixpresale/organizers/customer_base.html" %}
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% load urlreplace %}
|
||||
{% load money %}
|
||||
{% load bootstrap3 %}
|
||||
{% block title %}{% trans "Your account" %}{% endblock %}
|
||||
{% block inner %}
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">
|
||||
<span class="fa fa-shopping-cart" aria-hidden="true"></span> <b>{% trans "Orders" %}</b> ({{ page_obj.paginator.count }})
|
||||
</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% if attendee_profiles %}
|
||||
<ol class="full-width-list alternating-rows">
|
||||
{% for ap in attendee_profiles %}
|
||||
<li class="row">
|
||||
{{ ap.describe|linebreaksbr }}
|
||||
|
||||
<a href="{% abseventurl request.organizer "presale:organizer.customer.profile.delete" id=ap.id %}"
|
||||
class="btn btn-danger">
|
||||
<span class="fa fa-trash" aria-hidden="true"></span>
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% else %}
|
||||
<p class="text-center">{% trans "You don’t have any attendee profiles in your account yet." %}</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% include "pretixcontrol/pagination.html" %}
|
||||
{% endblock %}
|
||||
@@ -369,19 +369,6 @@ class OrderView(CustomerRequiredMixin, ListView):
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
ctx['customer'] = self.request.customer
|
||||
ctx['memberships'] = self.request.customer.memberships.with_usages().select_related(
|
||||
'membership_type', 'granted_in', 'granted_in__order', 'granted_in__order__event'
|
||||
)
|
||||
ctx['invoice_addresses'] = InvoiceAddress.profiles.filter(customer=self.request.customer)
|
||||
ctx['attendee_profiles'] = self.request.customer.attendee_profiles.all()
|
||||
ctx['is_paginated'] = True
|
||||
|
||||
for m in ctx['memberships']:
|
||||
if m.membership_type.max_usages:
|
||||
m.percent = int(m.usages / m.membership_type.max_usages * 100)
|
||||
else:
|
||||
m.percent = 0
|
||||
|
||||
s = OrderPosition.objects.filter(
|
||||
order=OuterRef('pk')
|
||||
@@ -407,9 +394,14 @@ class OrderView(CustomerRequiredMixin, ListView):
|
||||
|
||||
class MembershipView(CustomerRequiredMixin, ListView):
|
||||
template_name = 'pretixpresale/organizers/customer_memberships.html'
|
||||
context_object_name = 'membership'
|
||||
context_object_name = 'memberships'
|
||||
paginate_by = 20
|
||||
|
||||
def get_queryset(self):
|
||||
return self.request.customer.memberships.with_usages().select_related(
|
||||
'membership_type', 'granted_in', 'granted_in__order', 'granted_in__order__event'
|
||||
)
|
||||
|
||||
|
||||
class MembershipUsageView(CustomerRequiredMixin, ListView):
|
||||
template_name = 'pretixpresale/organizers/customer_membership.html'
|
||||
@@ -437,9 +429,12 @@ class MembershipUsageView(CustomerRequiredMixin, ListView):
|
||||
|
||||
class AddressView(CustomerRequiredMixin, ListView):
|
||||
template_name = 'pretixpresale/organizers/customer_addresses.html'
|
||||
context_object_name = 'address'
|
||||
context_object_name = 'invoice_addresses'
|
||||
paginate_by = 20
|
||||
|
||||
def get_queryset(self):
|
||||
return InvoiceAddress.profiles.filter(customer=self.request.customer)
|
||||
|
||||
|
||||
class AddressDeleteView(CustomerRequiredMixin, CompatDeleteView):
|
||||
template_name = 'pretixpresale/organizers/customer_address_delete.html'
|
||||
@@ -454,9 +449,12 @@ class AddressDeleteView(CustomerRequiredMixin, CompatDeleteView):
|
||||
|
||||
class ProfileView(CustomerRequiredMixin, ListView):
|
||||
template_name = 'pretixpresale/organizers/customer_profiles.html'
|
||||
context_object_name = 'profile'
|
||||
context_object_name = 'attendee_profiles'
|
||||
paginate_by = 20
|
||||
|
||||
def get_queryset(self):
|
||||
return self.request.customer.attendee_profiles.all()
|
||||
|
||||
|
||||
class ProfileDeleteView(CustomerRequiredMixin, CompatDeleteView):
|
||||
template_name = 'pretixpresale/organizers/customer_profile_delete.html'
|
||||
|
||||
Reference in New Issue
Block a user