def test_loan_can_be_created_on_missing_item_by_force(client, json_headers,
                                                      users, testdata):
    """Test that a patron can request a loan on a missing
       item by force checkout."""
    for user in [users['admin'], users['librarian']]:
        login_user_via_session(client, email=User.query.get(user.id).email)
        url = url_for('invenio_app_ils_circulation.loan_create')

        item_exists = True if search_by_pid(
            item_pid=NEW_FORCED_LOAN["item_pid"]) \
            .execute().hits.total > 0 else False

        if item_exists and patron_has_active_loan_on_item(
                patron_pid=NEW_FORCED_LOAN["patron_pid"],
                item_pid=NEW_FORCED_LOAN["item_pid"]):

            res = client.post(url,
                              headers=json_headers,
                              data=json.dumps(NEW_FORCED_LOAN))
            assert res.status_code == 400
            current_item_status = Item.get_record_by_pid(
                NEW_FORCED_LOAN["item_pid"])["status"]
            assert current_item_status == Item.get_record_by_pid(
                NEW_FORCED_LOAN["item_pid"])["status"]
        elif item_exists:
            res = client.post(url,
                              headers=json_headers,
                              data=json.dumps(NEW_FORCED_LOAN))
            assert res.status_code == 202
            loan = json.loads(res.data.decode('utf-8'))['metadata']
            assert loan['state'] == 'ITEM_ON_LOAN'
Ejemplo n.º 2
0
def index_after_loan_replace_item(_, old_item_pid, new_item_pid):
    """Register Circulation signal to index item."""
    if old_item_pid:
        item = Item.get_record_by_pid(old_item_pid)
        current_app_ils_extension.item_indexer.index(item)

    if new_item_pid:
        item = Item.get_record_by_pid(new_item_pid)
        current_app_ils_extension.item_indexer.index(item)
Ejemplo n.º 3
0
def test_checkout_conditions_librarian(client, json_headers, users, testdata):
    """Test checkout conditions user."""
    librarian = users["librarian"]
    user_login(client, "librarian", users)
    url = url_for("invenio_app_ils_circulation.loan_checkout")

    params = deepcopy(NEW_LOAN)
    params["item_pid"] = dict(type="pitmid", value="itemid-61")
    params["transaction_user_pid"] = str(librarian.id)
    res = client.post(url, headers=json_headers, data=json.dumps(params))
    assert res.status_code == 202

    params = deepcopy(NEW_LOAN)
    params["item_pid"] = dict(type="pitmid", value="itemid-MISSING")
    params["transaction_user_pid"] = str(librarian.id)
    res = client.post(url, headers=json_headers, data=json.dumps(params))
    # missing
    assert res.status_code == 400

    params = deepcopy(NEW_LOAN)
    params["force"] = True
    params["item_pid"] = dict(type="pitmid", value="itemid-MISSING")
    params["transaction_user_pid"] = str(librarian.id)
    res = client.post(url, headers=json_headers, data=json.dumps(params))
    # missing but force
    assert res.status_code == 202
    item = Item.get_record_by_pid(params["item_pid"]["value"])
    assert item["status"] == "CAN_CIRCULATE"
Ejemplo n.º 4
0
def test_update_item_document(client, users, json_headers, testdata, db):
    """Test REPLACE document pid on item."""
    login_user_via_session(client, user=User.query.get(users["admin"].id))
    item = Item.get_record_by_pid("itemid-1")
    item["document_pid"] = "not_found_doc"
    with pytest.raises(ItemDocumentNotFoundError):
        item.commit()
Ejemplo n.º 5
0
def item_resolver_endpoint(item_pid):
    """Circulation item resolving view function."""
    item = Item.get_record_by_pid(item_pid)
    # To avoid circular dependencies, we remove loan from item.
    del item["circulation_status"]
    del item["document"]
    return item
Ejemplo n.º 6
0
def _set_item_to_can_circulate(item_pid):
    """Change the item status to CAN_CIRCULATE."""
    item = Item.get_record_by_pid(item_pid["value"])
    if item["status"] != "CAN_CIRCULATE":
        item["status"] = "CAN_CIRCULATE"
        item.commit()
        db.session.commit()
        current_app_ils.item_indexer.index(item)
Ejemplo n.º 7
0
def index_item_after_document_indexed(document_pid):
    """Index item to refresh document reference."""
    item_pids = circulation_items_retriever(document_pid)
    item_ids = []
    for pid in item_pids:
        record = Item.get_record_by_pid(pid)
        item_ids.append(record.id)

    RecordIndexer().bulk_index(item_ids)
Ejemplo n.º 8
0
def _ensure_item_can_circulate(item_pid):
    """Change the item status to CAN_CIRCULATE if different."""
    item = Item.get_record_by_pid(item_pid)
    if item["status"] != "CAN_CIRCULATE":
        item = item.patch([{
            'op': 'replace',
            'path': '/status',
            'value': 'CAN_CIRCULATE'
        }])
        item.commit()
        db.session.commit()
        current_app_ils_extension.item_indexer.index(item)
Ejemplo n.º 9
0
def _set_item_to_can_circulate(item_pid):
    """Change the item status to CAN_CIRCULATE."""
    item = Item.get_record_by_pid(item_pid)
    if item["status"] != "CAN_CIRCULATE":
        item = item.patch([{
            "op": "replace",
            "path": "/status",
            "value": "CAN_CIRCULATE"
        }])
        item.commit()
        db.session.commit()
        current_app_ils_extension.item_indexer.index(item)
Ejemplo n.º 10
0
def item_resolver(loan_pid):
    """Resolve an Item given a Loan PID."""
    try:
        item_pid = get_field_value(Loan, loan_pid, "item_pid")
    except KeyError:
        return {}
    try:
        item = Item.get_record_by_pid(item_pid)
        # remove `Document` and `circulation` fields
        # to avoid circular deps.
        del item["$schema"]
        del item["circulation"]
        del item["document"]
    except PIDDeletedError:
        item = {}
    return item
Ejemplo n.º 11
0
def test_update_item_status(client, users, json_headers, testdata, db):
    """Test update item status."""
    def get_active_loan_pid_and_item_pid():
        LoanSearch = current_circulation.loan_search_cls
        for t in testdata["items"]:
            if t["status"] == "CAN_CIRCULATE":
                item_pid = dict(type=ITEM_PID_TYPE, value=t["pid"])
                active_loan = (LoanSearch().get_active_loan_by_item_pid(
                    item_pid).execute().hits)
                total = (active_loan.total
                         if lt_es7 else active_loan.total.value)
                if total > 0:
                    return t["pid"], active_loan[0]["pid"]

    login_user_via_session(client, user=User.query.get(users["admin"].id))
    item_pid, loan_pid = get_active_loan_pid_and_item_pid()
    item = Item.get_record_by_pid(item_pid)
    with pytest.raises(ItemHasActiveLoanError):
        item.commit()
Ejemplo n.º 12
0
def index_item_after_loan_indexed(item_pid):
    """Index item to re-compute circulation reference."""
    if item_pid:
        item = Item.get_record_by_pid(item_pid)
        RecordIndexer().index(item)