add ChangedObject.stale

This commit is contained in:
Laura Klünder 2017-06-29 14:51:46 +02:00
parent 4e3da477e5
commit 15704762ed
3 changed files with 50 additions and 14 deletions

View file

@ -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'),
),
]

View file

@ -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 '<ChangedObject #%s on ChangeSet #%s>' % (str(self.pk), str(self.changeset_id))

View file

@ -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()