Fix: include last-modified in doc etag (#13044)

This commit is contained in:
shamoon
2026-06-22 18:18:57 -07:00
committed by GitHub
parent 7bf2a9ff82
commit e75946847e
2 changed files with 27 additions and 4 deletions
+3 -3
View File
@@ -70,13 +70,13 @@ def suggestions_last_modified(request, pk: int) -> datetime | None:
def metadata_etag(request, pk: int) -> str | None:
"""
Metadata is extracted from the original file, so use its checksum as the
ETag
Metadata responses include metadata as well as document fields, so include
the modification time with the checksum so metadata-only changes invalidate cache.
"""
doc = resolve_effective_document_by_pk(pk, request).document
if doc is None:
return None
return doc.checksum
return f"{doc.checksum}:{doc.modified.isoformat()}"
def metadata_last_modified(request, pk: int) -> datetime | None:
@@ -1,7 +1,9 @@
from datetime import timedelta
from types import SimpleNamespace
from unittest import mock
from django.test import TestCase
from django.utils import timezone
from documents.conditionals import metadata_etag
from documents.conditionals import preview_etag
@@ -29,10 +31,31 @@ class TestConditionals(DirectoriesMixin, TestCase):
)
request = SimpleNamespace(query_params={})
self.assertEqual(metadata_etag(request, root.id), latest.checksum)
self.assertEqual(
metadata_etag(request, root.id),
f"{latest.checksum}:{latest.modified.isoformat()}",
)
self.assertEqual(preview_etag(request, root.id), latest.archive_checksum)
self.assertEqual(thumbnail_etag(request, root.id), latest.checksum)
def test_metadata_etag_changes_when_document_modified_changes(self) -> None:
doc = Document.objects.create(
title="doc",
checksum="same-checksum",
mime_type="application/pdf",
)
request = SimpleNamespace(query_params={})
original_etag = metadata_etag(request, doc.id)
new_modified = timezone.now() + timedelta(seconds=5)
Document.objects.filter(id=doc.id).update(modified=new_modified)
self.assertNotEqual(metadata_etag(request, doc.id), original_etag)
self.assertEqual(
metadata_etag(request, doc.id),
f"{doc.checksum}:{new_modified.isoformat()}",
)
def test_resolve_effective_doc_returns_none_for_invalid_or_unrelated_version(
self,
) -> None: