diff --git a/django/website/data_layer/models.py b/django/website/data_layer/models.py index d1d36eb3f664b73ccc00b8be5ace577e452eb50d..68779919e4345a5b6d7873d8fe6466a746181001 100644 --- a/django/website/data_layer/models.py +++ b/django/website/data_layer/models.py @@ -1,4 +1,5 @@ from django.db import models +from django.dispatch.dispatcher import receiver from django.utils import timezone from taxonomies.models import Term @@ -11,6 +12,10 @@ class DataLayerModel(models.Model): class Meta: abstract = True + def note_external_modification(self): + self.last_modified = timezone.now() + self.save() + class Message(DataLayerModel): body = models.TextField() @@ -45,3 +50,10 @@ class Message(DataLayerModel): # TODO: rename this class 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() diff --git a/django/website/data_layer/tests/item_tests.py b/django/website/data_layer/tests/item_tests.py index 8549187fb6fe3254db9cc4b35906b6003bf0232b..90ab4d95704b24deb4a866ee62519aafe63bddf6 100644 --- a/django/website/data_layer/tests/item_tests.py +++ b/django/website/data_layer/tests/item_tests.py @@ -4,6 +4,7 @@ from django.utils import timezone from factories import ItemFactory from ..models import Item +from taxonomies.tests.factories import TermFactory import datetime from mock import patch, MagicMock @@ -35,3 +36,17 @@ def test_last_modified_date_updates_on_body_change(): item.save() assert orig_last_modified < last_modified(item) + + +@pytest.mark.django_db +def test_last_modified_date_updates_on_category_change(): + item = ItemFactory() + magic_mock = MagicMock(wraps=timezone.now, + side_effect=now_iter(timezone.now())) + + with patch('django.utils.timezone.now', new=magic_mock): + orig_last_modified = last_modified(item) + term = TermFactory() + item.terms.add(term) + + assert orig_last_modified < last_modified(item)