From 423f33ebf6ebe88f94e088838324bcaf4b861ddb Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 6 Apr 2015 00:31:15 +0200 Subject: [PATCH] Fix a fatal malfunction of VersionedModelForm --- src/pretix/base/forms.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/forms.py b/src/pretix/base/forms.py index 196863fce..5f9a35594 100644 --- a/src/pretix/base/forms.py +++ b/src/pretix/base/forms.py @@ -1,3 +1,5 @@ +import copy +from django.db import models from django.forms.models import ModelFormMetaclass, BaseModelForm from django import forms from django.utils import six @@ -23,10 +25,26 @@ class VersionedBaseModelForm(BaseI18nModelForm): """ This is a helperclass to construct VersionedModelForm """ + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance', None) + self.original_instance = copy.copy(instance) if instance else None + super().__init__(*args, **kwargs) + 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() + if self.has_changed() and self.original_instance: + new = self.instance + old = self.original_instance + clone = old.clone() + 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)