def patron_has_active_loan_on_item(patron_pid, item_pid): """Return True if patron has a active Loan for given item.""" search = search_by_patron_item_or_document( patron_pid=patron_pid, item_pid=item_pid, filter_states=current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"], ) search_result = search.execute() return (search_result.hits.total > 0 if lt_es7 else search_result.hits.total.value > 0)
def patron_has_request_on_document(patron_pid, document_pid): """Return True if patron has a request for the given document.""" search = search_by_patron_item_or_document( patron_pid=patron_pid, document_pid=document_pid, filter_states=current_app.config["CIRCULATION_STATES_LOAN_REQUEST"], ) search_result = search.execute() return (search_result.hits.total > 0 if lt_es7 else search_result.hits.total.value > 0)
def get(self, patron, **kwargs): """Retrieve patron loans.""" active_loan_states = current_app.config[ "CIRCULATION_STATES_LOAN_ACTIVE"] active_loans = search_by_patron_item_or_document( patron["id"], filter_states=active_loan_states).execute() pending_loan_states = ["PENDING"] pending_loans = search_by_patron_item_or_document( patron["id"], filter_states=pending_loan_states).execute() patron_loans = { "active_loans": active_loans, "pending_loans": pending_loans, } if patron.get("person_id"): patron_loans["person_id"] = patron["person_id"] if patron.get("department"): patron_loans["department"] = patron["department"] return self.make_response(patron_loans, code=200)
def test_search_loans_by_patron_and_item_or_document(indexed_loans): """Test retrieve loan list by patron and items.""" search_result = search_by_patron_item_or_document( patron_pid="1", item_pid="item_returned_3").execute() assert search_result.hits.total == 1 search_result = search_by_patron_item_or_document( patron_pid="1", item_pid="not_existing").execute() assert search_result.hits.total == 0 search_result = search_by_patron_item_or_document( patron_pid="999999", item_pid="item_returned_3").execute() assert search_result.hits.total == 0 search_result = search_by_patron_item_or_document( patron_pid="1", document_pid="document_pid").execute() assert search_result.hits.total == 8 search_result = search_by_patron_item_or_document( patron_pid="1", document_pid="not_existing").execute() assert search_result.hits.total == 0 search_result = search_by_patron_item_or_document( patron_pid="999999", document_pid="document_returned_1").execute() assert search_result.hits.total == 0
def test_search_loans_by_patron_and_item_or_document(indexed_loans): """Test retrieve loan list by patron and items.""" search_result = search_by_patron_item_or_document( patron_pid="1", item_pid=dict(type="itemid", value="item_returned_3")).execute() _assert_total(search_result.hits.total, 1) search_result = search_by_patron_item_or_document( patron_pid="1", item_pid=dict(type="itemid", value="not_existing")).execute() _assert_total(search_result.hits.total, 0) search_result = search_by_patron_item_or_document( patron_pid="999999", item_pid=dict(type="itemid", value="item_returned_3"), ).execute() _assert_total(search_result.hits.total, 0) search_result = search_by_patron_item_or_document( patron_pid="1", document_pid="document_pid").execute() _assert_total(search_result.hits.total, 8) search_result = search_by_patron_item_or_document( patron_pid="1", document_pid="not_existing").execute() _assert_total(search_result.hits.total, 0) search_result = search_by_patron_item_or_document( patron_pid="999999", document_pid="document_returned_1").execute() _assert_total(search_result.hits.total, 0)
def patron_has_request_on_document(patron_pid, document_pid): """Return loan request for given patron and document.""" states = (current_app.config["CIRCULATION_STATES_LOAN_REQUEST"]) search = search_by_patron_item_or_document(patron_pid=patron_pid, document_pid=document_pid, filter_states=states) search_result = search.execute() total = (search_result.hits.total if lt_es7 else search_result.hits.total.value) if total > 0: return search_result.hits[0] else: return None
def patron_has_active_loan_or_request_on_document(patron_pid, document_pid): """Return True if patron has an active loan/request for given document.""" states = (current_app.config["CIRCULATION_STATES_LOAN_REQUEST"] + current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"]) search = search_by_patron_item_or_document(patron_pid=patron_pid, document_pid=document_pid, filter_states=states) search_result = search.execute() return ( search_result, search_result.hits.total > 0 if lt_es7 else search_result.hits.total.value > 0, )
def get_loans_stats_by_patron_pid(patron_pid): """Search loans for patron and aggregate result on loan state. :param patron_pid: The patron pid :return: a dict with loans state as key, number of loans as value """ agg = A('terms', field='state') search = search_by_patron_item_or_document(patron_pid=patron_pid) search.aggs.bucket('state', agg) search = search[0:0] results = search.execute() stats = {} for result in results.aggregations.state.buckets: stats[result.key] = result.doc_count return stats
def patron_has_active_loan_or_request_on_document(patron_pid, document_pid): """Return loan/request if it's active for the given patron and document.""" states = (current_app.config["CIRCULATION_STATES_LOAN_REQUEST"] + current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"]) search = search_by_patron_item_or_document(patron_pid=patron_pid, document_pid=document_pid, filter_states=states) search_result = search.execute() total = search_result.hits.total \ if lt_es7 \ else search_result.hits.total.value if total > 0: return search_result.hits[0] else: return None
def get_loans_by_patron_pid(patron_pid, filter_states=[]): """Search all loans for patron to the given filter_states. :param patron_pid: The patron pid. :param filter_states: loan states to use as a filter. :return: loans for given patron. """ search = search_by_patron_item_or_document( patron_pid=patron_pid, filter_states=filter_states)\ .params(preserve_order=True)\ .sort({'_created': {'order': 'asc'}})\ .source(['pid']) for loan in search.scan(): yield Loan.get_record_by_pid(loan.pid)
def retrieve_user_loans_information(patron_pid, document_pid): """Retrieves patron loans for the given patron.""" active_requested_loan_states = ( current_app.config["CIRCULATION_STATES_LOAN_REQUEST"] + current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"]) past_loan_states = current_app.config["CIRCULATION_STATES_LOAN_COMPLETED"] user_information = { "is_requested": False, "has_active_loan": False, "last_loan": None, } loans_search = get_loans_aggregated_by_states( document_pid, active_requested_loan_states + past_loan_states, patron_pid, ) # No need for the loan hits loans_search = loans_search[:0] loan_result = loans_search.execute() for bucket in loan_result.aggregations.states.buckets: if (bucket["key"] in current_app.config["CIRCULATION_STATES_LOAN_ACTIVE"] and bucket["doc_count"] > 0): user_information["has_active_loan"] = True elif (bucket["key"] in current_app.config["CIRCULATION_STATES_LOAN_REQUEST"] and bucket["doc_count"] > 0): user_information["is_requested"] = True elif (bucket["key"] in current_app.config["CIRCULATION_STATES_LOAN_COMPLETED"] and bucket["doc_count"] > 0): search = search_by_patron_item_or_document( patron_pid=patron_pid, document_pid=document_pid, filter_states=past_loan_states, ) search = search.sort({"end_date": {"order": "desc"}}) search_result = search.execute() has_past_loans = (search_result.hits.total > 0 if lt_es7 else search_result.hits.total.value > 0) if has_past_loans: last_loan = search_result.hits[0] user_information["last_loan"] = last_loan["end_date"] return user_information
def get_request_by_item_pid_by_patron_pid(item_pid, patron_pid): """Get pending, item_on_transit, item_at_desk loans for item, patron.""" search = search_by_patron_item_or_document( item_pid=item_pid, patron_pid=patron_pid, filter_states=[ 'PENDING', 'ITEM_AT_DESK', 'ITEM_IN_TRANSIT_FOR_PICKUP', 'ITEM_IN_TRANSIT_TO_HOUSE', ], ) search_result = search.execute() if search_result.hits: return search_result.hits.hits[0]['_source'] return {}
def get_loans_count_by_library_for_patron_pid(patron_pid, filter_states=None): """Get loans count for patron and aggregate result on library_pid. :param patron_pid: The patron pid :param filter_states: loans type to filters :return: a dict with library_pid as key, number of loans as value """ filter_states = filter_states or [] # prevent mutable argument warning agg = A('terms', field='library_pid') search = search_by_patron_item_or_document(patron_pid=patron_pid, filter_states=filter_states) search.aggs.bucket('library', agg) search = search[0:0] results = search.execute() stats = {} for result in results.aggregations.library.buckets: stats[result.key] = result.doc_count return stats
def get_loans_by_item_pid_by_patron_pid(item_pid, patron_pid, filter_states=[]): """Get loans for item, patron according to the given filter_states. :param item_pid: The item pid. :param patron_pid: The patron pid. :param filter_states: states to use as a filter. :return: loans for given item and patron. """ search = search_by_patron_item_or_document( item_pid=item_pid_to_object(item_pid), patron_pid=patron_pid, filter_states=filter_states, ) search_result = search.execute() if search_result.hits: return search_result.hits.hits[0]['_source'] return {}
def test_search_loans_by_patron_and_item_or_document_filtering_states( indexed_loans): """Test retrieve loan list by patron and items filtering states.""" search = search_by_patron_item_or_document( patron_pid="1", item_pid=dict(type="itemid", value="item_returned_3"), filter_states=["ITEM_RETURNED"], ) search_result = search.execute() _assert_total(search_result.hits.total, 1) search = search_by_patron_item_or_document( patron_pid="1", item_pid=dict(type="itemid", value="item_returned_3"), filter_states=["ITEM_AT_DESK"], ) search_result = search.execute() _assert_total(search_result.hits.total, 0) search = search_by_patron_item_or_document( patron_pid="1", document_pid="document_pid", filter_states=["ITEM_RETURNED"], ) search_result = search.execute() _assert_total(search_result.hits.total, 2) search = search_by_patron_item_or_document( patron_pid="2", document_pid="document_pid", filter_states=["ITEM_RETURNED"], ) search_result = search.execute() _assert_total(search_result.hits.total, 1) search = search_by_patron_item_or_document( patron_pid="1", document_pid="document_pid", filter_states=["ITEM_AT_DESK"], ) search_result = search.execute() _assert_total(search_result.hits.total, 1) search = search_by_patron_item_or_document(patron_pid="1", document_pid="document_pid", filter_states=["PENDING"]) search_result = search.execute() _assert_total(search_result.hits.total, 3)
def test_search_loans_by_patron_and_item_or_document_filtering_states( indexed_loans): """Test retrieve loan list by patron and items filtering states.""" search = search_by_patron_item_or_document(patron_pid="1", item_pid="item_returned_3", filter_states=['ITEM_RETURNED']) search_result = search.execute() assert search_result.hits.total == 1 search = search_by_patron_item_or_document(patron_pid="1", item_pid="item_returned_3", filter_states=['ITEM_AT_DESK']) search_result = search.execute() assert search_result.hits.total == 0 search = search_by_patron_item_or_document(patron_pid="1", document_pid="document_pid", filter_states=['ITEM_RETURNED']) search_result = search.execute() assert search_result.hits.total == 2 search = search_by_patron_item_or_document(patron_pid="2", document_pid="document_pid", filter_states=['ITEM_RETURNED']) search_result = search.execute() assert search_result.hits.total == 1 search = search_by_patron_item_or_document(patron_pid="1", document_pid="document_pid", filter_states=['ITEM_AT_DESK']) search_result = search.execute() assert search_result.hits.total == 1 search = search_by_patron_item_or_document(patron_pid="1", document_pid="document_pid", filter_states=['PENDING']) search_result = search.execute() assert search_result.hits.total == 3