change to pages instead of tabs

This commit is contained in:
Richard Schreiber
2024-11-19 09:26:37 +01:00
parent 3f499447da
commit 59dccaf680
5 changed files with 95 additions and 55 deletions

View File

@@ -4,7 +4,7 @@
{% if request.organizer.settings.customer_accounts %}
<nav class="loginstatus" aria-label="{% trans "customer account" %}">
{% if request.customer %}
<a href="{% abseventurl request.organizer "presale:organizer.customer.profile" %}"
<a href="{% abseventurl request.organizer "presale:organizer.customer.index" %}"
aria-label="{% trans "View customer account" %}" data-placement="bottom"
title="{% trans "View user profile" %}" data-toggle="tooltip">
<span class="fa fa-user" aria-hidden="true"></span>

View File

@@ -9,48 +9,63 @@
<h2>
{% trans "Your account" %}
</h2>
<div class="row">
<dl>
<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>
</div>
<div class="row">
<dl>
<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>
<div>
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active">
<a href="#orders" aria-controls="orders" role="tab" data-toggle="tab">{% trans "Orders" %} ({{ page_obj.paginator.count }})</a>
</li>
<li role="presentation">
<a href="#memberships" aria-controls="memberships" role="tab" data-toggle="tab">{% trans "Memberships" %} ({{ memberships|length }})</a>
</li>
<li role="presentation">
<a href="#addresses" aria-controls="addresses" role="tab" data-toggle="tab">{% trans "Addresses" %} ({{ invoice_addresses|length }})</a>
</li>
<li role="presentation">
<a href="#profiles" aria-controls="profiles" role="tab" data-toggle="tab">{% trans "Attendee profiles" %} ({{ attendee_profiles|length }})</a>
</li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="orders">
<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 orders %}
<ol class="event-list list-unstyled">
{% for o in orders %}
@@ -112,7 +127,10 @@
{% else %}
<p class="text-center">{% trans "You dont have any orders in your account yet." %}</p>
{% endif %}
</div>
</div>
</div>
{% include "pretixcontrol/pagination.html" %}
<div role="tabpanel" class="tab-pane" id="memberships">
<table class="panel-body table table-hover">
<caption class="sr-only">{% trans "Memberships" %}</caption>

View File

@@ -17,7 +17,7 @@
<div class="row">
<div class="col-md-4 col-sm-6">
<a class="btn btn-block btn-default btn-lg"
href="{% abseventurl request.organizer "presale:organizer.customer.profile" %}">
href="{% abseventurl request.organizer "presale:organizer.customer.index" %}">
{% trans "Go back" %}
</a>
</div>

View File

