From 3919b10be752f3dd0dd217b0893c92140fcf5629 Mon Sep 17 00:00:00 2001 From: Peter Weber Date: Wed, 29 Jan 2025 11:11:32 +0100 Subject: [PATCH] documents: allow delete of documents with orderln. * Closes #3225. * Allows deletion of documents with acquisition order lines with status recieved or cancelled. Co-Authored-by: Peter Weber --- .../acquisition/acq_order_lines/dumpers.py | 54 ++++++++++++------- rero_ils/modules/documents/api.py | 12 ++++- .../test_acquisition_reception_workflow.py | 5 ++ 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/rero_ils/modules/acquisition/acq_order_lines/dumpers.py b/rero_ils/modules/acquisition/acq_order_lines/dumpers.py index 32b7b2b867..dd74771fd4 100644 --- a/rero_ils/modules/acquisition/acq_order_lines/dumpers.py +++ b/rero_ils/modules/acquisition/acq_order_lines/dumpers.py @@ -25,6 +25,7 @@ from rero_ils.modules.acquisition.dumpers import document_acquisition_dumper from rero_ils.modules.commons.identifiers import IdentifierType from rero_ils.modules.documents.extensions import TitleExtension +from rero_ils.modules.utils import extracted_data_from_ref class AcqOrderLineESDumper(InvenioRecordsDumper): @@ -58,17 +59,20 @@ def dump(self, record, data): # Add document information's: pid, formatted title and ISBN # identifiers (remove None values from document metadata) - document = record.document - identifiers = document.get_identifiers( - filters=[IdentifierType.ISBN], with_alternatives=True - ) - identifiers = [identifier.normalize() for identifier in identifiers] + if document := record.document: + identifiers = document.get_identifiers( + filters=[IdentifierType.ISBN], with_alternatives=True + ) + identifiers = [identifier.normalize() for identifier in identifiers] - data["document"] = { - "pid": document.pid, - "title": TitleExtension.format_text(document.get("title", [])), - "identifiers": identifiers, - } + data["document"] = { + "pid": document.pid, + "title": TitleExtension.format_text(document.get("title", [])), + "identifiers": identifiers, + } + else: + doc_pid = extracted_data_from_ref(record.get("document"), data="pid") + data["document"] = {"pid": doc_pid, "title": f"pid: {doc_pid}"} data["document"] = {k: v for k, v in data["document"].items() if v} return data @@ -83,14 +87,26 @@ def dump(self, record, data): :param data: The initial dump data passed in by ``record.dumps()``. """ # Dumps AcqOrderLine acquisition - data.update( - { - "quantity": record.get("quantity"), - "amount": record.get("amount"), - "note": record.get_note(AcqOrderLineNoteType.VENDOR), - "account": record.account.dumps(dumper=AcqAccountGenericDumper()), - "document": record.document.dumps(dumper=document_acquisition_dumper), - } - ) + if document := record.document: + data.update( + { + "quantity": record.get("quantity"), + "amount": record.get("amount"), + "note": record.get_note(AcqOrderLineNoteType.VENDOR), + "account": record.account.dumps(dumper=AcqAccountGenericDumper()), + "document": document.dumps(dumper=document_acquisition_dumper), + } + ) + else: + doc_pid = extracted_data_from_ref(record.get("document"), data="pid") + data.update( + { + "quantity": record.get("quantity"), + "amount": record.get("amount"), + "note": record.get_note(AcqOrderLineNoteType.VENDOR), + "account": record.account.dumps(dumper=AcqAccountGenericDumper()), + "document": {"pid": doc_pid, "title": f"pid: {doc_pid}"}, + } + ) data = {k: v for k, v in data.items() if v} return data diff --git a/rero_ils/modules/documents/api.py b/rero_ils/modules/documents/api.py index 16df66a5cd..6a340b2cf5 100644 --- a/rero_ils/modules/documents/api.py +++ b/rero_ils/modules/documents/api.py @@ -30,6 +30,7 @@ from jsonschema.exceptions import ValidationError from rero_ils.modules.acquisition.acq_order_lines.api import AcqOrderLinesSearch +from rero_ils.modules.acquisition.acq_order_lines.models import AcqOrderLineStatus from rero_ils.modules.api import IlsRecord, IlsRecordsIndexer, IlsRecordsSearch from rero_ils.modules.commons.identifiers import IdentifierFactory, IdentifierType from rero_ils.modules.fetchers import id_fetcher @@ -319,8 +320,15 @@ def get_links_to_me(self, get_pids=False): exclude_states=[LoanState.CANCELLED, LoanState.ITEM_RETURNED], ) file_query = self.get_records_files_query().source() - acq_order_lines_query = AcqOrderLinesSearch().filter( - "term", document__pid=self.pid + status_list = [ + AcqOrderLineStatus.APPROVED, + AcqOrderLineStatus.ORDERED, + AcqOrderLineStatus.PARTIALLY_RECEIVED, + ] + acq_order_lines_query = ( + AcqOrderLinesSearch() + .filter("term", document__pid=self.pid) + .filter("terms", status=status_list) ) local_fields_query = LocalFieldsSearch().get_local_fields( self.provider.pid_type, self.pid diff --git a/tests/api/acquisition/test_acquisition_reception_workflow.py b/tests/api/acquisition/test_acquisition_reception_workflow.py index 004f5770e7..33cbc74c9a 100644 --- a/tests/api/acquisition/test_acquisition_reception_workflow.py +++ b/tests/api/acquisition/test_acquisition_reception_workflow.py @@ -63,6 +63,7 @@ def test_acquisition_reception_workflow( document, ): """Test complete acquisition workflow.""" + assert document.get_links_to_me() == {} def assert_account_data(accounts): """assert account informations.""" @@ -285,6 +286,8 @@ def assert_account_data(accounts): } assert_account_data(manual_controls) + assert document.get_links_to_me() == {"acq_order_lines": 6} + # STEP 3 :: UPDATE ORDER LINES # * Cancel some order lines and change some quantities --> make sure # calculations still good @@ -362,6 +365,8 @@ def assert_account_data(accounts): assert order_line_1.unreceived_quantity == 5 assert order_line_1.status == AcqOrderLineStatus.APPROVED + assert document.get_links_to_me() == {"acq_order_lines": 4} + # STEP 4 :: SEND THE ORDER # * Test send order and make sure statuses are up to date. # - check order lines (status, order-date)