revoke old changes when adding an overwriting one

This commit is contained in:
Laura Klünder 2017-06-20 13:36:09 +02:00
parent 1d034a0741
commit d0c3ba47d6

View file

@ -4,7 +4,7 @@ from collections import OrderedDict
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models, transaction
from django.db.models import Q from django.db.models import Q
from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor, ManyToManyDescriptor from django.db.models.fields.related_descriptors import ForwardManyToOneDescriptor, ManyToManyDescriptor
from django.urls import reverse from django.urls import reverse
@ -279,19 +279,34 @@ class ChangeSet(models.Model):
field_name=name, field_value=json.dumps(value, ensure_ascii=False)) field_name=name, field_value=json.dumps(value, ensure_ascii=False))
def add_update(self, obj, name, value, author=None): def add_update(self, obj, name, value, author=None):
return self._add_value('update', obj, name, value, author) with transaction.atomic():
change = self._add_value('update', obj, name, value, author)
change.other_changes().filter(field_name=name).update(revoked_by=change)
return change
def add_revoke(self, obj, name, author=None): def add_restore(self, obj, name, author=None):
return self._new_change(author=author, action='revoke', obj=obj, field_name=name) with transaction.atomic():
change = self._new_change(author=author, action='restore', obj=obj, field_name=name)
change.other_changes().filter(field_name=name).update(revoked_by=change)
return change
def add_m2m_add(self, obj, name, value, author=None): def add_m2m_add(self, obj, name, value, author=None):
return self._add_value('m2m_add', obj, name, value, author) with transaction.atomic():
change = self._add_value('m2m_add', obj, name, value, author)
change.other_changes().filter(field_name=name, field_value=change.field_value).update(revoked_by=change)
return change
def add_m2m_remove(self, obj, name, value, author=None): def add_m2m_remove(self, obj, name, value, author=None):
return self._add_value('m2m_remove', obj, name, value, author) with transaction.atomic():
change = self._add_value('m2m_remove', obj, name, value, author)
change.other_changes().filter(field_name=name, field_value=change.field_value).update(revoked_by=change)
return change
def add_delete(self, obj, author=None): def add_delete(self, obj, author=None):
return self._new_change(author=author, action='delete', obj=obj) with transaction.atomic():
change = self._new_change(author=author, action='delete', obj=obj)
change.other_changes().update(revoked_by=change)
return change
def serialize(self): def serialize(self):
return OrderedDict(( return OrderedDict((
@ -368,6 +383,18 @@ class Change(models.Model):
return 'c' + str(self.pk) return 'c' + str(self.pk)
raise TypeError('existing_model_pk or created_object have to be set.') raise TypeError('existing_model_pk or created_object have to be set.')
@property
def other_changes(self):
"""
get queryset of other active changes on the same object
"""
qs = self.changeset.changes.filter(~Q(pk=self.pk), model_name=self.model_name, revoked_by__isnull=True)
if self.existing_object_pk is not None:
return qs.filter(existing_object_pk=self.existing_object_pk)
if self.action == 'create':
return qs.filter(created_object_id=self.pk)
return qs.filter(Q(pk=self.created_object_id) | Q(created_object_id=self.created_object_id))
@property @property
def obj(self) -> ModelInstanceWrapper: def obj(self) -> ModelInstanceWrapper:
if self._set_object is not None: if self._set_object is not None: