diff --git a/src/pretix/base/models/event.py b/src/pretix/base/models/event.py index 465e5a9671..904b0d79ef 100644 --- a/src/pretix/base/models/event.py +++ b/src/pretix/base/models/event.py @@ -162,7 +162,11 @@ class Event(LoggedModel): """ Returns an object representing this event's settings """ - return SettingsProxy(self, type=EventSetting, parent=self.organizer) + try: + return SettingsProxy(self, type=EventSetting, parent=self.organizer) + except Organizer.DoesNotExist: + # Should only happen when creating new events + return SettingsProxy(self, type=EventSetting) @property def presale_has_ended(self): diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index dcbd147b91..3a7ad1add1 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -40,6 +40,29 @@ class EventCreateForm(I18nModelForm): return slug +class EventCreateSettingsForm(SettingsForm): + timezone = forms.ChoiceField( + choices=((a, a) for a in common_timezones), + label=_("Default timezone"), + ) + locales = forms.MultipleChoiceField( + choices=settings.LANGUAGES, + label=_("Available langauges"), + ) + locale = forms.ChoiceField( + choices=settings.LANGUAGES, + label=_("Default language"), + ) + + def clean(self): + data = super().clean() + if data['locale'] not in data['locales']: + raise ValidationError({ + 'locale': _('Your default locale must also be enebled for your event (see box above).') + }) + return data + + class EventUpdateForm(I18nModelForm): def clean_slug(self): return self.instance.slug diff --git a/src/pretix/control/templates/pretixcontrol/events/create.html b/src/pretix/control/templates/pretixcontrol/events/create.html index 45cc51bed4..64ef36a80c 100644 --- a/src/pretix/control/templates/pretixcontrol/events/create.html +++ b/src/pretix/control/templates/pretixcontrol/events/create.html @@ -15,6 +15,12 @@ {% bootstrap_field form.date_to layout="horizontal" %} {% bootstrap_field form.currency layout="horizontal" %} +
+ {% trans "Display settings" %} + {% bootstrap_field sform.locales layout="horizontal" %} + {% bootstrap_field sform.locale layout="horizontal" %} + {% bootstrap_field sform.timezone layout="horizontal" %} +
{% trans "Timeline" %} {% bootstrap_field form.presale_start layout="horizontal" %} diff --git a/src/pretix/control/views/main.py b/src/pretix/control/views/main.py index 8b1723461a..590d3c2d71 100644 --- a/src/pretix/control/views/main.py +++ b/src/pretix/control/views/main.py @@ -1,12 +1,15 @@ from django.conf import settings from django.contrib import messages from django.core.urlresolvers import reverse -from django.shortcuts import render +from django.db import transaction +from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from django.views.generic import CreateView, ListView, TemplateView from pretix.base.models import Event, EventPermission, OrganizerPermission -from pretix.control.forms.event import EventCreateForm +from pretix.control.forms.event import ( + EventCreateForm, EventCreateSettingsForm, EventSettingsForm, +) from pretix.control.permissions import OrganizerPermissionRequiredMixin @@ -44,7 +47,28 @@ class EventCreate(OrganizerPermissionRequiredMixin, CreateView): context_object_name = 'event' permission = 'can_create_events' + @cached_property + def sform(self): + return EventCreateSettingsForm( + obj=Event(), + prefix='settings', + data=self.request.POST if self.request.method == 'POST' else None + ) + + def post(self, request, *args, **kwargs): + form = self.get_form() + if form.is_valid() and self.sform.is_valid(): + return self.form_valid(form) + else: + return self.form_invalid(form) + + def get_context_data(self, *args, **kwargs) -> dict: + context = super().get_context_data(*args, **kwargs) + context['sform'] = self.sform + return context + def dispatch(self, request, *args, **kwargs): + self.object = Event() return super().dispatch(request, *args, **kwargs) def get_form_kwargs(self): @@ -52,6 +76,7 @@ class EventCreate(OrganizerPermissionRequiredMixin, CreateView): kwargs['organizer'] = self.request.organizer return kwargs + @transaction.atomic def form_valid(self, form): messages.success(self.request, _('The new event has been created.')) form.instance.organizer = self.request.organizer @@ -62,6 +87,12 @@ class EventCreate(OrganizerPermissionRequiredMixin, CreateView): self.object = form.instance self.object.plugins = settings.PRETIX_PLUGINS_DEFAULT self.object.save() + + self.sform.obj = form.instance + self.sform.save() + form.instance.log_action('pretix.event.settings', user=self.request.user, data={ + k: form.instance.settings.get(k) for k in self.sform.changed_data + }) return ret def get_success_url(self) -> str: