Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

data: Adds dump for documents #618

Merged
merged 1 commit into from
Nov 14, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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