From 1af09509ff07c75e61a7f68536dadf661622d777 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 14 Dec 2016 13:39:01 +0100 Subject: [PATCH] Prevent deletion of ordered variations --- src/pretix/control/forms/item.py | 25 ++++++++++++++++++++++++- src/pretix/control/views/item.py | 4 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 65d0b0240..2024ae9ca 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -1,10 +1,12 @@ import copy from django import forms +from django.core.exceptions import ValidationError from django.forms import BooleanField, ModelMultipleChoiceField +from django.forms.formsets import DELETION_FIELD_NAME from django.utils.translation import ugettext as __, ugettext_lazy as _ -from pretix.base.forms import I18nModelForm +from pretix.base.forms import I18nFormSet, I18nModelForm from pretix.base.i18n import I18nFormField, I18nTextarea from pretix.base.models import ( Item, ItemCategory, ItemVariation, Question, QuestionOption, Quota, @@ -153,6 +155,27 @@ class ItemUpdateForm(I18nModelForm): } +class ItemVariationsFormSet(I18nFormSet): + + def clean(self): + super().clean() + for f in self.forms: + if hasattr(f, '_delete_fail'): + f.fields['DELETE'].initial = False + f.fields['DELETE'].disabled = True + raise ValidationError( + message=_('The variation "%s" cannot be deleted because it has already been ordered by a user or ' + 'currently is in a users\'s cart. Please set the variation as "inactive" instead.'), + params=(str(f.instance),) + ) + + def _should_delete_form(self, form): + if form.instance.orderposition_set.exists() or form.instance.cartposition_set.exists(): + form._delete_fail = True + return False + return form.cleaned_data.get(DELETION_FIELD_NAME, False) + + class ItemVariationForm(I18nModelForm): class Meta: model = ItemVariation diff --git a/src/pretix/control/views/item.py b/src/pretix/control/views/item.py index 39ae76bc8..861094930 100644 --- a/src/pretix/control/views/item.py +++ b/src/pretix/control/views/item.py @@ -23,7 +23,7 @@ from pretix.base.models import ( ) from pretix.control.forms.item import ( CategoryForm, ItemCreateForm, ItemUpdateForm, ItemVariationForm, - QuestionForm, QuestionOptionForm, QuotaForm, + ItemVariationsFormSet, QuestionForm, QuestionOptionForm, QuotaForm, ) from pretix.control.permissions import ( EventPermissionRequiredMixin, event_permission_required, @@ -803,7 +803,7 @@ class ItemVariations(ItemDetailMixin, EventPermissionRequiredMixin, TemplateView def formset(self): formsetclass = inlineformset_factory( Item, ItemVariation, - form=ItemVariationForm, formset=I18nFormSet, + form=ItemVariationForm, formset=ItemVariationsFormSet, can_order=True, can_delete=True, extra=0 ) return formsetclass(self.request.POST if self.request.method == "POST" else None,