Fixed a bug causing KeyError when saving with the parameter update_fields in which there are untracked fields.

This commit is contained in:
Mikhail Silonov 2013-08-08 13:18:33 +04:00
parent 64a47ad861
commit b9f954074c
4 changed files with 29 additions and 3 deletions

View file

@ -19,3 +19,4 @@ Simon Meers <simon@simonmeers.com>
sayane
Trey Hunner <trey@treyhunner.com>
zyegfryed
Mikhail Silonov <silonov.pro>

View file

@ -7,6 +7,9 @@ master (unreleased)
* `Choices` now `__contains__` its Python identifier values. Thanks Keryn
Knight. (Merge of GH-69).
* Fixed a bug causing ``KeyError`` when saving with the parameter
``update_fields`` in which there are untracked fields.
1.4.0 (2013.06.03)
------------------

View file

@ -923,6 +923,16 @@ class FieldTrackedModelCustomTests(FieldTrackerTestCase,
self.instance.save()
self.assertCurrent(name='new age')
def test_update_fields(self):
# Django 1.4 doesn't have update_fields
if django.VERSION >= (1, 5, 0):
self.update_instance(name='retro', number=4)
self.assertChanged()
self.instance.name = 'new age'
self.instance.number = 8
self.instance.save(update_fields=['name', 'number'])
self.assertChanged()
class FieldTrackedModelAttributeTests(FieldTrackerTestCase):
@ -976,7 +986,7 @@ class FieldTrackedModelAttributeTests(FieldTrackerTestCase):
class FieldTrackedModelMultiTests(FieldTrackerTestCase,
FieldTrackerCommonTests):
FieldTrackerCommonTests):
tracked_class = TrackedMultiple

View file

@ -68,7 +68,8 @@ class FieldTracker(object):
def finalize_class(self, sender, **kwargs):
if self.fields is None:
self.fields = [field.attname for field in sender._meta.local_fields]
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)
setattr(sender, self.name, self)
@ -83,8 +84,19 @@ class FieldTracker(object):
original_save = instance.save
def save(**kwargs):
ret = original_save(**kwargs)
update_fields = kwargs.get('update_fields')
if not update_fields and update_fields is not None: # () or []
fields = update_fields
elif update_fields is None:
fields = None
else:
fields = (
field for field in update_fields if
field in self.fields
)
getattr(instance, self.attname).set_saved_fields(
fields=kwargs.get('update_fields'))
fields=fields
)
return ret
instance.save = save