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