Beispiel #1
0
    def delete(self, **kwargs):
        """Delete Document record."""
        loan_search_res = search_by_pid(
            document_pid=self["pid"],
            filter_states=['PENDING'] +
            current_app.config['CIRCULATION_STATES_LOAN_ACTIVE'],
        )
        if loan_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Loan",
                ref_ids=sorted([res["pid"] for res in loan_search_res.scan()]),
            )

        item_search = ItemSearch()
        item_search_res = item_search.search_by_document_pid(
            document_pid=self["pid"])
        if item_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Item",
                ref_ids=sorted([res["pid"] for res in item_search_res.scan()]),
            )
        return super(Document, self).delete(**kwargs)
def test_record_has_references_error(app):
    """Test RecordHasReferencesError."""
    record_type = "Item"
    record_id = "item-1"
    ref_type = "RecordType"
    ref_ids = ["1", "2", "3"]
    msg = (
        "Cannot delete the {record_type} {record_id} record because it has "
        "references from {ref_type} records with ids: {ref_ids}."
    ).format(
        record_type=record_type,
        record_id=record_id,
        ref_type=ref_type,
        ref_ids=ref_ids,
    )

    with pytest.raises(RecordHasReferencesError) as ex:
        raise RecordHasReferencesError(
            record_type=record_type,
            record_id=record_id,
            ref_type=ref_type,
            ref_ids=ref_ids,
        )
    assert ex.value.code == RecordHasReferencesError.code
    assert ex.value.description == msg
Beispiel #3
0
    def preview_delete_document(self, document):
        """Delete Document record."""
        loan_search_res = document.search_loan_references()
        item_search_res = document.search_item_references()
        req_search_res = document.search_doc_req_references()
        orders_refs_search = document.search_order_references()
        brw_req_refs_search = document.search_brw_req_references()

        if loan_search_res.count():
            raise DocumentHasReferencesError(
                document=document,
                ref_type="Loan",
                refs=loan_search_res,
            )

        if item_search_res.count():
            raise DocumentHasReferencesError(
                document=document,
                ref_type="Item",
                refs=item_search_res,
            )

        if req_search_res.count():
            raise DocumentHasReferencesError(
                document=document,
                ref_type="DocumentRequest",
                refs=req_search_res,
            )

        if orders_refs_search.count():
            raise DocumentHasReferencesError(
                document=document,
                ref_type="AcquisitionOrder",
                refs=orders_refs_search,
            )

        if brw_req_refs_search.count():
            raise DocumentHasReferencesError(
                document=document,
                ref_type="BorrowingRequest",
                refs=brw_req_refs_search,
            )

        related_refs = set()
        for _, related_objects in document.relations.items():
            for obj in related_objects:
                if not obj["record_metadata"].get("mode_of_issuance") \
                       == "SERIAL":
                    related_refs.add("{pid_value}:{pid_type}".format(**obj))
        if related_refs:
            raise RecordHasReferencesError(
                record_type=document.__class__.__name__,
                record_id=document["pid"],
                ref_type="related",
                ref_ids=sorted(ref for ref in related_refs),
            )
Beispiel #4
0
 def delete(self, **kwargs):
     """Delete Keyword record."""
     doc_search = DocumentSearch()
     doc_search_res = doc_search.search_by_keyword_pid(
         keyword_pid=self["pid"])
     if doc_search_res.count():
         raise RecordHasReferencesError(
             record_type='Keyword',
             record_id=self["pid"],
             ref_type='Document',
             ref_ids=sorted([res["pid"] for res in doc_search_res.scan()]))
     return super(Keyword, self).delete(**kwargs)
Beispiel #5
0
 def delete(self, **kwargs):
     """Delete Item record."""
     loan_search_res = search_by_pid(
         item_pid=self["pid"],
         filter_states=current_app.config['CIRCULATION_STATES_LOAN_ACTIVE'])
     if loan_search_res.count():
         raise RecordHasReferencesError(
             record_type='Item',
             record_id=self["pid"],
             ref_type='Loan',
             ref_ids=sorted([res["pid"] for res in loan_search_res.scan()]))
     return super(Item, self).delete(**kwargs)
Beispiel #6
0
 def delete(self, **kwargs):
     """Delete Tag record."""
     doc_search = DocumentSearch()
     doc_search_res = doc_search.search_by_tag_pid(tag_pid=self["pid"])
     if doc_search_res.count():
         raise RecordHasReferencesError(
             record_type="Tag",
             record_id=self["pid"],
             ref_type="Document",
             ref_ids=sorted([res["pid"] for res in doc_search_res.scan()]),
         )
     return super(Tag, self).delete(**kwargs)
