mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-02-14 00:09:35 -06:00
Ah, index should handle delete, update root when version changed
This commit is contained in:
@@ -722,6 +722,9 @@ def add_to_index(sender, document, **kwargs) -> None:
|
|||||||
from documents import index
|
from documents import index
|
||||||
|
|
||||||
index.add_or_update_document(document)
|
index.add_or_update_document(document)
|
||||||
|
if document.root_document_id is not None and document.root_document is not None:
|
||||||
|
# keep in sync when a new version is consumed.
|
||||||
|
index.add_or_update_document(document.root_document)
|
||||||
|
|
||||||
|
|
||||||
def run_workflows_added(
|
def run_workflows_added(
|
||||||
|
|||||||
@@ -133,7 +133,10 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
|
|||||||
content="v2-content",
|
content="v2-content",
|
||||||
)
|
)
|
||||||
|
|
||||||
with mock.patch("documents.index.remove_document_from_index"):
|
with (
|
||||||
|
mock.patch("documents.index.remove_document_from_index"),
|
||||||
|
mock.patch("documents.index.add_or_update_document"),
|
||||||
|
):
|
||||||
resp = self.client.delete(f"/api/documents/{root.id}/versions/{v2.id}/")
|
resp = self.client.delete(f"/api/documents/{root.id}/versions/{v2.id}/")
|
||||||
|
|
||||||
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
||||||
@@ -142,7 +145,10 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
|
|||||||
root.refresh_from_db()
|
root.refresh_from_db()
|
||||||
self.assertEqual(root.content, "root-content")
|
self.assertEqual(root.content, "root-content")
|
||||||
|
|
||||||
with mock.patch("documents.index.remove_document_from_index"):
|
with (
|
||||||
|
mock.patch("documents.index.remove_document_from_index"),
|
||||||
|
mock.patch("documents.index.add_or_update_document"),
|
||||||
|
):
|
||||||
resp = self.client.delete(f"/api/documents/{root.id}/versions/{v1.id}/")
|
resp = self.client.delete(f"/api/documents/{root.id}/versions/{v1.id}/")
|
||||||
|
|
||||||
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
||||||
@@ -165,7 +171,10 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
|
|||||||
)
|
)
|
||||||
version_id = version.id
|
version_id = version.id
|
||||||
|
|
||||||
with mock.patch("documents.index.remove_document_from_index"):
|
with (
|
||||||
|
mock.patch("documents.index.remove_document_from_index"),
|
||||||
|
mock.patch("documents.index.add_or_update_document"),
|
||||||
|
):
|
||||||
resp = self.client.delete(
|
resp = self.client.delete(
|
||||||
f"/api/documents/{root.id}/versions/{version_id}/",
|
f"/api/documents/{root.id}/versions/{version_id}/",
|
||||||
)
|
)
|
||||||
@@ -232,7 +241,10 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
|
|||||||
root_document=root,
|
root_document=root,
|
||||||
)
|
)
|
||||||
|
|
||||||
with mock.patch("documents.index.remove_document_from_index"):
|
with (
|
||||||
|
mock.patch("documents.index.remove_document_from_index"),
|
||||||
|
mock.patch("documents.index.add_or_update_document"),
|
||||||
|
):
|
||||||
resp = self.client.delete(
|
resp = self.client.delete(
|
||||||
f"/api/documents/{version.id}/versions/{version.id}/",
|
f"/api/documents/{version.id}/versions/{version.id}/",
|
||||||
)
|
)
|
||||||
@@ -246,6 +258,32 @@ class TestDocumentVersioningApi(DirectoriesMixin, APITestCase):
|
|||||||
|
|
||||||
self.assertEqual(resp.status_code, status.HTTP_404_NOT_FOUND)
|
self.assertEqual(resp.status_code, status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
def test_delete_version_reindexes_root_document(self) -> None:
|
||||||
|
root = Document.objects.create(
|
||||||
|
title="root",
|
||||||
|
checksum="root",
|
||||||
|
mime_type="application/pdf",
|
||||||
|
)
|
||||||
|
version = Document.objects.create(
|
||||||
|
title="v1",
|
||||||
|
checksum="v1",
|
||||||
|
mime_type="application/pdf",
|
||||||
|
root_document=root,
|
||||||
|
)
|
||||||
|
|
||||||
|
with (
|
||||||
|
mock.patch("documents.index.remove_document_from_index") as remove_index,
|
||||||
|
mock.patch("documents.index.add_or_update_document") as add_or_update,
|
||||||
|
):
|
||||||
|
resp = self.client.delete(
|
||||||
|
f"/api/documents/{root.id}/versions/{version.id}/",
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(resp.status_code, status.HTTP_200_OK)
|
||||||
|
remove_index.assert_called_once_with(version)
|
||||||
|
add_or_update.assert_called_once()
|
||||||
|
self.assertEqual(add_or_update.call_args[0][0].id, root.id)
|
||||||
|
|
||||||
def test_delete_version_returns_403_without_permission(self) -> None:
|
def test_delete_version_returns_403_without_permission(self) -> None:
|
||||||
owner = User.objects.create_user(username="owner")
|
owner = User.objects.create_user(username="owner")
|
||||||
other = User.objects.create_user(username="other")
|
other = User.objects.create_user(username="other")
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ from django.test import TestCase
|
|||||||
from documents.data_models import ConsumableDocument
|
from documents.data_models import ConsumableDocument
|
||||||
from documents.data_models import DocumentMetadataOverrides
|
from documents.data_models import DocumentMetadataOverrides
|
||||||
from documents.data_models import DocumentSource
|
from documents.data_models import DocumentSource
|
||||||
|
from documents.models import Document
|
||||||
from documents.models import PaperlessTask
|
from documents.models import PaperlessTask
|
||||||
|
from documents.signals.handlers import add_to_index
|
||||||
from documents.signals.handlers import before_task_publish_handler
|
from documents.signals.handlers import before_task_publish_handler
|
||||||
from documents.signals.handlers import task_failure_handler
|
from documents.signals.handlers import task_failure_handler
|
||||||
from documents.signals.handlers import task_postrun_handler
|
from documents.signals.handlers import task_postrun_handler
|
||||||
@@ -198,3 +200,35 @@ class TestTaskSignalHandler(DirectoriesMixin, TestCase):
|
|||||||
task = PaperlessTask.objects.get()
|
task = PaperlessTask.objects.get()
|
||||||
|
|
||||||
self.assertEqual(celery.states.FAILURE, task.status)
|
self.assertEqual(celery.states.FAILURE, task.status)
|
||||||
|
|
||||||
|
def test_add_to_index_indexes_root_once_for_root_documents(self) -> None:
|
||||||
|
root = Document.objects.create(
|
||||||
|
title="root",
|
||||||
|
checksum="root",
|
||||||
|
mime_type="application/pdf",
|
||||||
|
)
|
||||||
|
|
||||||
|
with mock.patch("documents.index.add_or_update_document") as add:
|
||||||
|
add_to_index(sender=None, document=root)
|
||||||
|
|
||||||
|
add.assert_called_once_with(root)
|
||||||
|
|
||||||
|
def test_add_to_index_reindexes_root_for_version_documents(self) -> None:
|
||||||
|
root = Document.objects.create(
|
||||||
|
title="root",
|
||||||
|
checksum="root",
|
||||||
|
mime_type="application/pdf",
|
||||||
|
)
|
||||||
|
version = Document.objects.create(
|
||||||
|
title="version",
|
||||||
|
checksum="version",
|
||||||
|
mime_type="application/pdf",
|
||||||
|
root_document=root,
|
||||||
|
)
|
||||||
|
|
||||||
|
with mock.patch("documents.index.add_or_update_document") as add:
|
||||||
|
add_to_index(sender=None, document=version)
|
||||||
|
|
||||||
|
self.assertEqual(add.call_count, 2)
|
||||||
|
self.assertEqual(add.call_args_list[0].args[0].id, version.id)
|
||||||
|
self.assertEqual(add.call_args_list[1].args[0].id, root.id)
|
||||||
|
|||||||
@@ -1716,6 +1716,7 @@ class DocumentViewSet(
|
|||||||
index.remove_document_from_index(version_doc)
|
index.remove_document_from_index(version_doc)
|
||||||
version_doc_id = version_doc.id
|
version_doc_id = version_doc.id
|
||||||
version_doc.delete()
|
version_doc.delete()
|
||||||
|
index.add_or_update_document(root_doc)
|
||||||
if settings.AUDIT_LOG_ENABLED:
|
if settings.AUDIT_LOG_ENABLED:
|
||||||
actor = (
|
actor = (
|
||||||
request.user if request.user and request.user.is_authenticated else None
|
request.user if request.user and request.user.is_authenticated else None
|
||||||
|
|||||||
Reference in New Issue
Block a user