diff --git a/reversion_compare/mixins.py b/reversion_compare/mixins.py
index c35cce17..688531c3 100644
--- a/reversion_compare/mixins.py
+++ b/reversion_compare/mixins.py
@@ -47,7 +47,8 @@ def _get_compare_func(suffix):
func_name = "compare_%s" % suffix
if hasattr(self, func_name):
func = getattr(self, func_name)
- return func
+ if callable(func):
+ return func
# Try method in the name scheme: "compare_%s" % field_name
func = _get_compare_func(obj_compare.field_name)
diff --git a/reversion_compare_tests/admin.py b/reversion_compare_tests/admin.py
index 4152ab56..0f3e31a5 100644
--- a/reversion_compare_tests/admin.py
+++ b/reversion_compare_tests/admin.py
@@ -16,7 +16,7 @@
from reversion_compare.admin import CompareVersionAdmin
from .models import SimpleModel, Factory, Car, Person, Pet,\
- VariantModel, CustomModel, Identity
+ VariantModel, CustomModel, Identity, TemplateField
class SimpleModelAdmin(CompareVersionAdmin):
@@ -57,6 +57,12 @@ class CustomModelAdmin(CompareVersionAdmin):
admin.site.register(Identity, CustomModelAdmin)
+class TemplateFieldModelAdmin(CompareVersionAdmin):
+ pass
+
+admin.site.register(TemplateField, TemplateFieldModelAdmin)
+
+
"""
class RelatedModelInline(admin.StackedInline):
model = RelatedModel
diff --git a/reversion_compare_tests/models.py b/reversion_compare_tests/models.py
index 4bd6c0e6..9ca5ed31 100644
--- a/reversion_compare_tests/models.py
+++ b/reversion_compare_tests/models.py
@@ -157,6 +157,16 @@ class CustomModel(models.Model):
"""Model which uses a custom version manager."""
text = models.TextField()
+
+class TemplateField(models.Model):
+ """VersionAdmin in django-reversion has field compare_template that is str
+ Model used for check correct handling this case
+ Should be used ForeignKey for calling mixins.CompareMixin._get_compare_func
+ """
+ # some field for easy creating revisions
+ text = models.CharField(max_length=20)
+ template = models.ForeignKey(Person, blank=True, null=True)
+
"""
@python_2_unicode_compatible
class ParentModel(models.Model):
diff --git a/reversion_compare_tests/test_template_field_model.py b/reversion_compare_tests/test_template_field_model.py
new file mode 100644
index 00000000..f724308a
--- /dev/null
+++ b/reversion_compare_tests/test_template_field_model.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+# coding: utf-8
+
+"""
+ django-reversion-compare unittests
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ I used the setup from reversion_compare_test_project !
+
+ TODO:
+ * models.OneToOneField()
+ * models.IntegerField()
+
+ :copyleft: 2012-2016 by the django-reversion-compare team, see AUTHORS for more details.
+ :license: GNU GPL v3 or above, see LICENSE for more details.
+"""
+
+from __future__ import absolute_import, division, print_function
+
+import unittest
+
+from reversion.models import Version
+from reversion_compare import helpers
+
+try:
+ import django_tools
+except ImportError as err:
+ msg = (
+ "Please install django-tools for unittests"
+ " - https://github.com/jedie/django-tools/"
+ " - Original error: %s"
+ ) % err
+ raise ImportError(msg)
+
+from .test_utils.test_cases import BaseTestCase
+from .test_utils.test_data import TestData
+
+
+class TemplateFieldModelTest(BaseTestCase):
+ """
+ unittests that used reversion_compare_test_app.models.SimpleModel
+
+ Tests for the basic functions.
+ """
+ def setUp(self):
+ super(TemplateFieldModelTest, self).setUp()
+ test_data = TestData(verbose=False)
+ self.item1, self.item2 = test_data.create_TemplateField_data()
+
+ queryset = Version.objects.get_for_object(self.item1)
+ self.version_ids1 = queryset.values_list("pk", flat=True)
+
+ queryset = Version.objects.get_for_object(self.item2)
+ self.version_ids2 = queryset.values_list("pk", flat=True)
+
+ def test_diff(self):
+ response = self.client.get(
+ "/admin/reversion_compare_tests/templatefield/%s/history/compare/" % self.item1.pk,
+ data={"version_id2": self.version_ids1[0], "version_id1": self.version_ids1[1]}
+ )
+ # debug_response(response) # from django-tools
+ self.assertContainsHtml(
+ response,
+ '- version one',
+ '+ version two',
+ '
simply change the CharField text.', # edit comment + ) + + @unittest.skipIf(not hasattr(helpers, "diff_match_patch"), "No google-diff-match-patch available") + def test_google_diff_match_patch(self): + self.activate_google_diff_match_patch() + response = self.client.get( + "/admin/reversion_compare_tests/templatefield/%s/history/compare/" % self.item1.pk, + data={"version_id2": self.version_ids1[0], "version_id1": self.version_ids1[1]} + ) + # debug_response(response) # from django-tools + self.assertContainsHtml( + response, + """ +
version
+ one
+ two
+
simply change the CharField text.', # edit comment + ) diff --git a/reversion_compare_tests/test_utils/test_data.py b/reversion_compare_tests/test_utils/test_data.py index 166408d4..5459becf 100644 --- a/reversion_compare_tests/test_utils/test_data.py +++ b/reversion_compare_tests/test_utils/test_data.py @@ -38,7 +38,8 @@ ) % err raise ImportError(msg) -from reversion_compare_tests.models import SimpleModel, Person, Pet, Factory, Car, VariantModel, CustomModel, Identity +from reversion_compare_tests.models import SimpleModel, Person, Pet, Factory, Car, VariantModel, CustomModel, Identity, \ + TemplateField class TestData(object): @@ -392,3 +393,30 @@ def create_PersonIdentity_data(self): return person, identity + def create_TemplateField_data(self): + with create_revision(): + item1 = TemplateField.objects.create(text="version one") + + if self.verbose: + print("version 1:", item1) + + with create_revision(): + item1.text = "version two" + item1.save() + set_comment("simply change the CharField text.") + + if self.verbose: + print("version 2:", item1) + + for no in range(5): + with create_revision(): + if no == 0: + item2 = TemplateField.objects.create(text="v0") + set_comment("create v%i" % no) + else: + item2.text = "v%i" % no + item2.save() + set_comment("change to v%i" % no) + + return item1, item2 +