diff --git a/src/pretix/base/models/memberships.py b/src/pretix/base/models/memberships.py
index 540cba6233..190ef73d03 100644
--- a/src/pretix/base/models/memberships.py
+++ b/src/pretix/base/models/memberships.py
@@ -159,6 +159,12 @@ class Membership(models.Model):
de = date_format(self.date_end, 'SHORT_DATE_FORMAT')
return f'{self.membership_type.name}: {self.attendee_name} ({ds} – {de})'
+ @property
+ def percentage_used(self):
+ if self.membership_type.max_usages and self.usages:
+ return int(self.usages / self.membership_type.max_usages * 100)
+ return 0
+
@property
def attendee_name(self):
return build_name(self.attendee_name_parts, fallback_scheme=lambda: self.customer.organizer.settings.name_scheme)
diff --git a/src/pretix/presale/templates/pretixpresale/organizers/customer_memberships.html b/src/pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
index 029f1d15fc..13f1a81b15 100644
--- a/src/pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
+++ b/src/pretix/presale/templates/pretixpresale/organizers/customer_memberships.html
@@ -18,79 +18,46 @@
{% for m in memberships %}
- - {% trans "Membership type" %}
- -
- {% if m.canceled %}
{% endif %}
- {{ m.membership_type.name }}
- {% if m.canceled %}{% endif %}
- {% if m.testmode %}{% trans "TEST MODE" %}{% endif %}
-
- - {% trans "Valid from" %}
- - {{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
- - {% trans "Valid until" %}
- - {{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
- - {% trans "Attendee name" %}
- - {{ m.attendee_name }}
- - {% trans "Usages" %}
- -
-
-
-
+
+
-
+ {% if m.canceled %}
{% endif %}
+ {{ m.membership_type.name }}
+ {% if m.membership_type.transferable %}
+
+ {% endif %}
+ {% if m.canceled %}
+
+
+ {% trans "Canceled" %}
+
+
+ {% endif %}
+ {% if m.testmode %}{% trans "TEST MODE" %}{% endif %}
+
+ -
+ {% if not m.membership_type.transferable %}
+
+ {% endif %}
+ {{ m.attendee_name|default_if_none:"" }}
+
+ - {% trans "Valid from" %} {{ m.date_start|date:"SHORT_DATETIME_FORMAT" }}
+ - {% trans "Valid until" %} {{ m.date_end|date:"SHORT_DATETIME_FORMAT" }}
+
+
+
-
+
+
+
+ {{ m.usages }} /
+ {{ m.membership_type.max_usages|default_if_none:"∞" }}
-
- {{ m.usages }} /
- {{ m.membership_type.max_usages|default_if_none:"∞" }}
-
-
-
-
- {% trans "Actions" %}
-
-
-
-
- {% trans "Details" %}
-
-
-
-
-
-
- {% trans "Order" %}
-
-
-
-
- {{ o.code }}
-
- {% if o.customer_id != customer.pk %}
-
- {% endif %}
- {% include "pretixpresale/event/fragment_order_status.html" with order=o event=o.event %}
-
-
- {% if o.testmode and False %}
-
- {% trans "TEST MODE" %}
- {% endif %}
-
-
-
- {% trans "Order total" %}
- - {{ o.total|money:o.event.currency }}
- - {% trans "Positions" %}
- - {% blocktranslate count counter=o.count_positions|default_if_none:0 %}{{ counter }} item{% plural %}{{ counter }} items{% endblocktranslate %}
-
-
- {% trans "Event" %}
- -
- {{ o.event }}
- {% if not o.event.has_subevents and o.event.settings.show_dates_on_frontpage %}
-
{{ o.event.get_date_range_display }}
- {% endif %}
-
-
-