diff --git a/reversion_compare/admin.py b/reversion_compare/admin.py
index 1751e61e..94b6c80c 100644
--- a/reversion_compare/admin.py
+++ b/reversion_compare/admin.py
@@ -21,7 +21,6 @@
from django.utils.text import capfirst
from django.utils.translation import ugettext as _
-import reversion
from reversion.admin import VersionAdmin
from reversion.models import Version, VERSION_TYPE_CHOICES, VERSION_CHANGE, \
has_int_pk
@@ -30,7 +29,6 @@
from reversion_compare.helpers import html_diff, compare_queryset
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
-from reversion import get_adapter
logger = logging.getLogger(__name__)
@@ -196,14 +194,14 @@ def debug(self):
class CompareObjects(object):
- def __init__(self, field, field_name, obj, version1, version2):
+ def __init__(self, field, field_name, obj, version1, version2, manager):
self.field = field
self.field_name = field_name
self.obj = obj
model = self.obj.__class__
self.has_int_pk = has_int_pk(model)
- self.adapter = get_adapter(model) # VersionAdapter instance
+ self.adapter = manager.get_adapter(model) # VersionAdapter instance
# is a related field (ForeignKey, ManyToManyField etc.)
self.is_related = self.field.rel is not None
@@ -572,7 +570,7 @@ def compare(self, obj, version1, version2):
if self.compare_exclude and field_name in self.compare_exclude:
continue
- obj_compare = CompareObjects(field, field_name, obj, version1, version2)
+ obj_compare = CompareObjects(field, field_name, obj, version1, version2, self.revision_manager)
#obj_compare.debug()
is_related = obj_compare.is_related
@@ -615,7 +613,7 @@ def compare_view(self, request, object_id, extra_context=None):
object_id = unquote(object_id) # Underscores in primary key get quoted to "_5F"
obj = get_object_or_404(self.model, pk=object_id)
- queryset = reversion.get_for_object(obj)
+ queryset = self.revision_manager.get_for_object(obj)
version1 = get_object_or_404(queryset, pk=version_id1)
version2 = get_object_or_404(queryset, pk=version_id2)
diff --git a/reversion_compare/tests.py b/reversion_compare/tests.py
index 4a085bbd..8b7aff0b 100644
--- a/reversion_compare/tests.py
+++ b/reversion_compare/tests.py
@@ -27,6 +27,7 @@
# management.call_command("test", "reversion_compare.PersonPetModelTest", verbosity=2, traceback=True, interactive=False)
sys.exit()
+from django.core.urlresolvers import reverse
from django.db.models.loading import get_models, get_app
from django.test import TestCase
from django.contrib.auth.models import User
@@ -50,10 +51,11 @@
from reversion_compare import helpers
from reversion_compare_test_project.reversion_compare_test_app.models import SimpleModel, Person, Pet, \
- Factory, Car, VariantModel
+ Factory, Car, VariantModel, CustomModel
# Needs to import admin module to register all models via CompareVersionAdmin/VersionAdmin
import reversion_compare_test_project.reversion_compare_test_app.admin
+from reversion_compare_test_project.reversion_compare_test_app.admin import custom_revision_manager
class TestData(object):
@@ -221,6 +223,16 @@ def create_VariantModel_data(self):
print "version 1:", item
return item
+
+ def create_CustomModel_data(self):
+ with reversion.create_revision():
+ item1 = CustomModel.objects.create(text="version one")
+
+ if self.verbose:
+ print "version 1:", item1
+
+ return item1
+
class BaseTestCase(TestCase):
def setUp(self):
@@ -274,7 +286,9 @@ def test_admin_login(self):
def test_model_registering(self):
test_app = get_app(app_label="reversion_compare_test_app")
models = get_models(app_mod=test_app, include_auto_created=False, include_deferred=False, only_installed=True)
- self.assertEqual(len(reversion.get_registered_models()), len(models))
+ default_registered = len(reversion.get_registered_models())
+ custom_registered = len(custom_revision_manager.get_registered_models())
+ self.assertEqual(default_registered + custom_registered, len(models))
class SimpleModelTest(BaseTestCase):
@@ -648,4 +662,59 @@ def test_textfield(self):
+nisi ut aliquip ex ea commodo consequat. Duis added aute irure dolor in reprehenderit in voluptate velit
""")
self.assertNotContains(response, "first line")
- self.assertNotContains(response, "last line")
\ No newline at end of file
+ self.assertNotContains(response, "last line")
+
+
+class CustomModelTest(BaseTestCase):
+ "Test a model which uses a custom reversion manager."
+
+ def setUp(self):
+ super(CustomModelTest, self).setUp()
+ test_data = TestData(verbose=False)
+ self.item = test_data.create_CustomModel_data()
+
+ def test_initial_state(self):
+ "Test initial data creation and model registration."
+ self.assertTrue(custom_revision_manager.is_registered(CustomModel))
+ self.assertEqual(CustomModel.objects.count(), 1)
+ self.assertEqual(custom_revision_manager.get_for_object(self.item).count(), 1)
+ self.assertEqual(Revision.objects.all().count(), 1)
+
+ def test_text_diff(self):
+ "Generate a new revision and check for a correctly generated diff."
+ with reversion.create_revision():
+ self.item.text = "version two"
+ self.item.save()
+ queryset = custom_revision_manager.get_for_object(self.item)
+ version_ids = queryset.values_list("pk", flat=True)
+ self.assertEqual(len(version_ids), 2)
+ url_name = 'admin:%s_%s_compare' % (CustomModel._meta.app_label, CustomModel._meta.module_name)
+ diff_url = reverse(url_name, args=(self.item.pk, ))
+ data = {"version_id2": version_ids[0], "version_id1": version_ids[1]}
+ response = self.client.get(diff_url, data=data)
+ self.assertContains(response, "- version one")
+ self.assertContains(response, "+ version two")
+
+ def test_version_selection(self):
+ "Generate two revisions and view the version history selection."
+ with reversion.create_revision():
+ self.item.text = "version two"
+ self.item.save()
+ with reversion.create_revision():
+ self.item.text = "version three"
+ self.item.save()
+ queryset = custom_revision_manager.get_for_object(self.item)
+ version_ids = queryset.values_list("pk", flat=True)
+ self.assertEqual(len(version_ids), 3)
+ url_name = 'admin:%s_%s_history' % (CustomModel._meta.app_label, CustomModel._meta.module_name)
+ history_url = reverse(url_name, args=(self.item.pk, ))
+ response = self.client.get(history_url)
+ self.assertContainsHtml(response,
+ '',
+ '' % version_ids[0],
+ '' % version_ids[0],
+ '' % version_ids[1],
+ '' % version_ids[1],
+ '' % version_ids[2],
+ '' % version_ids[2],
+ )
\ No newline at end of file
diff --git a/reversion_compare_test_project/reversion_compare_test_app/admin.py b/reversion_compare_test_project/reversion_compare_test_app/admin.py
index e19caabb..e491fa37 100644
--- a/reversion_compare_test_project/reversion_compare_test_app/admin.py
+++ b/reversion_compare_test_project/reversion_compare_test_app/admin.py
@@ -19,9 +19,10 @@
from reversion_compare.helpers import html_diff
from reversion_compare_test_project.reversion_compare_test_app.models import SimpleModel, Factory, Car, Person, Pet,\
- VariantModel
+ VariantModel, CustomModel
from reversion.models import Revision, Version
+from reversion.revisions import RevisionManager
#------------------------------------------------------------------------------
@@ -77,6 +78,13 @@ class VariantModelAdmin(CompareVersionAdmin):
admin.site.register(VariantModel, VariantModelAdmin)
+custom_revision_manager = RevisionManager("custom")
+
+class CustomModelAdmin(CompareVersionAdmin):
+ revision_manager = custom_revision_manager
+admin.site.register(CustomModel, CustomModelAdmin)
+
+
"""
diff --git a/reversion_compare_test_project/reversion_compare_test_app/models.py b/reversion_compare_test_project/reversion_compare_test_app/models.py
index 8acf058f..9924537d 100644
--- a/reversion_compare_test_project/reversion_compare_test_app/models.py
+++ b/reversion_compare_test_project/reversion_compare_test_app/models.py
@@ -115,6 +115,11 @@ class VariantModel(models.Model):
#------------------------------------------------------------------------------
+
+class CustomModel(models.Model):
+ "Model which uses a custom version manager."
+ text = models.TextField()
+
"""
class ParentModel(models.Model):