@@ -141,7 +151,13 @@
| {{ e.created|date:"SHORT_DATETIME_FORMAT" }} |
{% if e.voucher %}
- {% trans "Voucher assigned" %}
+ {% if e.voucher.redeemed >= e.voucher.max_usages %}
+ {% trans "Voucher redeemed" %}
+ {% elif not e.voucher.is_active %}
+ {% trans "Voucher expired" %}
+ {% else %}
+ {% trans "Voucher assigned" %}
+ {% endif %}
{% elif e.availability.0 == 100 %}
{% blocktrans with num=e.availability.1 %}
@@ -165,7 +181,7 @@
|
{% if not e.voucher %}
-
+
{% else %}
{% endif %}
diff --git a/src/pretix/control/views/waitinglist.py b/src/pretix/control/views/waitinglist.py
index f75bcd1845..f4cb879bec 100644
--- a/src/pretix/control/views/waitinglist.py
+++ b/src/pretix/control/views/waitinglist.py
@@ -1,10 +1,12 @@
from django.contrib import messages
from django.db import transaction
-from django.db.models import Sum
+from django.db.models import F, Q, Sum
from django.db.models.functions import Coalesce
from django.http import Http404, HttpResponseRedirect
from django.shortcuts import redirect
from django.urls import reverse
+from django.utils.http import is_safe_url
+from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.views import View
from django.views.generic import ListView
@@ -66,6 +68,8 @@ class WaitingListView(EventPermissionRequiredMixin, PaginationMixin, ListView):
else:
messages.success(request, _('An email containing a voucher code has been sent to the '
'specified address.'))
+ if "next" in self.request.GET and is_safe_url(self.request.GET.get("next"), allowed_hosts=None):
+ return redirect(self.request.GET.get("next"))
return redirect(reverse('control:event.orders.waitinglist', kwargs={
'event': request.event.slug,
'organizer': request.event.organizer.slug
@@ -89,6 +93,23 @@ class WaitingListView(EventPermissionRequiredMixin, PaginationMixin, ListView):
qs = qs.filter(voucher__isnull=False)
elif s == 'a':
pass
+ elif s == 'r':
+ qs = qs.filter(
+ voucher__isnull=False,
+ voucher__redeemed__gte=F('voucher__max_usages'),
+ )
+ elif s == 'v':
+ qs = qs.filter(
+ voucher__isnull=False,
+ voucher__redeemed__lt=F('voucher__max_usages'),
+ ).filter(Q(voucher__valid_until__isnull=True) | Q(voucher__valid_until__gt=now()))
+ elif s == 'e':
+ qs = qs.filter(
+ voucher__isnull=False,
+ voucher__redeemed__lt=F('voucher__max_usages'),
+ voucher__valid_until__isnull=False,
+ voucher__valid_until__lte=now()
+ )
else:
qs = qs.filter(voucher__isnull=True)
@@ -160,6 +181,8 @@ class EntryDelete(EventPermissionRequiredMixin, DeleteView):
self.object.log_action('pretix.event.orders.waitinglist.deleted', user=self.request.user)
self.object.delete()
messages.success(self.request, _('The selected entry has been deleted.'))
+ if "next" in self.request.GET and is_safe_url(self.request.GET.get("next"), allowed_hosts=None):
+ return redirect(self.request.GET.get("next"))
return HttpResponseRedirect(success_url)
def get_success_url(self) -> str:
diff --git a/src/tests/control/test_waitinglist.py b/src/tests/control/test_waitinglist.py
index 15676e0f9f..f376c0fef3 100644
--- a/src/tests/control/test_waitinglist.py
+++ b/src/tests/control/test_waitinglist.py
@@ -1,3 +1,5 @@
+from datetime import timedelta
+
import pytest
from django.utils.timezone import now
@@ -29,8 +31,13 @@ def env():
WaitingListEntry.objects.create(
event=event, item=item1, email='success@example.org', voucher=v
)
+ v = Voucher.objects.create(item=item1, event=event, block_quota=True, redeemed=0, valid_until=now() - timedelta(days=5))
WaitingListEntry.objects.create(
- event=event, item=item2, email='item2@example.org'
+ event=event, item=item2, email='expired@example.org', voucher=v
+ )
+ v = Voucher.objects.create(item=item1, event=event, block_quota=True, redeemed=0, valid_until=now() + timedelta(days=5))
+ WaitingListEntry.objects.create(
+ event=event, item=item2, email='valid@example.org', voucher=v
)
t = Team.objects.create(organizer=o, can_view_orders=True, can_change_orders=True)
@@ -45,17 +52,40 @@ def test_list(client, env):
response = client.get('/control/event/dummy/dummy/waitinglist/')
assert 'success@example.org' not in response.rendered_content
- assert 'item2@example.org' in response.rendered_content
+ assert 'expired@example.org' not in response.rendered_content
assert 'foo0@bar.com' in response.rendered_content
- assert response.context['estimate'] == 23 * 6
+ assert 'valid@example.org' not in response.rendered_content
+ assert response.context['estimate'] == 23 * 5
response = client.get('/control/event/dummy/dummy/waitinglist/?status=a')
assert 'success@example.org' in response.rendered_content
assert 'foo0@bar.com' in response.rendered_content
+ assert 'expired@example.org' in response.rendered_content
+ assert 'valid@example.org' in response.rendered_content
response = client.get('/control/event/dummy/dummy/waitinglist/?status=s')
assert 'success@example.org' in response.rendered_content
assert 'foo0@bar.com' not in response.rendered_content
+ assert 'expired@example.org' in response.rendered_content
+ assert 'valid@example.org' in response.rendered_content
+
+ response = client.get('/control/event/dummy/dummy/waitinglist/?status=v')
+ assert 'success@example.org' not in response.rendered_content
+ assert 'foo0@bar.com' not in response.rendered_content
+ assert 'expired@example.org' not in response.rendered_content
+ assert 'valid@example.org' in response.rendered_content
+
+ response = client.get('/control/event/dummy/dummy/waitinglist/?status=r')
+ assert 'success@example.org' in response.rendered_content
+ assert 'foo0@bar.com' not in response.rendered_content
+ assert 'expired@example.org' not in response.rendered_content
+ assert 'valid@example.org' not in response.rendered_content
+
+ response = client.get('/control/event/dummy/dummy/waitinglist/?status=e')
+ assert 'success@example.org' not in response.rendered_content
+ assert 'expired@example.org' in response.rendered_content
+ assert 'foo0@bar.com' not in response.rendered_content
+ assert 'valid@example.org' not in response.rendered_content
response = client.get('/control/event/dummy/dummy/waitinglist/?item=%d' % env[3].pk)
assert 'item2@example.org' not in response.rendered_content
@@ -89,5 +119,5 @@ def test_dashboard(client, env):
quota = Quota.objects.create(name="Test", size=2, event=env[0])
quota.items.add(env[3])
w = waitinglist_widgets(env[0])
- assert '3' in w[0]['content']
- assert '6' in w[1]['content']
+ assert '1' in w[0]['content']
+ assert '5' in w[1]['content']
|