From 15704762ed6ca8ba779001e4248062f466775e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 29 Jun 2017 14:51:46 +0200 Subject: [PATCH] add ChangedObject.stale --- .../migrations/0006_auto_20170629_1222.py | 29 ++++++++++++++++++ src/c3nav/editor/models/changedobject.py | 30 ++++++++++++------- src/c3nav/editor/models/changeset.py | 5 ++-- 3 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/c3nav/editor/migrations/0006_auto_20170629_1222.py diff --git a/src/c3nav/editor/migrations/0006_auto_20170629_1222.py b/src/c3nav/editor/migrations/0006_auto_20170629_1222.py new file mode 100644 index 00000000..5faf9268 --- /dev/null +++ b/src/c3nav/editor/migrations/0006_auto_20170629_1222.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.2 on 2017-06-29 12:22 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('editor', '0005_auto_20170627_0027'), + ] + + operations = [ + migrations.AlterModelOptions( + name='changedobject', + options={'base_manager_name': 'objects', 'ordering': ['created', 'pk'], 'verbose_name': 'Changed object', 'verbose_name_plural': 'Changed objects'}, + ), + migrations.AddField( + model_name='changedobject', + name='stale', + field=models.BooleanField(default=False, verbose_name='stale'), + ), + migrations.AlterField( + model_name='changedobject', + name='deleted', + field=models.BooleanField(default=False, verbose_name='object was deleted'), + ), + ] diff --git a/src/c3nav/editor/models/changedobject.py b/src/c3nav/editor/models/changedobject.py index 6347ab49..4e1eac5b 100644 --- a/src/c3nav/editor/models/changedobject.py +++ b/src/c3nav/editor/models/changedobject.py @@ -25,7 +25,8 @@ class ChangedObject(models.Model): updated_fields = JSONField(default={}, verbose_name=_('updated fields')) m2m_added = JSONField(default={}, verbose_name=_('added m2m values')) m2m_removed = JSONField(default={}, verbose_name=_('removed m2m values')) - deleted = models.BooleanField(default=False, verbose_name=_('new field value')) + deleted = models.BooleanField(default=False, verbose_name=_('object was deleted')) + stale = models.BooleanField(default=False, verbose_name=_('stale')) objects = ChangedObjectManager() @@ -107,7 +108,10 @@ class ChangedObject(models.Model): model = self.model_class pk = self.obj_pk - self.changeset.changed_objects.setdefault(model, {})[pk] = self + if not self.stale: + self.changeset.changed_objects.setdefault(model, {})[pk] = self + else: + self.changeset.changed_objects.get(model, {}).pop(pk, None) if self.is_created: if not self.deleted: @@ -257,19 +261,23 @@ class ChangedObject(models.Model): def save(self, *args, **kwargs): if self.changeset.proposed is not None or self.changeset.applied is not None: raise TypeError('can not add change object to uneditable changeset.') - if not self.does_something: - if self.pk is not None: - self.delete() - return False - if self.changeset.pk is None: - self.changeset.save() - self.changeset = self.changeset self.m2m_added = {name: tuple(values) for name, values in self._m2m_added_cache.items()} self.m2m_removed = {name: tuple(values) for name, values in self._m2m_removed_cache.items()} - super().save(*args, **kwargs) + if not self.does_something: + self.stale = True + if not self.stale: + if self.changeset.pk is None: + self.changeset.save() + self.changeset = self.changeset + else: + self.existing_object_pk = None if not self.changeset.fill_changes_cache(): self.update_changeset_cache() - return True + if not self.stale or self.pk is not None: + super().save(*args, **kwargs) + + def delete(self, **kwargs): + raise TypeError('changed objects can not be deleted directly.') def __repr__(self): return '' % (str(self.pk), str(self.changeset_id)) diff --git a/src/c3nav/editor/models/changeset.py b/src/c3nav/editor/models/changeset.py index 1bd4d1fb..78f3014a 100644 --- a/src/c3nav/editor/models/changeset.py +++ b/src/c3nav/editor/models/changeset.py @@ -1,6 +1,5 @@ from collections import OrderedDict from itertools import chain -from operator import attrgetter from django.apps import apps from django.conf import settings @@ -120,7 +119,7 @@ class ChangeSet(models.Model): return self.wrap_model(instance.__class__).create_wrapped_model_class()(self, instance) def relevant_changed_objects(self): - return self.changed_objects_set.exclude(existing_object_pk__isnull=True, deleted=True) + return self.changed_objects_set.exclude(stale=True).exclude(existing_object_pk__isnull=True, deleted=True) def fill_changes_cache(self, include_deleted_created=False): """ @@ -139,7 +138,7 @@ class ChangeSet(models.Model): return False if include_deleted_created: - qs = self.changed_objects_set.all() + qs = self.changed_objects_set.exclude(stale=True) else: qs = self.relevant_changed_objects()