mirror of
https://github.com/pretix/pretix.git
synced 2026-08-23 12:51:59 +00:00
Event creation: Use select2 for event/organizer selection and properly support admin sessions
This commit is contained in:
@@ -5,6 +5,7 @@ from django.core.exceptions import ValidationError
|
|||||||
from django.core.validators import RegexValidator, validate_email
|
from django.core.validators import RegexValidator, validate_email
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.forms import formset_factory
|
from django.forms import formset_factory
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.timezone import get_current_timezone_name
|
from django.utils.timezone import get_current_timezone_name
|
||||||
@@ -28,6 +29,7 @@ from pretix.control.forms import (
|
|||||||
ExtFileField, FontSelect, MultipleLanguagesWidget, SingleLanguageWidget,
|
ExtFileField, FontSelect, MultipleLanguagesWidget, SingleLanguageWidget,
|
||||||
SlugWidget, SplitDateTimeField, SplitDateTimePickerWidget,
|
SlugWidget, SplitDateTimeField, SplitDateTimePickerWidget,
|
||||||
)
|
)
|
||||||
|
from pretix.control.forms.widgets import Select2
|
||||||
from pretix.multidomain.urlreverse import build_absolute_uri
|
from pretix.multidomain.urlreverse import build_absolute_uri
|
||||||
from pretix.plugins.banktransfer.payment import BankTransfer
|
from pretix.plugins.banktransfer.payment import BankTransfer
|
||||||
from pretix.presale.style import get_fonts
|
from pretix.presale.style import get_fonts
|
||||||
@@ -52,16 +54,28 @@ class EventWizardFoundationForm(forms.Form):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.user = kwargs.pop('user')
|
self.user = kwargs.pop('user')
|
||||||
|
self.session = kwargs.pop('session')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
qs = Organizer.objects.all()
|
||||||
|
if not self.user.has_active_staff_session(self.session.session_key):
|
||||||
|
qs = qs.filter(
|
||||||
|
id__in=self.user.teams.filter(can_create_events=True).values_list('organizer', flat=True)
|
||||||
|
)
|
||||||
self.fields['organizer'] = forms.ModelChoiceField(
|
self.fields['organizer'] = forms.ModelChoiceField(
|
||||||
label=_("Organizer"),
|
label=_("Organizer"),
|
||||||
queryset=Organizer.objects.filter(
|
queryset=qs,
|
||||||
id__in=self.user.teams.filter(can_create_events=True).values_list('organizer', flat=True)
|
widget=Select2(
|
||||||
|
attrs={
|
||||||
|
'data-model-select2': 'generic',
|
||||||
|
'data-select2-url': reverse('control:organizers.select2') + '?can_create=1',
|
||||||
|
'data-placeholder': _('Organizer')
|
||||||
|
}
|
||||||
),
|
),
|
||||||
widget=forms.RadioSelect,
|
|
||||||
empty_label=None,
|
empty_label=None,
|
||||||
required=True
|
required=True
|
||||||
)
|
)
|
||||||
|
self.fields['organizer'].widget.choices = self.fields['organizer'].choices
|
||||||
|
|
||||||
if len(self.fields['organizer'].choices) == 1:
|
if len(self.fields['organizer'].choices) == 1:
|
||||||
self.fields['organizer'].initial = self.fields['organizer'].queryset.first()
|
self.fields['organizer'].initial = self.fields['organizer'].queryset.first()
|
||||||
|
|
||||||
@@ -117,6 +131,7 @@ class EventWizardBasicsForm(I18nModelForm):
|
|||||||
self.locales = kwargs.get('locales')
|
self.locales = kwargs.get('locales')
|
||||||
self.has_subevents = kwargs.pop('has_subevents')
|
self.has_subevents = kwargs.pop('has_subevents')
|
||||||
kwargs.pop('user')
|
kwargs.pop('user')
|
||||||
|
kwargs.pop('session')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.initial['timezone'] = get_current_timezone_name()
|
self.initial['timezone'] = get_current_timezone_name()
|
||||||
self.fields['locale'].choices = [(a, b) for a, b in settings.LANGUAGES if a in self.locales]
|
self.fields['locale'].choices = [(a, b) for a, b in settings.LANGUAGES if a in self.locales]
|
||||||
@@ -174,7 +189,9 @@ class EventChoiceField(forms.ModelChoiceField):
|
|||||||
class EventWizardCopyForm(forms.Form):
|
class EventWizardCopyForm(forms.Form):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def copy_from_queryset(user):
|
def copy_from_queryset(user, session):
|
||||||
|
if user.has_active_staff_session(session.session_key):
|
||||||
|
return Event.objects.all()
|
||||||
return Event.objects.filter(
|
return Event.objects.filter(
|
||||||
Q(organizer_id__in=user.teams.filter(
|
Q(organizer_id__in=user.teams.filter(
|
||||||
all_events=True, can_change_event_settings=True, can_change_items=True
|
all_events=True, can_change_event_settings=True, can_change_items=True
|
||||||
@@ -186,16 +203,25 @@ class EventWizardCopyForm(forms.Form):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
kwargs.pop('organizer')
|
kwargs.pop('organizer')
|
||||||
kwargs.pop('locales')
|
kwargs.pop('locales')
|
||||||
|
self.session = kwargs.pop('session')
|
||||||
kwargs.pop('has_subevents')
|
kwargs.pop('has_subevents')
|
||||||
self.user = kwargs.pop('user')
|
self.user = kwargs.pop('user')
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
self.fields['copy_from_event'] = EventChoiceField(
|
self.fields['copy_from_event'] = EventChoiceField(
|
||||||
label=_("Copy configuration from"),
|
label=_("Copy configuration from"),
|
||||||
queryset=EventWizardCopyForm.copy_from_queryset(self.user),
|
queryset=EventWizardCopyForm.copy_from_queryset(self.user, self.session),
|
||||||
widget=forms.RadioSelect,
|
widget=Select2(
|
||||||
|
attrs={
|
||||||
|
'data-model-select2': 'event',
|
||||||
|
'data-select2-url': reverse('control:events.typeahead') + '?can_copy=1',
|
||||||
|
'data-placeholder': _('Do not copy')
|
||||||
|
}
|
||||||
|
),
|
||||||
empty_label=_('Do not copy'),
|
empty_label=_('Do not copy'),
|
||||||
required=False
|
required=False
|
||||||
)
|
)
|
||||||
|
self.fields['copy_from_event'].widget.choices = self.fields['copy_from_event'].choices
|
||||||
|
|
||||||
|
|
||||||
class EventMetaValueForm(forms.ModelForm):
|
class EventMetaValueForm(forms.ModelForm):
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ class EventList(PaginationMixin, ListView):
|
|||||||
def condition_copy(wizard):
|
def condition_copy(wizard):
|
||||||
return (
|
return (
|
||||||
not wizard.clone_from and
|
not wizard.clone_from and
|
||||||
EventWizardCopyForm.copy_from_queryset(wizard.request.user).exists()
|
EventWizardCopyForm.copy_from_queryset(wizard.request.user, wizard.request.session).exists()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -176,7 +176,8 @@ class EventWizard(SafeSessionWizardView):
|
|||||||
|
|
||||||
def get_form_kwargs(self, step=None):
|
def get_form_kwargs(self, step=None):
|
||||||
kwargs = {
|
kwargs = {
|
||||||
'user': self.request.user
|
'user': self.request.user,
|
||||||
|
'session': self.request.session,
|
||||||
}
|
}
|
||||||
if step != 'foundation':
|
if step != 'foundation':
|
||||||
fdata = self.get_cleaned_data_for_step('foundation')
|
fdata = self.get_cleaned_data_for_step('foundation')
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from django.utils.timezone import make_aware
|
|||||||
from django.utils.translation import pgettext, ugettext as _
|
from django.utils.translation import pgettext, ugettext as _
|
||||||
|
|
||||||
from pretix.base.models import Organizer, User
|
from pretix.base.models import Organizer, User
|
||||||
|
from pretix.control.forms.event import EventWizardCopyForm
|
||||||
from pretix.control.permissions import event_permission_required
|
from pretix.control.permissions import event_permission_required
|
||||||
from pretix.helpers.daterange import daterange
|
from pretix.helpers.daterange import daterange
|
||||||
from pretix.helpers.i18n import i18ncomp
|
from pretix.helpers.i18n import i18ncomp
|
||||||
@@ -72,7 +73,13 @@ def event_list(request):
|
|||||||
page = int(request.GET.get('page', '1'))
|
page = int(request.GET.get('page', '1'))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
page = 1
|
page = 1
|
||||||
qs = request.user.get_events_with_any_permission(request).filter(
|
|
||||||
|
if 'can_copy' in request.GET:
|
||||||
|
qs = EventWizardCopyForm.copy_from_queryset(request.user, request.session)
|
||||||
|
else:
|
||||||
|
qs = request.user.get_events_with_any_permission(request)
|
||||||
|
|
||||||
|
qs.filter(
|
||||||
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) |
|
Q(name__icontains=i18ncomp(query)) | Q(slug__icontains=query) |
|
||||||
Q(organizer__name__icontains=i18ncomp(query)) | Q(organizer__slug__icontains=query)
|
Q(organizer__name__icontains=i18ncomp(query)) | Q(organizer__slug__icontains=query)
|
||||||
).annotate(
|
).annotate(
|
||||||
@@ -332,7 +339,10 @@ def organizer_select2(request):
|
|||||||
if term:
|
if term:
|
||||||
qs = qs.filter(Q(name__icontains=term) | Q(slug__icontains=term))
|
qs = qs.filter(Q(name__icontains=term) | Q(slug__icontains=term))
|
||||||
if not request.user.has_active_staff_session(request.session.session_key):
|
if not request.user.has_active_staff_session(request.session.session_key):
|
||||||
qs = qs.filter(pk__in=request.user.teams.values_list('organizer', flat=True))
|
if 'can_create' in request.GET:
|
||||||
|
qs = qs.filter(pk__in=request.user.teams.filter(can_create_events=True).values_list('organizer', flat=True))
|
||||||
|
else:
|
||||||
|
qs = qs.filter(pk__in=request.user.teams.values_list('organizer', flat=True))
|
||||||
|
|
||||||
total = qs.count()
|
total = qs.count()
|
||||||
pagesize = 20
|
pagesize = 20
|
||||||
|
|||||||
Reference in New Issue
Block a user