From a0aa65e392fcec3803e436ff33c091d76f27c6be Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 21 Jun 2015 22:25:28 +0200 Subject: [PATCH] Fixed versioning in the Quota admin --- src/pretix/base/models.py | 2 +- src/pretix/control/forms/item.py | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/models.py b/src/pretix/base/models.py index 8c8731b2ba..37379050cb 100644 --- a/src/pretix/base/models.py +++ b/src/pretix/base/models.py @@ -31,7 +31,7 @@ class Versionable(BaseVersionable): """ This behaves like clone(), but misses all the Many2Many-relation-handling. This is a performance optimization for cases in which we have to handle the Many2Many relations - by handy anyways. + by hand anyways. """ if not self.pk: raise ValueError('Instance must be saved before it can be cloned') diff --git a/src/pretix/control/forms/item.py b/src/pretix/control/forms/item.py index 8b486a750e..09719abf8b 100644 --- a/src/pretix/control/forms/item.py +++ b/src/pretix/control/forms/item.py @@ -1,3 +1,5 @@ +import copy +from django.db import models from django.forms import BooleanField from django.utils.translation import ugettext_lazy as _ from pretix.base.forms import VersionedModelForm, I18nModelForm @@ -46,9 +48,16 @@ class QuestionForm(VersionedModelForm): class QuotaForm(I18nModelForm): + """ + The form for quotas does not derive from VersionedModelForm as it does not + perform a 'full clone' as part of a performance optimization + """ + def __init__(self, **kwargs): items = kwargs['items'] del kwargs['items'] + instance = kwargs.get('instance', None) + self.original_instance = copy.copy(instance) if instance else None super().__init__(**kwargs) if hasattr(self, 'instance'): @@ -75,8 +84,19 @@ class QuotaForm(I18nModelForm): def save(self, commit=True): if self.instance.pk is not None and isinstance(self.instance, Versionable): - if self.has_changed(): - self.instance = self.instance.clone_shallow() + if self.has_changed() and self.original_instance: + new = self.instance + old = self.original_instance + clone = old.clone_shallow() + for f in type(self.instance)._meta.get_fields(): + if f.name not in ( + 'id', 'identity', 'version_start_date', 'version_end_date', + 'version_birth_date' + ) and not isinstance(f, ( + models.ManyToOneRel, models.ManyToManyRel, models.ManyToManyField + )): + setattr(clone, f.name, getattr(new, f.name)) + self.instance = clone return super().save(commit) class Meta: