Esempio n. 1
0
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)
Esempio n. 2
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)
Esempio n. 3
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)
Esempio n. 4
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="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
Esempio n. 5
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)
Esempio n. 6
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
Esempio n. 7
0
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,
    )
Esempio n. 8
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
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
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
Esempio n. 12
0
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 {}
Esempio n. 13
0
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
Esempio n. 14
0
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 {}
Esempio n. 15
0
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)
Esempio n. 16
0
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