add ChangedObject.stale
This commit is contained in:
parent
4e3da477e5
commit
15704762ed
3 changed files with 50 additions and 14 deletions
29
src/c3nav/editor/migrations/0006_auto_20170629_1222.py
Normal file
29
src/c3nav/editor/migrations/0006_auto_20170629_1222.py
Normal 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'),
|
||||
),
|
||||
]
|
|
@ -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))
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue