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 +