From ff609c29872bbdb5b780d6bb45506505d50cc084 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 20 Jul 2026 08:45:24 -0700 Subject: [PATCH] Change: update root modified timestamp on version changes (#13170) --- src/documents/consumer.py | 5 +++++ src/documents/tests/test_api_document_versions.py | 9 +++++++++ src/documents/tests/test_consumer.py | 4 ++++ src/documents/views.py | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/src/documents/consumer.py b/src/documents/consumer.py index f050c7416..7c01853c5 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -621,6 +621,11 @@ class ConsumerPlugin( else: original_document.save() + # Adding a version changes the effective document, so update root modified + Document.objects.filter(pk=root_doc.pk).update( + modified=timezone.now(), + ) + # Create a log entry for the version addition, if enabled if settings.AUDIT_LOG_ENABLED: from auditlog.models import ( # type: ignore[import-untyped] diff --git a/src/documents/tests/test_api_document_versions.py b/src/documents/tests/test_api_document_versions.py index a81b9d545..3ff32998f 100644 --- a/src/documents/tests/test_api_document_versions.py +++ b/src/documents/tests/test_api_document_versions.py @@ -1,5 +1,6 @@ from __future__ import annotations +import datetime from typing import TYPE_CHECKING from unittest import TestCase from unittest import mock @@ -10,6 +11,7 @@ from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldError from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone from rest_framework import status from rest_framework.test import APITestCase @@ -137,6 +139,8 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root_document=root, content="v2-content", ) + original_modified = timezone.now() - datetime.timedelta(days=1) + Document.objects.filter(pk=root.pk).update(modified=original_modified) with mock.patch("documents.search.get_backend"): resp = self.client.delete(f"/api/documents/{root.id}/versions/{v2.id}/") @@ -146,6 +150,7 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): self.assertEqual(resp.data["current_version_id"], v1.id) root.refresh_from_db() self.assertEqual(root.content, "root-content") + self.assertGreater(root.modified, original_modified) with mock.patch("documents.search.get_backend"): resp = self.client.delete(f"/api/documents/{root.id}/versions/{v1.id}/") @@ -326,6 +331,8 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): root_document=root, version_label="old", ) + original_modified = timezone.now() - datetime.timedelta(days=1) + Document.objects.filter(pk=root.pk).update(modified=original_modified) resp = self.client.patch( f"/api/documents/{root.id}/versions/{version.id}/", @@ -339,6 +346,8 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase): self.assertEqual(resp.data["version_label"], "Label 1") self.assertEqual(resp.data["id"], version.id) self.assertFalse(resp.data["is_root"]) + root.refresh_from_db() + self.assertGreater(root.modified, original_modified) def test_update_version_label_clears_on_blank(self) -> None: root = Document.objects.create( diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index c8a740a7e..fccc736f6 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -767,6 +767,8 @@ class TestConsumer( root_doc.archive_serial_number = 42 root_doc.save() + original_modified = timezone.now() - datetime.timedelta(days=1) + Document.objects.filter(pk=root_doc.pk).update(modified=original_modified) actor = User.objects.create_user( username="actor", email="actor@example.com", @@ -818,6 +820,8 @@ class TestConsumer( self.assertIsNone(version.archive_serial_number) self.assertEqual(version.original_filename, version_file.name) self.assertTrue(bool(version.content)) + root_doc.refresh_from_db() + self.assertGreater(root_doc.modified, original_modified) @override_settings(AUDIT_LOG_ENABLED=True) @mock.patch("documents.consumer.load_classifier") diff --git a/src/documents/views.py b/src/documents/views.py index 1591d0b06..20dbe9247 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -2057,6 +2057,8 @@ class DocumentViewSet( _backend.remove(version_doc.pk) version_doc_id = version_doc.id version_doc.delete() + root_doc.modified = timezone.now() + Document.objects.filter(pk=root_doc.pk).update(modified=root_doc.modified) _backend.add_or_update(root_doc) if settings.AUDIT_LOG_ENABLED: actor = ( @@ -2136,6 +2138,8 @@ class DocumentViewSet( old_label = version_doc.version_label version_doc.version_label = serializer.validated_data["version_label"] version_doc.save(update_fields=["version_label"]) + root_doc.modified = timezone.now() + Document.objects.filter(pk=root_doc.pk).update(modified=root_doc.modified) if settings.AUDIT_LOG_ENABLED and old_label != version_doc.version_label: actor = (