Skip to content

Instantly share code, notes, and snippets.

@etianen
Created August 13, 2014 07:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save etianen/100eef35bf0e883d0de2 to your computer and use it in GitHub Desktop.
Save etianen/100eef35bf0e883d0de2 to your computer and use it in GitHub Desktop.
from django.db import models
import reversion
from reversion.models import Revision
from django.db import transaction
from django.db.models.signals import m2m_changed
class M2MRevisionManager(reversion.revisions.RevisionManager):
def register(self, model=None, adapter_cls=reversion.VersionAdapter, **field_overrides):
m2m_fields = model._meta.local_many_to_many
for f in m2m_fields:
m2m_changed.connect(self._m2m_changed_receiver, f.rel.through)
pass
super(M2MRevisionManager, self).register(
model,
adapter_cls,
**field_overrides)
def _m2m_changed_receiver(self, instance, **kwargs):
if not kwargs['reverse']:
self._post_save_receiver(instance, **kwargs)
reversion_patched = M2MRevisionManager('m2mrevisions')
class DAGNode(models.Model):
parents = models.ManyToManyField('self', symmetrical=False, blank=True, related_name="children")
def __unicode__(self):
return unicode(self.id)
def print_revision_details(revisions):
for r in revisions:
print "Revision {0} has {1} versions".format(r.id, r.version_set.count())
for v in r.version_set.all():
print "\tVersion {0} for object {1} (type: {3}), serialized data: {2}".format(v.id, v.object_id, v.serialized_data, v.content_type)
def reversion_patched_test():
reversion_patched.register(DAGNode)
with transaction.atomic(), reversion.create_revision():
parent = DAGNode(id = 200)
parent.save()
with transaction.atomic(), reversion.create_revision():
child = DAGNode(id = 201)
child.save()
with transaction.atomic(), reversion.create_revision():
child.parents.add(parent)
reversion_patched.unregister(DAGNode)
print_revision_details(list(Revision.objects.all())[-2:])
# Calling reversion_patched_test() with clean database returns:
# Revision 2 has 1 versions
# Version 2 for object 201 (type: dag node), serialized data: [{"pk": 201, "model": "test_app.dagnode", "fields": {"parents": []}}]
# Revision 3 has 1 versions
# Version 3 for object 201 (type: dag node), serialized data: [{"pk": 201, "model": "test_app.dagnode", "fields": {"parents": [200]}}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment