mirror of
https://github.com/Hopiu/django-model-utils.git
synced 2026-03-16 20:00:23 +00:00
Merge branch 'field-tracker-inheritance'
Conflicts: CHANGES.rst
This commit is contained in:
commit
15910e04e7
4 changed files with 35 additions and 3 deletions
|
|
@ -11,6 +11,8 @@ master (unreleased)
|
|||
``update_fields`` in which there are untracked fields. Thanks Mikhail
|
||||
Silonov. (Merge of GH-70, fixes GH-71).
|
||||
|
||||
* Fixed ``FieldTracker`` usage on inherited models. Fixes GH-57.
|
||||
|
||||
|
||||
1.4.0 (2013.06.03)
|
||||
------------------
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -25,9 +25,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)
|
||||
|
||||
|
||||
|
||||
|
|
@ -1114,6 +1114,16 @@ class FieldTrackerForeignKeyTests(FieldTrackerTestCase):
|
|||
self.assertCurrent(fk=self.instance.fk_id)
|
||||
|
||||
|
||||
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
|
||||
|
|
@ -1237,3 +1247,13 @@ class ModelTrackerForeignKeyTests(FieldTrackerForeignKeyTests):
|
|||
self.assertChanged(fk=self.old_fk)
|
||||
self.assertPrevious(fk=self.old_fk)
|
||||
self.assertCurrent(fk=self.instance.fk)
|
||||
|
||||
|
||||
class InheritedModelTrackerTests(ModelTrackerTests):
|
||||
|
||||
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'))
|
||||
|
|
|
|||
|
|
@ -71,10 +71,13 @@ class FieldTracker(object):
|
|||
self.fields = (field.attname for field in sender._meta.local_fields)
|
||||
self.fields = set(self.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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue