diff --git a/rero_ils/modules/items/api.py b/rero_ils/modules/items/api.py index a78511803b..d0c55797e0 100644 --- a/rero_ils/modules/items/api.py +++ b/rero_ils/modules/items/api.py @@ -234,6 +234,7 @@ def delete_from_index(self): def create(cls, data, id_=None, delete_pid=False, dbcommit=False, reindex=False, **kwargs): """Create item record.""" + cls._item_build_org_ref(data) record = super(Item, cls).create( data, id_, delete_pid, dbcommit, reindex, **kwargs) if not data.get('holding'): @@ -248,6 +249,23 @@ def update(self, data, dbcommit=False, reindex=False): return self + @classmethod + def _item_build_org_ref(cls, data): + """Build $ref for the organisation of the item.""" + loc_pid = data.get('location', {}).get('pid') + if not loc_pid: + loc_pid = data.get('location').get('$ref').split('locations/')[1] + org_pid = Location.get_record_by_pid(loc_pid).organisation_pid + base_url = current_app.config.get('RERO_ILS_APP_BASE_URL') + url_api = '{base_url}/api/{doc_type}/{pid}' + org_ref = { + '$ref': url_api.format( + base_url=base_url, + doc_type='organisations', + pid=org_pid or cls.organisation_pid) + } + data['organisation'] = org_ref + def item_link_to_holding(self): """Link an item to a holding record.""" from ..holdings.api import \ @@ -947,3 +965,9 @@ def item_has_active_loan_or_request(self): ) search_result = search.execute() return search_result.hits.total + + def dumps(self, **kwargs): + """Return pure Python dictionary with record metadata.""" + dump = super(Item, self).dumps(**kwargs) + dump['available'] = self.available + return dump diff --git a/rero_ils/modules/items/jsonschemas/items/item-v0.0.1.json b/rero_ils/modules/items/jsonschemas/items/item-v0.0.1.json index d8c5eb2125..c8005efe8d 100644 --- a/rero_ils/modules/items/jsonschemas/items/item-v0.0.1.json +++ b/rero_ils/modules/items/jsonschemas/items/item-v0.0.1.json @@ -97,6 +97,17 @@ "pattern": "^https://ils.rero.ch/api/holdings/.+?$" } } + }, + "organisation": { + "title": "Organisation", + "type": "object", + "properties": { + "$ref": { + "title": "Organisation URI", + "type": "string", + "pattern": "^https://ils.rero.ch/api/organisations/.*?$" + } + } } } } diff --git a/rero_ils/modules/items/listener.py b/rero_ils/modules/items/listener.py index cc976fb5f3..c864be6296 100644 --- a/rero_ils/modules/items/listener.py +++ b/rero_ils/modules/items/listener.py @@ -38,3 +38,4 @@ def enrich_item_data(sender, json=None, record=None, index=None, json['organisation'] = { 'pid': org_pid } + json['available'] = item.available diff --git a/tests/api/test_items_rest.py b/tests/api/test_items_rest.py index 02a86a7206..b2711d83f0 100644 --- a/tests/api/test_items_rest.py +++ b/tests/api/test_items_rest.py @@ -107,14 +107,16 @@ def test_items_post_put_delete(client, document, loc_public_martigny, assert res.status_code == 201 # Check that the returned record matches the given data - del data['metadata']['holding'] + for deleted_key in ['holding', 'available']: + data['metadata'].pop(deleted_key) assert data['metadata'] == item_lib_martigny_data res = client.get(item_url) assert res.status_code == 200 data = get_json(res) - del data['metadata']['holding'] + for deleted_key in ['holding', 'available']: + data['metadata'].pop(deleted_key) assert item_lib_martigny_data == data['metadata'] # Update record/PUT diff --git a/tests/api/test_items_rest_views.py b/tests/api/test_items_rest_views.py index a946247620..e31be3c7b9 100644 --- a/tests/api/test_items_rest_views.py +++ b/tests/api/test_items_rest_views.py @@ -24,7 +24,7 @@ import pytest from flask import url_for from invenio_accounts.testutils import login_user_via_session -from utils import postdata +from utils import get_json, postdata from rero_ils.modules.documents.views import item_status_text from rero_ils.modules.errors import InvalidRecordID @@ -32,6 +32,26 @@ from rero_ils.modules.loans.api import LoanAction +def test_item_dumps(client, item_lib_martigny, org_martigny, + librarian_martigny_no_email): + """Test item dumps and elastic search version.""" + item_dumps = Item(item_lib_martigny.dumps()).replace_refs() + + assert item_dumps.get('available') + assert item_dumps.get('organisation').get('pid') == org_martigny.pid + + login_user_via_session(client, librarian_martigny_no_email.user) + record_url = url_for('invenio_records_rest.item_item', + pid_value=item_lib_martigny.pid) + + res = client.get(record_url) + assert res.status_code == 200 + + item_es = Item(get_json(res).get('metadata')) + assert item_es.available + assert item_es.organisation_pid == org_martigny.pid + + def test_checkout_no_loan_given(client, librarian_martigny_no_email, patron_martigny_no_email, loc_public_martigny, item_lib_martigny, json_header,