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'
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)
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"
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()
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
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)
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)
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)
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)
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
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()
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)