Skip to content

Commit 2269f81

Browse files
committed
Fix TypeError in save when model inherits from both TimeStampModel and StatusModel. (Fixes GH-465)
1 parent 79ff8ea commit 2269f81

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

CHANGES.rst

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ CHANGES
44
Next release (tbc)
55
------------------
66
- Applied `isort` to codebase (Refs GH-#402)
7+
- Fix `TypeError` in save when model inherits from both TimeStampModel
8+
and StatusModel. (Fixes GH-465)
79

810
4.1.0 (2020-11-29)
911
------------------

model_utils/models.py

+6-10
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ def save(self, *args, **kwargs):
3232
a parameter to the update field argument.
3333
"""
3434
update_fields = kwargs.get('update_fields', None)
35-
if update_fields is not None:
36-
update_fields = set(update_fields)
37-
if update_fields:
38-
kwargs['update_fields'] = update_fields.union({'modified'})
35+
if update_fields:
36+
kwargs['update_fields'] = set(update_fields).union({'modified'})
3937

4038
super().save(*args, **kwargs)
4139

@@ -74,12 +72,10 @@ def save(self, *args, **kwargs):
7472
status_changed field is updated even if it is not given as
7573
a parameter to the update field argument.
7674
"""
77-
if (
78-
'update_fields' in kwargs
79-
and 'status' in kwargs['update_fields']
80-
and 'status_changed' not in kwargs['update_fields']
81-
):
82-
kwargs['update_fields'] += ['status_changed']
75+
update_fields = kwargs.get('update_fields', None)
76+
if update_fields and 'status' in update_fields:
77+
kwargs['update_fields'] = set(update_fields).union({'status_changed'})
78+
8379
super().save(*args, **kwargs)
8480

8581
class Meta:

tests/models.py

+10
Original file line numberDiff line numberDiff line change
@@ -447,3 +447,13 @@ class CustomNotPrimaryUUIDModel(models.Model):
447447

448448
class SaveSignalHandlingTestModel(SaveSignalHandlingModel):
449449
name = models.CharField(max_length=20)
450+
451+
452+
class TimeStampWithStatusModel(TimeStampedModel, StatusModel):
453+
STATUS = Choices(
454+
("active", _("active")),
455+
("deleted", _("deleted")),
456+
("on_hold", _("on hold")),
457+
)
458+
459+
test_field = models.PositiveSmallIntegerField(default=0)

tests/test_models/test_timestamped_model.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from freezegun import freeze_time
55
from parameterized import parameterized
66

7-
from tests.models import TimeStamp
7+
from tests.models import TimeStamp, TimeStampWithStatusModel
88

99

1010
class TimeStampedModelTests(TestCase):
@@ -149,3 +149,12 @@ def test_save_updates_modified_value_when_update_fields_explicitly_set_to_none(s
149149
t1.save(update_fields=None)
150150

151151
self.assertEqual(t1.modified, datetime(2020, 1, 2))
152+
153+
def test_model_inherit_timestampmodel_and_statusmodel(self):
154+
with freeze_time(datetime(2020, 1, 1)):
155+
t1 = TimeStampWithStatusModel.objects.create()
156+
157+
with freeze_time(datetime(2020, 1, 2)):
158+
t1.save(update_fields=['test_field', 'status'])
159+
160+
self.assertEqual(t1.modified, datetime(2020, 1, 2))

0 commit comments

Comments
 (0)