Beispiel #7
0
 def delete(self, **kwargs):
     """Delete record with relations."""
     related_refs = set()
     for name, related_objects in self.relations.items():
         for obj in related_objects:
             related_refs.add("{pid_value}:{pid_type}".format(**obj))
     if related_refs:
         raise RecordHasReferencesError(
             record_type=self.__class__.__name__,
             record_id=self["pid"],
             ref_type="related",
             ref_ids=sorted(ref for ref in related_refs),
         )
Beispiel #8
0
 def delete(self, **kwargs):
     """Delete Location record."""
     iloc_search = InternalLocationSearch()
     iloc_search_res = iloc_search.search_by_location_pid(
         location_pid=self["pid"])
     if iloc_search_res.count():
         raise RecordHasReferencesError(
             record_type="Location",
             record_id=self["pid"],
             ref_type="Internal Location",
             ref_ids=sorted([res["pid"] for res in iloc_search_res.scan()]),
         )
     return super().delete(**kwargs)
Beispiel #9
0
 def delete(self, **kwargs):
     """Delete record."""
     search_cls = current_ils_ill.borrowing_request_search_cls
     requests_search_res = search_cls().search_by_library_pid(self["pid"])
     if requests_search_res.count():
         raise RecordHasReferencesError(
             record_type="Library",
             record_id=self["pid"],
             ref_type="BorrowingRequest",
             ref_ids=sorted(
                 [res["pid"] for res in requests_search_res.scan()]),
         )
     return super().delete(**kwargs)
Beispiel #10
0
    def delete(self, **kwargs):
        """Delete Location record."""
        item_search = ItemSearch()
        item_search_res = item_search.search_by_internal_location_pid(
            internal_location_pid=self["pid"])

        if item_search_res.count():
            raise RecordHasReferencesError(
                record_type='Internal Location',
                record_id=self["pid"],
                ref_type='Item',
                ref_ids=sorted([res["pid"] for res in item_search_res.scan()]))
        return super(InternalLocation, self).delete(**kwargs)
Beispiel #11
0
 def delete(self, **kwargs):
     """Delete record."""
     search_cls = current_ils_acq.order_search_cls
     order_search_res = search_cls().search_by_vendor_pid(self["pid"])
     if order_search_res.count():
         raise RecordHasReferencesError(
             record_type="Vendor",
             record_id=self["pid"],
             ref_type="Order",
             ref_ids=sorted([res["pid"]
                             for res in order_search_res.scan()]),
         )
     return super().delete(**kwargs)
    def delete(self, **kwargs):
        """Delete Document record."""
        loan_search_res = search_by_pid(
            document_pid=self["pid"],
            filter_states=["PENDING"] +
            current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"],
        )
        if loan_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Loan",
                ref_ids=sorted([res["pid"] for res in loan_search_res.scan()]),
            )

        item_search = current_app_ils.item_search_cls()
        item_search_res = item_search.search_by_document_pid(
            document_pid=self["pid"])
        if item_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Item",
                ref_ids=sorted([res["pid"] for res in item_search_res.scan()]),
            )

        req_search = current_app_ils.document_request_search_cls()
        req_search_res = req_search.search_by_document_pid(
            document_pid=self["pid"])
        if req_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="DocumentRequest",
                ref_ids=sorted([res["pid"] for res in req_search_res.scan()]),
            )

        return super().delete(**kwargs)
Beispiel #13
0
    def delete(self, **kwargs):
        """Delete Location record."""
        item_search = current_app_ils.item_search_cls()
        item_search_res = item_search.search_by_internal_location_pid(
            internal_location_pid=self["pid"])

        if item_search_res.count():
            raise RecordHasReferencesError(
                record_type="Internal Location",
                record_id=self["pid"],
                ref_type="Item",
                ref_ids=sorted([res["pid"] for res in item_search_res.scan()]),
            )
        return super().delete(**kwargs)
Beispiel #14
0
 def delete(self, **kwargs):
     """Delete Item record."""
     item_pid = dict(type=ITEM_PID_TYPE, value=self["pid"])
     loan_search_res = search_by_pid(
         item_pid=item_pid,
         filter_states=current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"],
     )
     if loan_search_res.count():
         raise RecordHasReferencesError(
             record_type="Item",
             record_id=self["pid"],
             ref_type="Loan",
             ref_ids=sorted([res["pid"] for res in loan_search_res.scan()]),
         )
     return super().delete(**kwargs)
