Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
circulation: upgrade to invenio circulation v1.0.0a14
Browse files Browse the repository at this point in the history
* Adds $ref to item in then loan record.
* Improves circulation excpetions and parameters.

Co-Authored-by: Aly Badr <aly.badr@rero.ch>
Aly Badr committed Jul 25, 2019
1 parent 0bbd6f5 commit f765497
Showing 11 changed files with 143 additions and 78 deletions.
2 changes: 1 addition & 1 deletion Pipfile
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ PyYAML = ">=3.13"
rero-ils = {editable = true, path = "."}
uwsgi = ">=2.0"
invenio-oaiharvester = {ref = "v1.0.0a4", git = "https://github.com/inveniosoftware/invenio-oaiharvester.git"}
invenio-circulation = {ref = "v1.0.0a8", git = "https://github.com/inveniosoftware/invenio-circulation.git"}
invenio-circulation = {ref = "v1.0.0a14", git = "https://github.com/inveniosoftware/invenio-circulation.git"}
pipenv = "*"
requests = ">=2.20.0"
flask-oauthlib = "*"
139 changes: 78 additions & 61 deletions Pipfile.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 5 additions & 1 deletion rero_ils/config.py
Original file line number Diff line number Diff line change
@@ -59,6 +59,7 @@
from .modules.item_types.api import ItemType
from .modules.items.api import Item, ItemsIndexer
from .modules.libraries.api import Library
from .modules.loans.api import Loan
from .modules.loans.utils import can_be_requested, get_default_loan_duration, \
get_extension_params, is_item_available_for_checkout, \
loan_satisfy_circ_policies
@@ -999,6 +1000,9 @@ def _(x):
Item.get_document_pid_by_item_pid
CIRCULATION_ITEMS_RETRIEVER_FROM_DOCUMENT = Item.get_items_pid_by_document_pid

CIRCULATION_DOCUMENT_EXISTS = Document.get_record_by_pid
CIRCULATION_ITEM_REF_BUILDER = Loan.loan_build_item_ref

# This is needed for absolute URL (url_for)
# SERVER_NAME = 'localhost:5000'
# CIRCULATION_REST_ENDPOINTS = {}
@@ -1091,7 +1095,7 @@ def _(x):
checkout=dict(
duration_default=get_default_loan_duration,
duration_validate=loan_satisfy_circ_policies,
item_available=is_item_available_for_checkout
item_can_circulate=is_item_available_for_checkout
),
extension=dict(
from_end_date=False,
18 changes: 9 additions & 9 deletions rero_ils/modules/items/api.py
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@
from invenio_circulation.api import get_loan_for_item, \
patron_has_active_loan_on_item
from invenio_circulation.errors import CirculationException, \
NoValidTransitionAvailable
MissingRequiredParameterError, NoValidTransitionAvailableError
from invenio_circulation.proxies import current_circulation
from invenio_circulation.search.api import search_by_pid
from invenio_i18n.ext import current_i18n
@@ -115,8 +115,8 @@ def wrapper(item, *args, **kwargs):
# TODO: include in invenio-circulation
if function.__name__ == 'request' and \
not kwargs.get('pickup_location_pid'):
raise CirculationException(
"Pickup Location PID not specified")
raise MissingRequiredParameterError(
description="Parameter 'pickup_location_pid' is required")

if loan_pid:
loan = Loan.get_record_by_pid(loan_pid)
@@ -126,8 +126,8 @@ def wrapper(item, *args, **kwargs):
web_request = True
# create or get a loan
if not patron_pid:
raise CirculationException(
"Patron PID not specified")
raise MissingRequiredParameterError(
description="Parameter 'patron_pid' is required")
if function.__name__ == 'checkout':
request = get_request_by_item_pid_by_patron_pid(
item_pid=item.pid, patron_pid=patron_pid)
@@ -141,8 +141,8 @@ def wrapper(item, *args, **kwargs):
}
loan = Loan.create(data, dbcommit=True, reindex=True)
else:
raise CirculationException(
"Loan PID not specified")
raise MissingRequiredParameterError(
description="Parameter 'loan_pid' is required")

