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 %} {% if request.organizer.settings.customer_accounts %}
<nav class="loginstatus" aria-label="{% trans "customer account" %}"> <nav class="loginstatus" aria-label="{% trans "customer account" %}">
{% if request.customer %} {% 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" aria-label="{% trans "View customer account" %}" data-placement="bottom"
title="{% trans "View user profile" %}" data-toggle="tooltip"> title="{% trans "View user profile" %}" data-toggle="tooltip">
<span class="fa fa-user" aria-hidden="true"></span> <span class="fa fa-user" aria-hidden="true"></span>

View File

@@ -9,48 +9,63 @@
<h2> <h2>
{% trans "Your account" %} {% trans "Your account" %}
</h2> </h2>
<div class="row"> <div class="row">
<dl> <dl>
<div class="col-sm-6"> <div class="col-sm-6">
<dt>{{ customer.name }}</dt> <dt>{{ customer.name }}</dt>
<dd>{{ customer.email }}</dd> <dd>{{ customer.email }}</dd>
{% if customer.phone %} {% if customer.phone %}
<dd><spani class="fa fa-phone" aria-hidden="true"></span> {{ customer.phone }}</dd> <dd><spani class="fa fa-phone" aria-hidden="true"></span> {{ customer.phone }}</dd>
{% endif %} {% endif %}
<dd> <dd>
<ul class="list-inline"> <ul class="list-inline">
<li><a href="{% eventurl request.organizer "presale:organizer.customer.change" %}"> <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> <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" %}"> <li><a href="{% eventurl request.organizer "presale:organizer.customer.password" %}">
<span class="fa fa-key" aria-hidden=true></span> {% trans "Change password" %}</a></li> <span class="fa fa-key" aria-hidden=true></span> {% trans "Change password" %}</a></li>
</ul> </ul>
</dd> </dd>
<dd> <dd>
</dd> </dd>
</div> </div>
<div class="col-sm-6 text-right"> <div class="col-sm-6 text-right">
<dt>{% trans "Customer ID" %}</dt> <dt>{% trans "Customer ID" %}</dt>
<dd>#{{ customer.identifier }}</dd> <dd>#{{ customer.identifier }}</dd>
</div> </div> </dl>
</dl> <nav class="row" aria-label="{% trans "customer account information" %}">
</div> <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> <div>
<ul class="nav nav-tabs" role="tablist">
<li role="presentation" class="active"> <div class="panel panel-default">
<a href="#orders" aria-controls="orders" role="tab" data-toggle="tab">{% trans "Orders" %} ({{ page_obj.paginator.count }})</a> <div class="panel-heading">
</li> <h3 class="panel-title">
<li role="presentation"> <span class="fa fa-shopping-cart" aria-hidden="true"></span> <b>{% trans "Orders" %}</b> ({{ page_obj.paginator.count }})
<a href="#memberships" aria-controls="memberships" role="tab" data-toggle="tab">{% trans "Memberships" %} ({{ memberships|length }})</a> </h3>
</li> </div>
<li role="presentation"> <div class="panel-body">
<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">
{% if orders %} {% if orders %}
<ol class="event-list list-unstyled"> <ol class="event-list list-unstyled">
{% for o in orders %} {% for o in orders %}
@@ -112,7 +127,10 @@
{% else %} {% else %}
<p class="text-center">{% trans "You dont have any orders in your account yet." %}</p> <p class="text-center">{% trans "You dont have any orders in your account yet." %}</p>
{% endif %} {% endif %}
</div> </div>
</div>
{% include "pretixcontrol/pagination.html" %}
<div role="tabpanel" class="tab-pane" id="memberships"> <div role="tabpanel" class="tab-pane" id="memberships">
<table class="panel-body table table-hover"> <table class="panel-body table table-hover">
<caption class="sr-only">{% trans "Memberships" %}</caption> <caption class="sr-only">{% trans "Memberships" %}</caption>

View File

@@ -17,7 +17,7 @@
<div class="row"> <div class="row">
<div class="col-md-4 col-sm-6"> <div class="col-md-4 col-sm-6">
<a class="btn btn-block btn-default btn-lg" <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" %} {% trans "Go back" %}
</a> </a>
</div> </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/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/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/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/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/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(), re_path(r'^oauth2/v1/authorize$', pretix.presale.views.oidc_op.AuthorizeView.as_view(),
name='organizer.oauth2.v1.authorize'), name='organizer.oauth2.v1.authorize'),

View File

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