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;