revoke old changes when adding an overwriting one
This commit is contained in:
parent
1d034a0741
commit
d0c3ba47d6
1 changed files with 34 additions and 7 deletions
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue