move to individual pages with own paged querysets

This commit is contained in:
Richard Schreiber
2024-11-20 12:20:04 +01:00
parent 2442f2bfb5
commit 9e2aeaa400
5 changed files with 258 additions and 16 deletions

View File

@@ -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 dont have any addresses in your account yet." %}</p>
{% endif %}
</div>
</div>
{% include "pretixcontrol/pagination.html" %}
{% endblock %}

View File

@@ -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 %}

View File

@@ -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 dont have any memberships in your account yet." %}</p>
{% endif %}
</div>
</div>
{% include "pretixcontrol/pagination.html" %}
{% endblock %}

View File

@@ -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 dont have any attendee profiles in your account yet." %}</p>
{% endif %}
</div>
</div>
{% include "pretixcontrol/pagination.html" %}
{% endblock %}

View File

@@ -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'