Badges: Allow to disable per-product

This commit is contained in:
Raphael Michel
2019-02-01 16:20:30 +01:00
parent c9415cba2b
commit f77b551aa6
7 changed files with 113 additions and 5 deletions

View File

@@ -1,4 +1,6 @@
from django import forms
from django.forms import Field
from django.forms.models import ModelChoiceIterator
from django.utils.translation import ugettext_lazy as _
from pretix.plugins.badges.models import BadgeItem, BadgeLayout
@@ -10,10 +12,40 @@ class BadgeLayoutForm(forms.ModelForm):
fields = ('name',)
NoLayoutSingleton = BadgeLayout(pk='-')
class BadgeLayoutIterator(ModelChoiceIterator):
def __iter__(self):
yield ("-", _("(Do not print badges)"))
yield from super().__iter__()
def __len__(self):
return super().__len__() + 1
class BadgeLayoutChoiceField(forms.ModelChoiceField):
iterator = BadgeLayoutIterator
def to_python(self, value):
if value == '-':
return NoLayoutSingleton
return super().to_python(value)
def validate(self, value):
if value == '-':
return '-'
return Field.validate(self, value)
class BadgeItemForm(forms.ModelForm):
layout = BadgeLayoutChoiceField(queryset=BadgeLayout.objects.none())
class Meta:
model = BadgeItem
fields = ('layout',)
exclude = ('layout',)
def __init__(self, *args, **kwargs):
event = kwargs.pop('event')
@@ -22,6 +54,10 @@ class BadgeItemForm(forms.ModelForm):
self.fields['layout'].empty_label = _('(Event default)')
self.fields['layout'].queryset = event.badge_layouts.all()
self.fields['layout'].required = False
if self.instance.pk and not self.instance.layout_id:
self.initial['layout'] = NoLayoutSingleton
elif self.instance.layout:
self.initial['layout'] = self.instance.layout
def save(self, commit=True):
if self.cleaned_data['layout'] is None:
@@ -29,5 +65,9 @@ class BadgeItemForm(forms.ModelForm):
self.instance.delete()
else:
return
elif self.cleaned_data['layout'] is NoLayoutSingleton:
self.instance.layout = None
self.instance.save()
else:
self.instance.layout = self.cleaned_data['layout']
return super().save(commit=commit)