From 5687d9836d236fc597469f12d748de17b72b7d3a Mon Sep 17 00:00:00 2001 From: Eran Rundstein Date: Thu, 6 Jun 2013 13:24:43 +0000 Subject: [PATCH 1/4] create basic failing test case for inherited models and tracker --- model_utils/tests/models.py | 7 +++++++ model_utils/tests/tests.py | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/model_utils/tests/models.py b/model_utils/tests/models.py index 99d33ad..06b3dea 100644 --- a/model_utils/tests/models.py +++ b/model_utils/tests/models.py @@ -271,6 +271,10 @@ class TrackedMultiple(models.Model): number_tracker = FieldTracker(fields=['number']) +class InheritedTracked(Tracked): + name2 = models.CharField(max_length=20) + + class ModelTracked(models.Model): name = models.CharField(max_length=20) number = models.IntegerField() @@ -300,6 +304,9 @@ class ModelTrackedMultiple(models.Model): name_tracker = ModelTracker(fields=['name']) number_tracker = ModelTracker(fields=['number']) +class InheritedModelTracked(ModelTracked): + name2 = models.CharField(max_length=20) + class StatusFieldDefaultFilled(models.Model): STATUS = Choices((0, "no", "No"), (1, "yes", "Yes")) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 78874d3..9c427bc 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -21,9 +21,9 @@ from model_utils.tests.models import ( InheritanceManagerTestChild2, TimeStamp, Post, Article, Status, StatusPlainTuple, TimeFrame, Monitored, StatusManagerAdded, TimeFrameManagerAdded, Dude, SplitFieldAbstractParent, Car, Spot, - ModelTracked, ModelTrackedFK, ModelTrackedNotDefault, ModelTrackedMultiple, + ModelTracked, ModelTrackedFK, ModelTrackedNotDefault, ModelTrackedMultiple, InheritedModelTracked, Tracked, TrackedFK, TrackedNotDefault, TrackedNonFieldAttr, - TrackedMultiple, StatusFieldDefaultFilled, StatusFieldDefaultNotFilled) + TrackedMultiple, InheritedTracked, StatusFieldDefaultFilled, StatusFieldDefaultNotFilled) @@ -1074,6 +1074,11 @@ class FieldTrackerForeignKeyTests(FieldTrackerTestCase): self.assertCurrent(fk=self.instance.fk_id) +# TODO test stuff with name2 +class InheritedFieldTrackerTests(FieldTrackerTests): + + tracked_class = InheritedTracked + class ModelTrackerTests(FieldTrackerTests): tracked_class = ModelTracked @@ -1197,3 +1202,9 @@ class ModelTrackerForeignKeyTests(FieldTrackerForeignKeyTests): self.assertChanged(fk=self.old_fk) self.assertPrevious(fk=self.old_fk) self.assertCurrent(fk=self.instance.fk) + + +# TODO test stuff with name2 +class InheritanceModelTrackerTests(ModelTrackerTests): + + tracked_class = InheritedModelTracked \ No newline at end of file From 98f078d718aca346d26a38eb1efc79b1be3598c9 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Mon, 29 Jul 2013 12:54:49 -0700 Subject: [PATCH 2/4] Allow FieldTracker to work in child models Fixes #57. --- model_utils/tracker.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/model_utils/tracker.py b/model_utils/tracker.py index 31fd0f2..39db70c 100644 --- a/model_utils/tracker.py +++ b/model_utils/tracker.py @@ -70,10 +70,13 @@ class FieldTracker(object): if self.fields is None: self.fields = [field.attname for field in sender._meta.local_fields] self.field_map = self.get_field_map(sender) - models.signals.post_init.connect(self.initialize_tracker, sender=sender) + models.signals.post_init.connect(self.initialize_tracker) + self.model_class = sender setattr(sender, self.name, self) def initialize_tracker(self, sender, instance, **kwargs): + if not isinstance(instance, self.model_class): + return # Only init instances of given model (including children) tracker = self.tracker_class(instance, self.fields, self.field_map) setattr(instance, self.attname, tracker) tracker.set_saved_fields() From e79539a39c007a22d89212d368ee1766ae9d8f57 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Mon, 29 Jul 2013 12:57:02 -0700 Subject: [PATCH 3/4] Note FieldTracker fix in CHANGES --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 0b2998f..bdc0d70 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,8 @@ CHANGES master (unreleased) ------------------- +- Fixed ``FieldTracker`` usage on inherited models. Fixes GH-57. + 1.4.0 (2013.06.03) ------------------ From 75646a1874bd27c121e88ecbf4d809670920cc5d Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Tue, 30 Jul 2013 10:16:43 -0700 Subject: [PATCH 4/4] Improve FieldTracker tests for inherited models --- model_utils/tests/tests.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 9c427bc..bc6acb9 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -1074,11 +1074,16 @@ class FieldTrackerForeignKeyTests(FieldTrackerTestCase): self.assertCurrent(fk=self.instance.fk_id) -# TODO test stuff with name2 class InheritedFieldTrackerTests(FieldTrackerTests): tracked_class = InheritedTracked + def test_child_fields_not_tracked(self): + self.name2 = 'test' + self.assertEqual(self.tracker.previous('name2'), None) + self.assertRaises(FieldError, self.tracker.has_changed, 'name2') + + class ModelTrackerTests(FieldTrackerTests): tracked_class = ModelTracked @@ -1204,7 +1209,11 @@ class ModelTrackerForeignKeyTests(FieldTrackerForeignKeyTests): self.assertCurrent(fk=self.instance.fk) -# TODO test stuff with name2 -class InheritanceModelTrackerTests(ModelTrackerTests): +class InheritedModelTrackerTests(ModelTrackerTests): - tracked_class = InheritedModelTracked \ No newline at end of file + tracked_class = InheritedModelTracked + + def test_child_fields_not_tracked(self): + self.name2 = 'test' + self.assertEqual(self.tracker.previous('name2'), None) + self.assertTrue(self.tracker.has_changed('name2'))