diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 7799b6306b..fb71d98837 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -125,7 +125,7 @@ class QuotaForm(I18nModelForm): items = kwargs.pop('items', None) or self.event.items.prefetch_related('variations') self.original_instance = modelcopy(self.instance) if self.instance else None initial = kwargs.get('initial', {}) - if self.instance and self.instance.pk: + if self.instance and self.instance.pk and 'itemvars' not in initial: initial['itemvars'] = [str(i.pk) for i in self.instance.items.all()] + [ '{}-{}'.format(v.item_id, v.pk) for v in self.instance.variations.all() ] diff --git a/src/pretix/control/templates/pretixcontrol/items/categories.html b/src/pretix/control/templates/pretixcontrol/items/categories.html index 9e140ad20c..e07537bee0 100644 --- a/src/pretix/control/templates/pretixcontrol/items/categories.html +++ b/src/pretix/control/templates/pretixcontrol/items/categories.html @@ -45,6 +45,10 @@ + + + diff --git a/src/pretix/control/templates/pretixcontrol/items/quotas.html b/src/pretix/control/templates/pretixcontrol/items/quotas.html index c01c0067c7..94dbac96e8 100644 --- a/src/pretix/control/templates/pretixcontrol/items/quotas.html +++ b/src/pretix/control/templates/pretixcontrol/items/quotas.html @@ -77,6 +77,10 @@ {% include "pretixcontrol/items/fragment_quota_availability.html" with availability=q.availability closed=q.closed %} + + + diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 909bc6b9fb..dd5fae44b3 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -39,6 +39,7 @@ from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, ) from pretix.control.signals import item_forms, item_formsets +from pretix.helpers.models import modelcopy from . import ChartContainingView, CreateView, PaginationMixin, UpdateView @@ -189,6 +190,25 @@ class CategoryCreate(EventPermissionRequiredMixin, CreateView): 'event': self.request.event.slug, }) + @cached_property + def copy_from(self): + if self.request.GET.get("copy_from") and not getattr(self, 'object', None): + try: + return self.request.event.categories.get(pk=self.request.GET.get("copy_from")) + except ItemCategory.DoesNotExist: + pass + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + + if self.copy_from: + i = modelcopy(self.copy_from) + i.pk = None + kwargs['instance'] = i + else: + kwargs['instance'] = ItemCategory(event=self.request.event) + return kwargs + @transaction.atomic def form_valid(self, form): form.instance.event = self.request.event @@ -605,6 +625,29 @@ class QuotaCreate(EventPermissionRequiredMixin, CreateView): form.instance.log_action('pretix.event.quota.added', user=self.request.user, data=dict(form.cleaned_data)) return ret + @cached_property + def copy_from(self): + if self.request.GET.get("copy_from") and not getattr(self, 'object', None): + try: + return self.request.event.quotas.get(pk=self.request.GET.get("copy_from")) + except Quota.DoesNotExist: + pass + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + + if self.copy_from: + i = modelcopy(self.copy_from) + i.pk = None + kwargs['instance'] = i + kwargs.setdefault('initial', {}) + kwargs['initial']['itemvars'] = [str(i.pk) for i in self.copy_from.items.all()] + [ + '{}-{}'.format(v.item_id, v.pk) for v in self.copy_from.variations.all() + ] + else: + kwargs['instance'] = Quota(event=self.request.event) + return kwargs + def form_invalid(self, form): messages.error(self.request, _('We could not save your changes. See below for details.')) return super().form_invalid(form)