forked from CGM_Public/pretix_original
Added bulk creation form for vouchers
This commit is contained in:
@@ -71,7 +71,7 @@ class VoucherForm(I18nModelForm):
|
|||||||
self.instance.item = None
|
self.instance.item = None
|
||||||
self.instance.variation = None
|
self.instance.variation = None
|
||||||
|
|
||||||
if not self.instance.pk and Voucher.objects.filter(code=data['code'], event=self.instance.event).exists():
|
if 'code' in data and not self.instance.pk and Voucher.objects.filter(code=data['code'], event=self.instance.event).exists():
|
||||||
raise ValidationError(_('A voucher with this code already exists.'))
|
raise ValidationError(_('A voucher with this code already exists.'))
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@@ -80,3 +80,29 @@ class VoucherForm(I18nModelForm):
|
|||||||
super().save(commit)
|
super().save(commit)
|
||||||
|
|
||||||
return ['item']
|
return ['item']
|
||||||
|
|
||||||
|
|
||||||
|
class VoucherBulkForm(VoucherForm):
|
||||||
|
codes = forms.CharField(
|
||||||
|
widget=forms.Textarea,
|
||||||
|
label=_("Codes"),
|
||||||
|
help_text=_(
|
||||||
|
"Add one voucher code per line"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Voucher
|
||||||
|
localized_fields = '__all__'
|
||||||
|
fields = [
|
||||||
|
'valid_until', 'block_quota', 'allow_ignore_quota', 'price', 'tag', 'comment'
|
||||||
|
]
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
data = super().clean()
|
||||||
|
data['codes'] = [a.strip() for a in data['codes'].strip().split("\n")]
|
||||||
|
|
||||||
|
if Voucher.objects.filter(code__in=data['codes'], event=self.instance.event).exists():
|
||||||
|
raise ValidationError(_('A voucher with one of this codes already exists.'))
|
||||||
|
|
||||||
|
return data
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{% extends "pretixcontrol/items/base.html" %}
|
||||||
|
{% load i18n %}
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
{% block title %}{% trans "Voucher" %}{% endblock %}
|
||||||
|
{% block inside %}
|
||||||
|
<h1>{% trans "Create multiple voucher" %}</h1>
|
||||||
|
<form action="" method="post" class="form-horizontal">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form_errors form %}
|
||||||
|
<fieldset>
|
||||||
|
<legend>{% trans "Voucher codes" %}</legend>
|
||||||
|
{% bootstrap_field form.codes layout="horizontal" %}
|
||||||
|
</fieldset>
|
||||||
|
<fieldset>
|
||||||
|
<legend>{% trans "Voucher details" %}</legend>
|
||||||
|
{% bootstrap_field form.valid_until layout="horizontal" %}
|
||||||
|
{% bootstrap_field form.block_quota layout="horizontal" %}
|
||||||
|
{% bootstrap_field form.allow_ignore_quota layout="horizontal" %}
|
||||||
|
{% bootstrap_field form.price layout="horizontal" %}
|
||||||
|
{% bootstrap_field form.itemvar layout="horizontal" %}
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-md-9 col-md-offset-3">
|
||||||
|
<div class="controls">
|
||||||
|
<div class="alert alert-info">
|
||||||
|
{% blocktrans trimmed %}
|
||||||
|
If you choose "any product" for a specific quota and choose to reserve quota for this
|
||||||
|
voucher above, the product can still be unavailable to the voucher holder if another quota
|
||||||
|
associated with the product is sold out!
|
||||||
|
{% endblocktrans %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% bootstrap_field form.tag layout="horizontal" %}
|
||||||
|
{% bootstrap_field form.comment layout="horizontal" %}
|
||||||
|
</fieldset>
|
||||||
|
<div class="form-group submit-group">
|
||||||
|
<button type="submit" class="btn btn-primary btn-save">
|
||||||
|
{% trans "Save" %}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -19,11 +19,16 @@
|
|||||||
|
|
||||||
<a href="{% url "control:event.vouchers.add" organizer=request.event.organizer.slug event=request.event.slug %}"
|
<a href="{% url "control:event.vouchers.add" organizer=request.event.organizer.slug event=request.event.slug %}"
|
||||||
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new voucher" %}</a>
|
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create a new voucher" %}</a>
|
||||||
|
<a href="{% url "control:event.vouchers.bulk" organizer=request.event.organizer.slug event=request.event.slug %}"
|
||||||
|
class="btn btn-primary btn-lg"><i class="fa fa-plus"></i> {% trans "Create multiple new vouchers" %}</a>
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>
|
<p>
|
||||||
<a href="{% url "control:event.vouchers.add" organizer=request.event.organizer.slug event=request.event.slug %}"
|
<a href="{% url "control:event.vouchers.add" organizer=request.event.organizer.slug event=request.event.slug %}"
|
||||||
class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new voucher" %}</a>
|
class="btn btn-default"><i class="fa fa-plus"></i> {% trans "Create a new voucher" %}</a>
|
||||||
|
<a href="{% url "control:event.vouchers.bulk" organizer=request.event.organizer.slug event=request.event.slug %}"
|
||||||
|
class="btn btn-default"><i class="fa fa-plus"></i>
|
||||||
|
{% trans "Create multiple new vouchers" %}</a>
|
||||||
</p>
|
</p>
|
||||||
<form class="form-inline helper-display-inline" action="" method="get">
|
<form class="form-inline helper-display-inline" action="" method="get">
|
||||||
<input type="text" name="search" class="form-control" placeholder="{% trans "Search voucher" %}"
|
<input type="text" name="search" class="form-control" placeholder="{% trans "Search voucher" %}"
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ urlpatterns = [
|
|||||||
url(r'^vouchers/(?P<voucher>\d+)/delete$', vouchers.VoucherDelete.as_view(),
|
url(r'^vouchers/(?P<voucher>\d+)/delete$', vouchers.VoucherDelete.as_view(),
|
||||||
name='event.voucher.delete'),
|
name='event.voucher.delete'),
|
||||||
url(r'^vouchers/add$', vouchers.VoucherCreate.as_view(), name='event.vouchers.add'),
|
url(r'^vouchers/add$', vouchers.VoucherCreate.as_view(), name='event.vouchers.add'),
|
||||||
|
url(r'^vouchers/bulk_add$', vouchers.VoucherBulkCreate.as_view(), name='event.vouchers.bulk'),
|
||||||
url(r'^orders/(?P<code>[0-9A-Z]+)/transition$', orders.OrderTransition.as_view(),
|
url(r'^orders/(?P<code>[0-9A-Z]+)/transition$', orders.OrderTransition.as_view(),
|
||||||
name='event.order.transition'),
|
name='event.order.transition'),
|
||||||
url(r'^orders/(?P<code>[0-9A-Z]+)/resend$', orders.OrderResendLink.as_view(),
|
url(r'^orders/(?P<code>[0-9A-Z]+)/resend$', orders.OrderResendLink.as_view(),
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import copy
|
||||||
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.urlresolvers import resolve, reverse
|
from django.core.urlresolvers import resolve, reverse
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
@@ -7,7 +9,7 @@ from django.utils.translation import ugettext_lazy as _
|
|||||||
from django.views.generic import CreateView, DeleteView, ListView, UpdateView
|
from django.views.generic import CreateView, DeleteView, ListView, UpdateView
|
||||||
|
|
||||||
from pretix.base.models import Voucher
|
from pretix.base.models import Voucher
|
||||||
from pretix.control.forms.vouchers import VoucherForm
|
from pretix.control.forms.vouchers import VoucherBulkForm, VoucherForm
|
||||||
from pretix.control.permissions import EventPermissionRequiredMixin
|
from pretix.control.permissions import EventPermissionRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
@@ -125,3 +127,38 @@ class VoucherCreate(EventPermissionRequiredMixin, CreateView):
|
|||||||
ret = super().form_valid(form)
|
ret = super().form_valid(form)
|
||||||
form.instance.log_action('pretix.voucher.added', data=dict(form.cleaned_data), user=self.request.user)
|
form.instance.log_action('pretix.voucher.added', data=dict(form.cleaned_data), user=self.request.user)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
class VoucherBulkCreate(EventPermissionRequiredMixin, CreateView):
|
||||||
|
model = Voucher
|
||||||
|
form_class = VoucherBulkForm
|
||||||
|
template_name = 'pretixcontrol/vouchers/bulk.html'
|
||||||
|
permission = 'can_change_vouchers'
|
||||||
|
context_object_name = 'voucher'
|
||||||
|
|
||||||
|
def get_success_url(self) -> str:
|
||||||
|
return reverse('control:event.vouchers', kwargs={
|
||||||
|
'organizer': self.request.event.organizer.slug,
|
||||||
|
'event': self.request.event.slug,
|
||||||
|
})
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
kwargs = super().get_form_kwargs()
|
||||||
|
kwargs['instance'] = Voucher(event=self.request.event)
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
@transaction.atomic()
|
||||||
|
def form_valid(self, form):
|
||||||
|
for code in form.cleaned_data['codes']:
|
||||||
|
obj = copy.copy(form.instance)
|
||||||
|
obj.event = self.request.event
|
||||||
|
obj.code = code
|
||||||
|
data = dict(form.cleaned_data)
|
||||||
|
data['code'] = code
|
||||||
|
data['bulk'] = True
|
||||||
|
del data['codes']
|
||||||
|
obj.save()
|
||||||
|
obj.log_action('pretix.voucher.added', data=data, user=self.request.user)
|
||||||
|
|
||||||
|
messages.success(self.request, _('The new vouchers have been created.'))
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|||||||
Reference in New Issue
Block a user