From 19a41aee7699e02fb60a5d50da7433e64d4216d6 Mon Sep 17 00:00:00 2001 From: Martin Burchell <martinb@aptivate.org> Date: Wed, 29 Jul 2015 15:04:10 +0100 Subject: [PATCH] Fixed multiple updates of item last_modified field --- django/website/data_layer/models.py | 7 ++++--- django/website/data_layer/tests/item_tests.py | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/django/website/data_layer/models.py b/django/website/data_layer/models.py index 68779919..3970173f 100644 --- a/django/website/data_layer/models.py +++ b/django/website/data_layer/models.py @@ -13,7 +13,7 @@ class DataLayerModel(models.Model): abstract = True def note_external_modification(self): - self.last_modified = timezone.now() + # This will set the last_modified field self.save() @@ -55,5 +55,6 @@ Item = Message @receiver(models.signals.m2m_changed, sender=Item.terms.through, dispatch_uid="data_layer.models.terms_signal_handler") def terms_signal_handler(sender, **kwargs): - instance = kwargs.get('instance') - instance.note_external_modification() + if kwargs.get('action') == 'post_add': + instance = kwargs.get('instance') + instance.note_external_modification() diff --git a/django/website/data_layer/tests/item_tests.py b/django/website/data_layer/tests/item_tests.py index 90ab4d95..665588e2 100644 --- a/django/website/data_layer/tests/item_tests.py +++ b/django/website/data_layer/tests/item_tests.py @@ -17,13 +17,23 @@ def last_modified(item): # Ensure value of "now" always increases by amount sufficient # to show up as a change, even if db resolution for datetime # is one second. +def time_granularity(): + return datetime.timedelta(hours=1) + + def now_iter(start): t = start while True: - t += datetime.timedelta(hours=1) + t += time_granularity() yield t +def num_updates(old_time, new_time): + elapsed_time = new_time - old_time + + return elapsed_time.seconds / time_granularity().seconds + + @pytest.mark.django_db def test_last_modified_date_updates_on_body_change(): item = ItemFactory() @@ -35,7 +45,7 @@ def test_last_modified_date_updates_on_body_change(): item.body = 'replacement text' item.save() - assert orig_last_modified < last_modified(item) + assert num_updates(orig_last_modified, last_modified(item)) == 1 @pytest.mark.django_db @@ -49,4 +59,4 @@ def test_last_modified_date_updates_on_category_change(): term = TermFactory() item.terms.add(term) - assert orig_last_modified < last_modified(item) + assert num_updates(orig_last_modified, last_modified(item)) == 1 -- GitLab