diff --git a/model_utils/models.py b/model_utils/models.py index 65503f5..a826a1a 100644 --- a/model_utils/models.py +++ b/model_utils/models.py @@ -28,6 +28,16 @@ class TimeStampedModel(models.Model): created = AutoCreatedField(_('created')) modified = AutoLastModifiedField(_('modified')) + def save(self, *args, **kwargs): + """ + Overriding the save method in order to make sure that + modified field is updated even if it is not given as + a parameter to the update field argument. + """ + if 'update_fields' in kwargs and 'modified' not in kwargs['update_fields']: + kwargs['update_fields'] += ['modified'] + super().save(*args, **kwargs) + class Meta: abstract = True diff --git a/tests/test_models/test_timestamped_model.py b/tests/test_models/test_timestamped_model.py index 9c07a67..86c6166 100644 --- a/tests/test_models/test_timestamped_model.py +++ b/tests/test_models/test_timestamped_model.py @@ -90,3 +90,31 @@ class TimeStampedModelTests(TestCase): self.assertEqual(t1.created, different_date2) self.assertNotEqual(t1.modified, different_date2) self.assertNotEqual(t1.modified, different_date) + + def test_save_with_update_fields_overrides_modified_provided(self): + ''' + Tests if the save method updated modified field + accordingly when update_fields is used as an argument + and modified is provided + ''' + with freeze_time(datetime(2020,1,1)): + t1 = TimeStamp.objects.create() + + with freeze_time(datetime(2020,1,2)): + t1.save(update_fields=['modified']) + + self.assertEqual(t1.modified, datetime(2020,1,2)) + + def test_save_with_update_fields_overrides_modified_not_provided(self): + ''' + Tests if the save method updated modified field + accordingly when update_fields is used as an argument + and modified is not provided + ''' + with freeze_time(datetime(2020,1,1)): + t1 = TimeStamp.objects.create() + + with freeze_time(datetime(2020,1,2)): + t1.save(update_fields=[]) + + self.assertEqual(t1.modified, datetime(2020,1,2))