# set missing parameters
kwargs['item_pid'] = item.pid
@@ -397,7 +397,7 @@ def last_location_pid(self):
of the last loan.
"""
loan_location_pid = get_last_transaction_loc_for_item(self.pid)
if loan_location_pid:
if loan_location_pid and Location.get_record_by_pid(loan_location_pid):
return loan_location_pid
return self.location_pid

@@ -706,7 +706,7 @@ def lose(self):
loan_pid = loan['loan_pid']
try:
self.cancel_loan(loan_pid=loan_pid)
except NoValidTransitionAvailable:
except NoValidTransitionAvailableError:
pass
self['status'] = ItemStatus.MISSING
self.status_update(dbcommit=True, reindex=True, forceindex=True)
28 changes: 25 additions & 3 deletions rero_ils/modules/loans/api.py
Original file line number Diff line number Diff line change
@@ -29,12 +29,13 @@

import ciso8601
from flask import current_app, url_for
from invenio_circulation.errors import CirculationException
from invenio_circulation.errors import CirculationException, \
MissingRequiredParameterError
from invenio_circulation.pidstore.fetchers import loan_pid_fetcher
from invenio_circulation.pidstore.minters import loan_pid_minter
from invenio_circulation.pidstore.providers import CirculationLoanIdProvider
from invenio_circulation.proxies import current_circulation
from invenio_circulation.search.api import search_by_patron_item
from invenio_circulation.search.api import search_by_patron_item_or_document
from invenio_jsonschemas import current_jsonschemas

from ..api import IlsRecord
@@ -85,6 +86,27 @@ def create(cls, data, id_=None, delete_pid=True,
reindex=reindex, **kwargs)
return record

def attach_item_ref(self):
"""Attach item reference."""
item_pid = self.get("item_pid")
if not item_pid:
raise MissingRequiredParameterError(
description='item_pid missing from loan {0}'.format(
self['loan_pid']))
if self.loan_build_item_ref:
self["item"] = self.loan_build_item_ref(item_pid)

def loan_build_item_ref(self, item_pid):
"""Build $ref for the Item attached to the Loan."""
base_url = current_app.config.get('RERO_ILS_APP_BASE_URL')
url_api = '{base_url}/api/{doc_type}/{pid}'
return {
'$ref': url_api.format(
base_url=base_url,
doc_type='items',
pid=item_pid)
}

@property
def item_pid(self):
"""Shortcut for item pid."""
@@ -182,7 +204,7 @@ def create_notification(self, notification_type=None):

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(
search = search_by_patron_item_or_document(
item_pid=item_pid,
patron_pid=patron_pid,
filter_states=[
12 changes: 12 additions & 0 deletions rero_ils/modules/loans/jsonschemas/loans/loan-ils-v0.0.1.json
Original file line number Diff line number Diff line change
@@ -13,6 +13,18 @@
"type": "string",
"title": "Schema"
},
"item": {
"title": "Item",
"type": "object",
"properties": {
"$ref": {
"title": "Item URI",
"type": "string",
"pattern": "^https://ils.rero.ch/api/items/.+?$",
"default": "https://ils.rero.ch/api/items/"
}
}
},
"extension_count": {
"type": "integer",
"title": "Loan extension count"
7 changes: 7 additions & 0 deletions rero_ils/modules/loans/mappings/v6/loans/loan-ils-v0.0.1.json
Original file line number Diff line number Diff line change
@@ -15,6 +15,13 @@
"loan_pid": {
"type": "keyword"
},
"item": {
"properties": {
"pid": {
"type": "keyword"
}
}
},
"transaction_date": {
"type": "date"
},
1 change: 1 addition & 0 deletions rero_ils/modules/loans/utils.py
Original file line number Diff line number Diff line change
@@ -28,6 +28,7 @@

import ciso8601
from dateutil.parser import parse
from flask import current_app

from ..circ_policies.api import CircPolicy
from ..items.api import Item
1 change: 1 addition & 0 deletions rero_ils/modules/notifications/api.py
Original file line number Diff line number Diff line change
@@ -110,6 +110,7 @@ def replace_pids_and_refs(self):
library_pid = data['loan']['pickup_location']['library']['pid']
library = Library.get_record_by_pid(library_pid)
data['loan']['pickup_location']['library'] = library
data['loan']['library'] = library
keep_until = datetime.now() + timedelta(days=10)
next_open = library.next_open(keep_until)
# language = data['loan']['patron']['communication_language']
4 changes: 2 additions & 2 deletions tests/api/test_loans_rest.py
Original file line number Diff line number Diff line change
@@ -198,8 +198,8 @@ def test_overdue_loans(client, librarian_martigny_no_email,
patron_pid = patron_martigny_no_email.pid
assert not item.is_loaned_to_patron(patron_martigny_no_email.get(
'barcode'))
assert item.can_delete
assert item.available
assert not item.can_delete
assert not item.available

# checkout
res = client.post(
3 changes: 2 additions & 1 deletion tests/api/test_tasks.py
Original file line number Diff line number Diff line change
@@ -41,7 +41,8 @@

def test_create_over_and_due_soon_notifications_task(
client, librarian_martigny_no_email, patron_martigny_no_email,
item_lib_martigny, circ_policy_short_martigny):
item_lib_martigny, circ_policy_short_martigny,
loc_public_martigny, lib_martigny):
"""Test overdue and due_soon loans."""
login_user_via_session(client, librarian_martigny_no_email.user)
item = item_lib_martigny

0 comments on commit f765497

Please sign in to comment.