From 1030e8ca27fab885b0aa4f2fdf03b8fa6f648a98 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:03:19 -0700 Subject: [PATCH] use the helpers --- src/documents/models.py | 10 ++++++---- src/documents/serialisers.py | 9 ++++++--- src/documents/views.py | 16 ++++++++-------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/documents/models.py b/src/documents/models.py index e11a64d0f..01b87ba56 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -372,6 +372,10 @@ class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager- For version documents, this is always the document's own content. If the queryset already annotated ``effective_content``, that value is used. """ + # Here to avoid circular import + from documents.versioning import sort_versions_newest_first + from documents.versioning import versions_newest_first + if hasattr(self, "effective_content"): return getattr(self, "effective_content") @@ -388,12 +392,10 @@ class Document(SoftDeleteModel, ModelWithOwner): # type: ignore[django-manager- # Empty list means prefetch ran and found no versions — use own content. if not prefetched_versions: return self.content - latest_prefetched = max(prefetched_versions, key=lambda doc: doc.id) - return latest_prefetched.content + return sort_versions_newest_first(prefetched_versions)[0].content latest_version_content = ( - Document.objects.filter(root_document=self) - .order_by("-id") + versions_newest_first(Document.objects.filter(root_document=self)) .values_list("content", flat=True) .first() ) diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 2125457a8..6ec8ba7f4 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -88,6 +88,7 @@ from documents.templating.utils import convert_format_str_to_template_format from documents.templating.workflows import validate_workflow_template from documents.validators import uri_validator from documents.validators import url_validator +from documents.versioning import sort_versions_newest_first if TYPE_CHECKING: from collections.abc import Iterable @@ -1116,9 +1117,13 @@ class DocumentSerializer( "added", "checksum", "version_label", + "root_document_id", + "version_index", ) versions = [*versions_qs, root_doc] + versions = sort_versions_newest_first(versions) + def build_info(doc: Document) -> _DocumentVersionInfo: return { "id": doc.id, @@ -1128,9 +1133,7 @@ class DocumentSerializer( "is_root": doc.id == root_doc.id, } - info = [build_info(doc) for doc in versions] - info.sort(key=lambda item: item["id"], reverse=True) - return info + return [build_info(doc) for doc in versions] def get_original_file_name(self, obj) -> str | None: return obj.original_filename diff --git a/src/documents/views.py b/src/documents/views.py index c479fa4ed..73752043b 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -233,6 +233,7 @@ from documents.versioning import get_latest_version_for_root from documents.versioning import get_request_version_param from documents.versioning import get_root_document from documents.versioning import resolve_requested_version_for_root +from documents.versioning import versions_newest_first from paperless import version from paperless.celery import app as celery_app from paperless.config import AIConfig @@ -1076,9 +1077,9 @@ class DocumentViewSet( def get_queryset(self): latest_version_content = Subquery( - Document.objects.filter(root_document=OuterRef("pk")) - .order_by("-id") - .values("content")[:1], + versions_newest_first( + Document.objects.filter(root_document=OuterRef("pk")), + ).values("content")[:1], ) # A correlated subquery avoids the LEFT JOIN + Count() this used to # be, which forced a GROUP BY aggregate over every matching document @@ -1114,6 +1115,7 @@ class DocumentViewSet( "checksum", "version_label", "root_document_id", + "version_index", ), ), "tags", @@ -2134,11 +2136,9 @@ class DocumentViewSet( }, ) - current = ( - Document.objects.filter(Q(id=root_doc.id) | Q(root_document=root_doc)) - .order_by("-id") - .first() - ) + current = versions_newest_first( + Document.objects.filter(Q(id=root_doc.id) | Q(root_document=root_doc)), + ).first() document_updated.send( sender=self.__class__,