mirror of
https://github.com/pretix/pretix.git
synced 2026-05-07 15:34:02 +00:00
Add waiting list
This commit is contained in:
13
src/pretix/presale/forms/waitinglist.py
Normal file
13
src/pretix/presale/forms/waitinglist.py
Normal file
@@ -0,0 +1,13 @@
|
||||
from django import forms
|
||||
|
||||
from pretix.base.models import WaitingListEntry
|
||||
|
||||
|
||||
class WaitingListForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = WaitingListEntry
|
||||
fields = ('email',)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.event = kwargs.pop('event')
|
||||
super().__init__(*args, **kwargs)
|
||||
@@ -1,13 +1,28 @@
|
||||
{% load i18n %}
|
||||
{% load eventurl %}
|
||||
{% if avail == 0 %}
|
||||
<div class="col-md-2 col-xs-6 availability-box gone">
|
||||
<strong>{% trans "SOLD OUT" %}</strong>
|
||||
{% if event.settings.waiting_list_enabled %}
|
||||
<br/>
|
||||
<a href="{% eventurl event "presale:event.waitinglist" %}?item={{ item.pk }}{% if var %}&var={{ var.pk }}{% endif %}">
|
||||
<span class="fa fa-plus-circle"></span>
|
||||
{% trans "Waiting list" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% elif avail < 100 %}
|
||||
<div class="col-md-2 col-xs-6 availability-box unavailable">
|
||||
<strong>{% trans "Reserved" %}</strong><br />
|
||||
<small>
|
||||
{% trans "All remaining products are reserved but might become available again." %}
|
||||
</small>
|
||||
<strong>{% trans "Reserved" %}
|
||||
<span class="fa fa-info-circle" data-toggle="tooltip"
|
||||
title="{% trans "All remaining products are reserved but might become available again." %}"></span>
|
||||
</strong>
|
||||
{% if event.settings.waiting_list_enabled %}
|
||||
<br/>
|
||||
<a href="{% eventurl event "presale:event.waitinglist" %}?item={{ item.pk }}{% if var %}&var={{ var.pk }}{% endif %}">
|
||||
<span class="fa fa-plus-circle"></span>
|
||||
{% trans "Waiting list" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
name="variation_{{ item.id }}_{{ var.id }}">
|
||||
</div>
|
||||
{% else %}
|
||||
{% include "pretixpresale/event/fragment_availability.html" with avail=var.cached_availability.0 %}
|
||||
{% include "pretixpresale/event/fragment_availability.html" with avail=var.cached_availability.0 event=event item=item var=var %}
|
||||
{% endif %}
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
@@ -211,7 +211,7 @@
|
||||
max="{{ item.order_max }}" name="item_{{ item.id }}">
|
||||
</div>
|
||||
{% else %}
|
||||
{% include "pretixpresale/event/fragment_availability.html" with avail=item.cached_availability.0 %}
|
||||
{% include "pretixpresale/event/fragment_availability.html" with avail=item.cached_availability.0 event=event item=item var=0 %}
|
||||
{% endif %}
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
{% extends "pretixpresale/event/base.html" %}
|
||||
{% load i18n eventurl thumbnail bootstrap3 %}
|
||||
{% block title %}{% trans "Waiting list" %}{% endblock %}
|
||||
{% block content %}
|
||||
<h2>{% trans "Add me to the waiting list" %}</h2>
|
||||
<form action="" method="post">
|
||||
{% csrf_token %}
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label class="col-md-3 control-label" for="id_email">{% trans "Product" %}</label>
|
||||
<div class="col-md-9">
|
||||
<input class="form-control" readonly="readonly"
|
||||
value="{{ item.name }}{% if variation %} – {{ variation.value }}{% endif %}">
|
||||
</div>
|
||||
</div>
|
||||
{% bootstrap_form form layout='horizontal' %}
|
||||
<div class="form-group">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<div class="help-block">
|
||||
{% blocktrans trimmed %}
|
||||
If tickets become available again, we will inform the first persons on the waiting list. If we notify you, you'll have 48 hours time to buy a ticket until we assign it to the next person on the list.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{% trans "Add me to the list" %}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@@ -7,6 +7,7 @@ import pretix.presale.views.locale
|
||||
import pretix.presale.views.order
|
||||
import pretix.presale.views.organizer
|
||||
import pretix.presale.views.user
|
||||
import pretix.presale.views.waiting
|
||||
|
||||
# This is not a valid Django URL configuration, as the final
|
||||
# configuration is done by the pretix.multidomain package.
|
||||
@@ -14,6 +15,7 @@ import pretix.presale.views.user
|
||||
event_patterns = [
|
||||
url(r'^cart/add$', pretix.presale.views.cart.CartAdd.as_view(), name='event.cart.add'),
|
||||
url(r'^cart/remove$', pretix.presale.views.cart.CartRemove.as_view(), name='event.cart.remove'),
|
||||
url(r'^waitinglist', pretix.presale.views.waiting.WaitingView.as_view(), name='event.waitinglist'),
|
||||
url(r'^checkout/start$', pretix.presale.views.checkout.CheckoutView.as_view(), name='event.checkout.start'),
|
||||
url(r'^redeem$', pretix.presale.views.cart.RedeemView.as_view(),
|
||||
name='event.redeem'),
|
||||
|
||||
76
src/pretix/presale/views/waiting.py
Normal file
76
src/pretix/presale/views/waiting.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from django.contrib import messages
|
||||
from django.shortcuts import redirect
|
||||
from django.utils import translation
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.views.generic import FormView
|
||||
|
||||
from ...base.models import Item, ItemVariation, WaitingListEntry
|
||||
from ...multidomain.urlreverse import eventreverse
|
||||
from ..forms.waitinglist import WaitingListForm
|
||||
|
||||
|
||||
class WaitingView(FormView):
|
||||
template_name = 'pretixpresale/event/waitinglist.html'
|
||||
form_class = WaitingListForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs['event'] = self.request.event
|
||||
kwargs['instance'] = WaitingListEntry(
|
||||
item=self.item_and_variation[0], variation=self.item_and_variation[1],
|
||||
event=self.request.event, locale=translation.get_language()
|
||||
)
|
||||
return kwargs
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data()
|
||||
ctx['event'] = self.request.event
|
||||
ctx['item'], ctx['variation'] = self.item_and_variation
|
||||
return ctx
|
||||
|
||||
@cached_property
|
||||
def item_and_variation(self):
|
||||
try:
|
||||
item = self.request.event.items.get(pk=self.request.GET.get('item'))
|
||||
if 'var' in self.request.GET:
|
||||
var = item.variations.get(pk=self.request.GET['var'])
|
||||
elif item.has_variations:
|
||||
return None
|
||||
else:
|
||||
var = None
|
||||
return item, var
|
||||
except (Item.DoesNotExist, ItemVariation.DoesNotExist):
|
||||
return None
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
self.request = request
|
||||
|
||||
if not self.request.event.settings.waiting_list_enabled:
|
||||
messages.error(request, _("Waiting lists are disabled for this event."))
|
||||
return redirect(eventreverse(self.request.event, 'presale:event.index'))
|
||||
|
||||
if not self.item_and_variation:
|
||||
messages.error(request, _("We could not identify the product you selected."))
|
||||
return redirect(eventreverse(self.request.event, 'presale:event.index'))
|
||||
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def form_valid(self, form):
|
||||
availability = (
|
||||
self.item_and_variation[1].check_quotas(count_waitinglist=False)
|
||||
if self.item_and_variation[1]
|
||||
else self.item_and_variation[0].check_quotas(count_waitinglist=False)
|
||||
)
|
||||
if availability[0] == 100:
|
||||
messages.error(self.request, _("You cannot add yourself to the waiting list as this product ist currently "
|
||||
"available."))
|
||||
return redirect(eventreverse(self.request.event, 'presale:event.index'))
|
||||
|
||||
form.save()
|
||||
messages.success(self.request, _("We've added you to the waiting list. You will receive "
|
||||
"an email as soon as tickets get available again."))
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
return eventreverse(self.request.event, 'presale:event.index')
|
||||
Reference in New Issue
Block a user