From dbfec8af73b47ee5bbb8de0dccfd9f558e48484d Mon Sep 17 00:00:00 2001 From: Bertrand Zuchuat Date: Thu, 30 Nov 2023 12:34:22 +0100 Subject: [PATCH] patron: add blocked and expired filters * Closes #2715. Co-Authored-by: Bertrand Zuchuat --- rero_ils/config.py | 5 ++- rero_ils/modules/patrons/query.py | 32 ++++++++++++++++++++ tests/api/patrons/test_patrons_rest.py | 42 ++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 rero_ils/modules/patrons/query.py diff --git a/rero_ils/config.py b/rero_ils/config.py index 62edba3af5..ec1a36bb55 100644 --- a/rero_ils/config.py +++ b/rero_ils/config.py @@ -126,6 +126,7 @@ from .modules.patrons.api import Patron from .modules.patrons.models import CommunicationChannel from .modules.patrons.permissions import PatronPermissionPolicy +from .modules.patrons.query import patron_expired from .modules.selfcheck.permissions import seflcheck_permission_factory from .modules.stats.api.api import Stat from .modules.stats.permissions import StatisticsPermissionPolicy @@ -2001,7 +2002,9 @@ def _(x): filters={ _('roles'): and_term_filter('roles'), _('city'): and_term_filter('facet_city'), - _('patron_type'): and_term_filter('patron.type.pid') + _('patron_type'): and_term_filter('patron.type.pid'), + 'blocked': and_term_filter('patron.blocked'), + 'expired': patron_expired() }, ), acq_accounts=dict( diff --git a/rero_ils/modules/patrons/query.py b/rero_ils/modules/patrons/query.py new file mode 100644 index 0000000000..efa25f2520 --- /dev/null +++ b/rero_ils/modules/patrons/query.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# +# RERO ILS +# Copyright (C) 2019-2023 RERO +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, version 3 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +"""Patron Query factories for REST API.""" + +from __future__ import absolute_import, print_function + +from datetime import datetime + +from elasticsearch_dsl import Q + + +def patron_expired(): + """Create a filter for the patron account is expired.""" + def inner(values): + return Q('range', patron__expiration_date={'lte': datetime.now()}) \ + if 'true' == values[0] else Q() + return inner diff --git a/tests/api/patrons/test_patrons_rest.py b/tests/api/patrons/test_patrons_rest.py index c756c5acd9..53e37713ba 100644 --- a/tests/api/patrons/test_patrons_rest.py +++ b/tests/api/patrons/test_patrons_rest.py @@ -569,3 +569,45 @@ def test_patrons_search(client, librarian_martigny): res = client.get(list_url) hits = get_json(res)['hits'] assert hits['total']['value'] == 1 + + +def test_patrons_expired(client, librarian_martigny, patron_martigny): + """Test patron expired filter.""" + login_user_via_session(client, librarian_martigny.user) + list_url = url_for('invenio_records_rest.ptrn_list', simple='1') + res = client.get(list_url) + hits = get_json(res)['hits'] + assert hits['total']['value'] == 6 + + original_expiration_date = patron_martigny['patron']['expiration_date'] + patron_martigny['patron']['barcode'] = ['4098124352'] + + new_expiration_date = datetime.now() - timedelta(days=10) + patron_martigny['patron']['expiration_date'] = new_expiration_date \ + .strftime("%Y-%m-%d") + patron_martigny.update(patron_martigny, dbcommit=True, reindex=True) + + list_url = url_for( + 'invenio_records_rest.ptrn_list', expired='true', simple='1') + res = client.get(list_url) + hits = get_json(res)['hits'] + assert hits['total']['value'] == 1 + + patron_martigny['patron']['expiration_date'] = original_expiration_date + patron_martigny.update(patron_martigny, dbcommit=True, reindex=True) + + +def test_patrons_blocked(client, librarian_martigny, patron_martigny, + patron3_martigny_blocked): + """Test patron blocked filter.""" + login_user_via_session(client, librarian_martigny.user) + list_url = url_for('invenio_records_rest.ptrn_list', simple='1') + res = client.get(list_url) + hits = get_json(res)['hits'] + assert hits['total']['value'] == 6 + + list_url = url_for( + 'invenio_records_rest.ptrn_list', blocked='true', simple='1') + res = client.get(list_url) + hits = get_json(res)['hits'] + assert hits['total']['value'] == 1