Beispiel #15
0
def test_record_has_references_error(app):
    """Test RecordHasReferencesError."""
    record_type = 'Item'
    record_id = 'item-1'
    ref_type = 'RecordType'
    ref_ids = ['1', '2', '3']
    msg = ("Cannot delete the {record_type} {record_id} record because it has "
           "references from {ref_type} records with ids: {ref_ids}.").format(
               record_type=record_type,
               record_id=record_id,
               ref_type=ref_type,
               ref_ids=ref_ids)

    with pytest.raises(RecordHasReferencesError) as ex:
        raise RecordHasReferencesError(record_type=record_type,
                                       record_id=record_id,
                                       ref_type=ref_type,
                                       ref_ids=ref_ids)
    assert ex.value.code == RecordHasReferencesError.code
    assert ex.value.description == msg
Beispiel #16
0
    def delete(self, **kwargs):
        """Delete record."""
        order_search_cls = current_ils_acq.order_search_cls
        search_order_res = order_search_cls().search_by_provider_pid(
            self["pid"])

        brwreq_search_cls = current_ils_ill.borrowing_request_search_cls
        search_brwreq_res = brwreq_search_cls().search_by_provider_pid(
            self["pid"])

        if search_order_res.count() or search_brwreq_res.count():
            order_ref_ids = [res["pid"] for res in search_order_res.scan()]
            brwreq_ref_ids = [res["pid"] for res in search_brwreq_res.scan()]

            raise RecordHasReferencesError(
                record_type="Provider",
                record_id=self["pid"],
                ref_type="Order/BorrowingRequest",
                ref_ids=sorted(order_ref_ids + brwreq_ref_ids),
            )
        return super().delete(**kwargs)
Beispiel #17
0
    def delete(self, **kwargs):
        """Delete Location record."""
        iloc_search = current_app_ils.internal_location_search_cls()
        iloc_search_res = iloc_search.search_by_location_pid(
            location_pid=self["pid"]
        )
        if iloc_search_res.count():
            raise RecordHasReferencesError(
                record_type="Location",
                record_id=self["pid"],
                ref_type="Internal Location",
                ref_ids=sorted([res["pid"] for res in iloc_search_res.scan()]),
            )
        rec = super().delete(**kwargs)

        try:
            # invalidate cached property
            del current_app_ils.get_default_location_pid
        except AttributeError:
            pass

        return rec
Beispiel #18
0
    def delete(self, **kwargs):
        """Delete Document record."""
        loan_search_res = search_by_pid(
            document_pid=self["pid"],
            filter_states=["PENDING"] +
            current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"],
        )
        if loan_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Loan",
                ref_ids=sorted([res["pid"] for res in loan_search_res.scan()]),
            )

        item_search = current_app_ils.item_search_cls()
        item_search_res = item_search.search_by_document_pid(
            document_pid=self["pid"])
        if item_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="Item",
                ref_ids=sorted([res["pid"] for res in item_search_res.scan()]),
            )

        eitem_search = current_app_ils.eitem_search_cls()
        eitem_search_res = eitem_search.search_by_document_pid(
            document_pid=self["pid"])
        if eitem_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="EItem",
                ref_ids=sorted([res["pid"]
                                for res in eitem_search_res.scan()]),
            )

        req_search = current_app_ils.document_request_search_cls()
        req_search_res = req_search.search_by_document_pid(
            document_pid=self["pid"])
        if req_search_res.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="DocumentRequest",
                ref_ids=sorted([res["pid"] for res in req_search_res.scan()]),
            )
        order_search = current_ils_acq.order_search_cls()
        orders_refs_search = order_search.search_by_document_pid(
            document_pid=self["pid"], )
        if orders_refs_search.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="AcquisitionOrder",
                ref_ids=sorted(
                    [res["pid"] for res in orders_refs_search.scan()]),
            )
        brw_req_search = current_ils_ill.borrowing_request_search_cls()
        brw_req_refs_search = brw_req_search.search_by_document_pid(
            document_pid=self["pid"], )
        if brw_req_refs_search.count():
            raise RecordHasReferencesError(
                record_type="Document",
                record_id=self["pid"],
                ref_type="BorrowingRequest",
                ref_ids=sorted(
                    [res["pid"] for res in brw_req_refs_search.scan()]),
            )
        return super().delete(**kwargs)