New event creation wizard

This commit is contained in:
Raphael Michel
2017-01-01 18:44:45 +01:00
parent 47fb61b762
commit e6f731ad77
12 changed files with 182 additions and 183 deletions

View File

@@ -2,13 +2,15 @@ from django.conf import settings
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.db import transaction
from django.utils.functional import cached_property
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, ListView, TemplateView
from django.views.generic import ListView
from formtools.wizard.views import SessionWizardView
from pretix.base.models import Event, EventPermission, OrganizerPermission
from pretix.control.forms.event import EventCreateForm, EventCreateSettingsForm
from pretix.control.permissions import OrganizerPermissionRequiredMixin
from pretix.base.models import Event, EventPermission
from pretix.control.forms.event import (
EventWizardBasicsForm, EventWizardFoundationForm,
)
class EventList(ListView):
@@ -25,76 +27,55 @@ class EventList(ListView):
)
class EventCreateStart(TemplateView):
template_name = 'pretixcontrol/events/start.html'
class EventWizard(SessionWizardView):
form_list = [
('foundation', EventWizardFoundationForm),
('basics', EventWizardBasicsForm),
]
templates = {
'foundation': 'pretixcontrol/events/create_foundation.html',
'basics': 'pretixcontrol/events/create_basics.html'
}
condition_dict = {
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx['organizers'] = [
p.organizer for p in OrganizerPermission.objects.filter(
user=self.request.user, can_create_events=True
).select_related("organizer")
]
return ctx
}
class EventCreate(OrganizerPermissionRequiredMixin, CreateView):
model = Event
form_class = EventCreateForm
template_name = 'pretixcontrol/events/create.html'
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):
kwargs = super().get_form_kwargs()
kwargs['organizer'] = self.request.organizer
def get_form_kwargs(self, step=None):
kwargs = {
'user': self.request.user
}
if step != 'foundation':
fdata = self.get_cleaned_data_for_step('foundation')
kwargs.update(fdata)
return kwargs
@transaction.atomic
def form_valid(self, form):
def get_template_names(self):
return [self.templates[self.steps.current]]
def done(self, form_list, form_dict, **kwargs):
foundation_data = self.get_cleaned_data_for_step('foundation')
basics_data = self.get_cleaned_data_for_step('basics')
with transaction.atomic():
event = form_dict['basics'].instance
event.organizer = foundation_data['organizer']
event.plugins = settings.PRETIX_PLUGINS_DEFAULT
form_dict['basics'].save()
EventPermission.objects.create(event=event, user=self.request.user)
event.settings.set('timezone', basics_data['timezone'])
event.settings.set('locale', basics_data['locale'])
event.settings.set('locales', foundation_data['locales'])
logdata = {}
for f in form_list:
logdata.update({
k: v for k, v in f.cleaned_data.items()
})
event.log_action('pretix.event.settings', user=self.request.user, data=logdata)
messages.success(self.request, _('The new event has been created.'))
form.instance.organizer = self.request.organizer
ret = super().form_valid(form)
EventPermission.objects.create(
event=form.instance, user=self.request.user,
)
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:
return reverse('control:event.settings', kwargs={
'organizer': self.request.organizer.slug,
'event': self.object.slug,
})
return redirect(reverse('control:event.settings', kwargs={
'organizer': event.organizer.slug,
'event': event.slug,
}))