Created
August 13, 2014 07:55
-
-
Save etianen/100eef35bf0e883d0de2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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