diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 7b2b6ed54..6ecbd024a 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -177,7 +177,7 @@ class EventWizardBasicsForm(I18nModelForm): return slug -class EventChoiceField(forms.ModelChoiceField): +class EventChoiceMixin: def label_from_instance(self, obj): return mark_safe('{}
{} ยท {}'.format( escape(str(obj)), @@ -186,6 +186,16 @@ class EventChoiceField(forms.ModelChoiceField): )) +class EventChoiceField(forms.ModelChoiceField): + pass + + +class SafeEventMultipleChoiceField(EventChoiceMixin, forms.ModelMultipleChoiceField): + def __init__(self, queryset, *args, **kwargs): + queryset = queryset.model.objects.none() + super().__init__(queryset, *args, **kwargs) + + class EventWizardCopyForm(forms.Form): @staticmethod diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py index 8649a0006..8f7c96516 100644 --- a/src/pretix/control/forms/organizer.py +++ b/src/pretix/control/forms/organizer.py @@ -16,6 +16,7 @@ from pretix.base.models import Device, Organizer, Team from pretix.control.forms import ( ExtFileField, FontSelect, MultipleLanguagesWidget, ) +from pretix.control.forms.event import SafeEventMultipleChoiceField from pretix.multidomain.models import KnownDomain from pretix.presale.style import get_fonts @@ -136,7 +137,9 @@ class TeamForm(forms.ModelForm): def __init__(self, *args, **kwargs): organizer = kwargs.pop('organizer') super().__init__(*args, **kwargs) - self.fields['limit_events'].queryset = organizer.events.all() + self.fields['limit_events'].queryset = organizer.events.all().order_by( + '-has_subevents', '-date_from' + ) class Meta: model = Team @@ -147,11 +150,12 @@ class TeamForm(forms.ModelForm): 'can_view_vouchers', 'can_change_vouchers'] widgets = { 'limit_events': forms.CheckboxSelectMultiple(attrs={ - 'data-inverse-dependency': '#id_all_events' + 'data-inverse-dependency': '#id_all_events', + 'class': 'scrolling-multiple-choice scrolling-multiple-choice-large', }), } field_classes = { - 'limit_events': SafeModelMultipleChoiceField + 'limit_events': SafeEventMultipleChoiceField } def clean(self): @@ -171,7 +175,9 @@ class DeviceForm(forms.ModelForm): def __init__(self, *args, **kwargs): organizer = kwargs.pop('organizer') super().__init__(*args, **kwargs) - self.fields['limit_events'].queryset = organizer.events.all() + self.fields['limit_events'].queryset = organizer.events.all().order_by( + '-has_subevents', '-date_from' + ) def clean(self): d = super().clean() @@ -185,11 +191,12 @@ class DeviceForm(forms.ModelForm): fields = ['name', 'all_events', 'limit_events'] widgets = { 'limit_events': forms.CheckboxSelectMultiple(attrs={ - 'data-inverse-dependency': '#id_all_events' + 'data-inverse-dependency': '#id_all_events', + 'class': 'scrolling-multiple-choice scrolling-multiple-choice-large', }), } field_classes = { - 'limit_events': SafeModelMultipleChoiceField + 'limit_events': SafeEventMultipleChoiceField } diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index fb9bccf7e..f7674b109 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -314,6 +314,9 @@ div.scrolling-multiple-choice, div.scrolling-choice { .radio:first-of-type, .checkbox:first-of-type { margin-top: 0; } + &.scrolling-multiple-choice-large { + height: 350px; + } } table td > .checkbox { margin: 0;