@@ -210,10 +210,14 @@ organizer_patterns = [
re_path(r'^account/password$', pretix.presale.views.customer.ChangePasswordView.as_view(), name='organizer.customer.password'),
re_path(r'^account/change$', pretix.presale.views.customer.ChangeInformationView.as_view(), name='organizer.customer.change'),
re_path(r'^account/confirmchange$', pretix.presale.views.customer.ConfirmChangeView.as_view(), name='organizer.customer.change.confirm'),
re_path(r'^account/membership/(?P<id>\d+)/$', pretix.presale.views.customer.MembershipUsageView.as_view(), name='organizer.customer.membership'),
re_path(r'^account/memberships$', pretix.presale.views.customer.MembershipView.as_view(), name='organizer.customer.memberships'),
re_path(r'^account/memberships/(?P<id>\d+)/$', pretix.presale.views.customer.MembershipUsageView.as_view(), name='organizer.customer.membership'),
re_path(r'^account/addresses$', pretix.presale.views.customer.AddressView.as_view(), name='organizer.customer.addresses'),
re_path(r'^account/addresses/(?P<id>\d+)/delete$', pretix.presale.views.customer.AddressDeleteView.as_view(), name='organizer.customer.address.delete'),
re_path(r'^account/profiles$', pretix.presale.views.customer.ProfileView.as_view(), name='organizer.customer.profiles'),
re_path(r'^account/profiles/(?P<id>\d+)/delete$', pretix.presale.views.customer.ProfileDeleteView.as_view(), name='organizer.customer.profile.delete'),
re_path(r'^account/$', pretix.presale.views.customer.ProfileView.as_view(), name='organizer.customer.profile'),
re_path(r'^account/$', pretix.presale.views.customer.IndexView.as_view(), name='organizer.customer.index'),
#re_path(r'^account/$', pretix.presale.views.customer.ProfileView.as_view(), name='organizer.customer.profile'),
re_path(r'^oauth2/v1/authorize$', pretix.presale.views.oidc_op.AuthorizeView.as_view(),
name='organizer.oauth2.v1.authorize'),

View File

@@ -134,7 +134,7 @@ class LoginView(RedirectBackMixin, FormView):
url = self.get_redirect_url()
if not url:
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
if self.request.GET.get("request_cross_domain_customer_auth") == "true":
otpstore = SessionStore()
@@ -350,7 +350,7 @@ class CustomerRequiredMixin:
return super().dispatch(request, *args, **kwargs)
class ProfileView(CustomerRequiredMixin, ListView):
class IndexView(CustomerRequiredMixin, ListView):
template_name = 'pretixpresale/organizers/customer_profile.html'
context_object_name = 'orders'
paginate_by = 20
@@ -405,6 +405,12 @@ class ProfileView(CustomerRequiredMixin, ListView):
return ctx
class MembershipView(CustomerRequiredMixin, ListView):
template_name = 'pretixpresale/organizers/customer_memberships.html'
context_object_name = 'membership'
paginate_by = 20
class MembershipUsageView(CustomerRequiredMixin, ListView):
template_name = 'pretixpresale/organizers/customer_membership.html'
context_object_name = 'usages'
@@ -429,6 +435,12 @@ class MembershipUsageView(CustomerRequiredMixin, ListView):
return ctx
class AddressView(CustomerRequiredMixin, ListView):
template_name = 'pretixpresale/organizers/customer_addresses.html'
context_object_name = 'address'
paginate_by = 20
class AddressDeleteView(CustomerRequiredMixin, CompatDeleteView):
template_name = 'pretixpresale/organizers/customer_address_delete.html'
context_object_name = 'address'
@@ -437,7 +449,13 @@ class AddressDeleteView(CustomerRequiredMixin, CompatDeleteView):
return get_object_or_404(InvoiceAddress.profiles, customer=self.request.customer, pk=self.kwargs.get('id'))
def get_success_url(self):
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.addresses', kwargs={})
class ProfileView(CustomerRequiredMixin, ListView):
template_name = 'pretixpresale/organizers/customer_profiles.html'
context_object_name = 'profile'
paginate_by = 20
class ProfileDeleteView(CustomerRequiredMixin, CompatDeleteView):
@@ -448,7 +466,7 @@ class ProfileDeleteView(CustomerRequiredMixin, CompatDeleteView):
return get_object_or_404(self.request.customer.attendee_profiles, pk=self.kwargs.get('id'))
def get_success_url(self):
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.profiles', kwargs={})
class ChangePasswordView(CustomerRequiredMixin, FormView):
@@ -466,7 +484,7 @@ class ChangePasswordView(CustomerRequiredMixin, FormView):
return super().dispatch(request, *args, **kwargs)
def get_success_url(self):
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
@transaction.atomic()
def form_valid(self, form):
@@ -499,7 +517,7 @@ class ChangeInformationView(CustomerRequiredMixin, FormView):
return super().dispatch(request, *args, **kwargs)
def get_success_url(self):
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
def form_valid(self, form):
if form.cleaned_data['email'] != self.initial_email and not self.request.customer.provider:
@@ -582,7 +600,7 @@ class ConfirmChangeView(View):
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
class SSOLoginView(RedirectBackMixin, View):
@@ -642,7 +660,7 @@ class SSOLoginView(RedirectBackMixin, View):
url = self.get_redirect_url()
if not url:
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
return url
@@ -865,7 +883,7 @@ class SSOLoginReturnView(RedirectBackMixin, View):
url = self.get_redirect_url(redirect_to)
if not url:
return eventreverse(self.request.organizer, 'presale:organizer.customer.profile', kwargs={})
return eventreverse(self.request.organizer, 'presale:organizer.customer.index', kwargs={})
else:
if self.request.session.get(f'pretix_customerauth_{self.provider.pk}_cross_domain_requested'):
otpstore = SessionStore()