Fix #349 -- Allow to clone an event

This commit is contained in:
Raphael Michel
2017-01-01 20:35:53 +01:00
parent 1c54ca7b74
commit a0350d1444
4 changed files with 132 additions and 18 deletions

View File

@@ -26,22 +26,13 @@ class EventWizardFoundationForm(forms.Form):
self.fields['organizer'] = forms.ModelChoiceField(
label=_("Organizer"),
queryset=Organizer.objects.filter(
id__in=self.user.organizer_perms.filter(can_create_events=True).values_list('id', flat=True)
id__in=self.user.organizer_perms.filter(can_create_events=True).values_list('organizer', flat=True)
),
widget=forms.RadioSelect,
empty_label=None,
required=True
)
def clean_slug(self):
slug = self.cleaned_data['slug']
if Event.objects.filter(slug=slug, organizer=self.organizer).exists():
raise forms.ValidationError(
self.error_messages['duplicate_slug'],
code='duplicate_slug'
)
return slug
class EventWizardBasicsForm(I18nModelForm):
error_messages = {
@@ -100,6 +91,26 @@ class EventWizardBasicsForm(I18nModelForm):
return slug
class EventWizardCopyForm(forms.Form):
def __init__(self, *args, **kwargs):
kwargs.pop('organizer')
kwargs.pop('locales')
self.user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['copy_from_event'] = forms.ModelChoiceField(
label=_("Copy configuration from"),
queryset=Event.objects.filter(
id__in=self.user.event_perms.filter(
can_change_items=True, can_change_settings=True
).values_list('event', flat=True)
),
widget=forms.RadioSelect,
empty_label=_('Do not copy'),
required=True
)
class EventUpdateForm(I18nModelForm):
def clean_slug(self):
return self.instance.slug

View File

@@ -0,0 +1,20 @@
{% extends "pretixcontrol/events/create_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block form %}
<p>
{% blocktrans trimmed %}
Do you want to copy over your configuration from a different event? We will copy all
products, categories, quotas, and questions as well as general event settings.
{% endblocktrans %}
</p>
<div class="alert alert-info">
<strong>
{% blocktrans trimmed %}
Please make sure to review all settings extensively. You will probably still need to change some
settings manually, e.g. date and time settings and texts that contain the event name.
{% endblocktrans %}
</strong>
</div>
{% bootstrap_field form.copy_from_event layout="horizontal" %}
{% endblock %}

View File

@@ -9,7 +9,7 @@ from formtools.wizard.views import SessionWizardView
from pretix.base.models import Event, EventPermission
from pretix.control.forms.event import (
EventWizardBasicsForm, EventWizardFoundationForm,
EventWizardBasicsForm, EventWizardCopyForm, EventWizardFoundationForm,
)
@@ -27,17 +27,25 @@ class EventList(ListView):
)
def condition_copy(wizard):
return EventPermission.objects.filter(
user=wizard.request.user, can_change_settings=True, can_change_items=True
).exists()
class EventWizard(SessionWizardView):
form_list = [
('foundation', EventWizardFoundationForm),
('basics', EventWizardBasicsForm),
('copy', EventWizardCopyForm),
]
templates = {
'foundation': 'pretixcontrol/events/create_foundation.html',
'basics': 'pretixcontrol/events/create_basics.html'
'basics': 'pretixcontrol/events/create_basics.html',
'copy': 'pretixcontrol/events/create_copy.html',
}
condition_dict = {
'copy': condition_copy
}
def get_form_kwargs(self, step=None):
@@ -55,6 +63,7 @@ class EventWizard(SessionWizardView):
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')
copy_data = self.get_cleaned_data_for_step('copy')
with transaction.atomic():
event = form_dict['basics'].instance
@@ -63,10 +72,6 @@ class EventWizard(SessionWizardView):
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({
@@ -74,7 +79,16 @@ class EventWizard(SessionWizardView):
})
event.log_action('pretix.event.settings', user=self.request.user, data=logdata)
messages.success(self.request, _('The new event has been created.'))
if copy_data and copy_data['copy_from_event']:
from_event = copy_data['copy_from_event']
event.copy_data_from(from_event)
event.settings.set('timezone', basics_data['timezone'])
event.settings.set('locale', basics_data['locale'])
event.settings.set('locales', foundation_data['locales'])
messages.success(self.request, _('The new event has been created. You can now adjust the event settings in '
'detail.'))
return redirect(reverse('control:event.settings', kwargs={
'organizer': event.organizer.slug,
'event': event.slug,