Skip to content

Commit

Permalink
data: add dump function for documents
Browse files Browse the repository at this point in the history
* Computes `_text` field for provisionActivity and series to documents, to display unstructured statement from the structured data.

Co-Authored-by: Peter Weber <[email protected]>
  • Loading branch information
rerowep and rerowep committed Nov 14, 2019
1 parent bf281c0 commit 7ab6e9b
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 57 deletions.
13 changes: 13 additions & 0 deletions rero_ils/modules/documents/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from invenio_search.api import RecordsSearch

from .models import DocumentIdentifier
from .utils import publication_statement_text, series_format_text
from ..api import IlsRecord
from ..fetchers import id_fetcher
from ..minters import id_minter
Expand Down Expand Up @@ -128,3 +129,15 @@ def reasons_not_to_delete(self):
if self.harvested:
cannot_delete['others'] = dict(harvested=True)
return cannot_delete

def dumps(self, **kwargs):
"""Return pure Python dictionary with record metadata."""
dump = super(Document, self).dumps(**kwargs)
provision_activities = dump.get('provisionActivity')
for provision_activity in provision_activities:
provision_activity["_text"] = \
publication_statement_text(provision_activity)
series = dump.get('series')
for series_element in series:
series_element["_text"] = series_format_text(series_element)
return dump
99 changes: 99 additions & 0 deletions rero_ils/modules/documents/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# -*- coding: utf-8 -*-
#
# RERO ILS
# Copyright (C) 2019 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 <http://www.gnu.org/licenses/>.

"""Blueprint used for loading templates."""

from __future__ import absolute_import, print_function

from .dojson.contrib.marc21tojson.model import remove_trailing_punctuation


def localized_data_name(data, language):
"""Get localized name."""
return data.get(
'name_{language}'.format(language=language),
data.get('name', '')
)


def clean_text(data):
"""Delete all _text from data."""
if isinstance(data, list):
new_val = []
for val in data:
new_val.append(clean_text(val))
data = new_val
elif isinstance(data, dict):
if '_text' in data:
del data['_text']
new_data = {}
for key, val in data.items():
new_data[key] = clean_text(val)
data = new_data
return data


def publication_statement_text(provision_activity):
"""Create publication statement from place, agent and date values."""
punctuation = {
'bf:Place': ' ; ',
'bf:Agent': ', '
}

statement_with_language = {'default': ''}
statement_type = None

for statement in provision_activity['statement']:
labels = statement['label']

for label in labels:
language = label.get('language', 'default')

if not statement_with_language.get(language):
statement_with_language[language] = ''

if statement_with_language[language]:
if statement_type == statement['type']:
statement_with_language[language] += punctuation[
statement_type
]
else:
if statement['type'] == 'bf:Place':
statement_with_language[language] += ' ; '
else:
statement_with_language[language] += ' : '

statement_with_language[language] += label['value']
statement_type = statement['type']

# date field: remove ';' and append
for key, value in statement_with_language.items():
value = remove_trailing_punctuation(value)
if provision_activity.get('date'):
value += ', ' + provision_activity.get('date')
statement_with_language[key] = value
return statement_with_language


def series_format_text(serie):
"""Format series for template."""
output = []
if serie.get('name'):
output.append(serie.get('name'))
if serie.get('number'):
output.append(', ' + serie.get('number'))
return ''.join(str(x) for x in output)
58 changes: 4 additions & 54 deletions rero_ils/modules/documents/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,9 @@
from invenio_records_ui.signals import record_viewed

from .api import Document
from .dojson.contrib.marc21tojson.model import remove_trailing_punctuation
from .dojson.contrib.unimarctojson import unimarctojson
from .utils import localized_data_name, publication_statement_text, \
series_format_text
from ..holdings.api import Holding
from ..items.api import Item, ItemStatus
from ..libraries.api import Library
Expand Down Expand Up @@ -249,14 +250,6 @@ def patron_request_rank(item):
return False


def localized_data_name(data, language):
"""Get localized name."""
return data.get(
'name_{language}'.format(language=language),
data.get('name', '')
)


@blueprint.app_template_filter()
def authors_format(pid, language, viewcode):
"""Format authors for template."""
Expand Down Expand Up @@ -308,12 +301,7 @@ def series_format(series):
"""Format series for template."""
output = []
for serie in series:
line = []
if serie.get('name'):
line.append(serie.get('name'))
if serie.get('number'):
line.append(', ' + serie.get('number'))
output.append(''.join(str(x) for x in line))
output.append(series_format_text(serie))
return '; '.join(str(x) for x in output)


Expand Down Expand Up @@ -440,42 +428,4 @@ def document_availability(document_pid):
@blueprint.app_template_filter()
def create_publication_statement(provision_activity):
"""Create publication statement from place, agent and date values."""
punctuation = {
'bf:Place': ' ; ',
'bf:Agent': ', '
}

statement_with_language = {'default': ''}
statement_type = None

for statement in provision_activity['statement']:
labels = statement['label']

for label in labels:
language = label.get('language', 'default')

if not statement_with_language.get(language):
statement_with_language[language] = ''

if statement_with_language[language]:
if statement_type == statement['type']:
statement_with_language[language] += punctuation[
statement_type
]
else:
if statement['type'] == 'bf:Place':
statement_with_language[language] += ' ; '
else:
statement_with_language[language] += ' : '

statement_with_language[language] += label['value']
statement_type = statement['type']

# date field: remove ';' and append
for key, value in statement_with_language.items():
value = remove_trailing_punctuation(value)
if provision_activity.get('date'):
value += ', ' + provision_activity.get('date')
statement_with_language[key] = value

return statement_with_language
return publication_statement_text(provision_activity)
5 changes: 3 additions & 2 deletions tests/api/test_documents_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from invenio_accounts.testutils import login_user_via_session
from utils import VerifyRecordPermissionPatch, get_json, postdata

from rero_ils.modules.documents.utils import clean_text
from rero_ils.modules.documents.views import can_request, \
item_library_pickup_locations, item_status_text, number_of_requests, \
patron_request_rank, requested_this_item
Expand Down Expand Up @@ -121,12 +122,12 @@ def test_documents_post_put_delete(client, document_data,
assert res.status_code == 201

# Check that the returned record matches the given data
assert data['metadata'] == document_data
assert clean_text(data['metadata']) == document_data

res = client.get(item_url)
assert res.status_code == 200
data = get_json(res)
assert document_data == data['metadata']
assert clean_text(data['metadata']) == document_data

# Update record/PUT
data = document_data
Expand Down
3 changes: 2 additions & 1 deletion tests/api/test_pid_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@
"""API tests for PID and IlsRecords"""

from invenio_accounts.testutils import login_user_via_session
from rero_ils.modules.locations.api import Location
from utils import postdata

from rero_ils.modules.locations.api import Location


def test_ilsrecord_pid_after_validationerror(
client, loc_online_martigny_data, librarian_martigny_no_email):
Expand Down

0 comments on commit 7ab6e9b

Please sign in to comment.