Source code for asclepias_broker.search.views
# -*- coding: utf-8 -*-
#
# Copyright (C) 2018 CERN.
#
# Asclepias Broker is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Search views."""
import json
from flask import Blueprint, abort, request
from invenio_oauth2server import require_api_auth
from asclepias_broker.search.api import RelationshipAPI
from ..core.models import Identifier
blueprint = Blueprint('asclepias_search', __name__)
[docs]@blueprint.route('/citations/<path:pid_value>')
@require_api_auth()
def citations(pid_value):
"""Renders all citations for an identifier."""
identifier = Identifier.query.filter_by(
scheme='doi', value=pid_value).first()
if not identifier:
return abort(404)
else:
citations = RelationshipAPI.get_citations(
identifier, with_parents=True, with_siblings=True,
expand_target=True)
target = citations[0]
citations = citations[1:]
return json.dumps({'target': _target_to_json(target),
'citations': _citations_to_json(citations)})
def _citations_to_json(citations):
citations_json = []
for c in citations:
ids, rels = c
PIDs = []
for id in ids:
PIDs.append(id.value)
citing_relations = []
for rel in rels:
citing_relations.append(str(rel))
citations_json.append({'PIDs': PIDs,
'citingRelations': citing_relations})
return citations_json
def _target_to_json(target):
t_ids, t_rels = target
equivalent_PIDs = []
for id in t_ids:
equivalent_PIDs.append(id.value)
equivalence_relations = []
for rel in t_rels:
equivalence_relations.append(str(rel)),
target_json = {
'equivalentPIDs': equivalent_PIDs,
'equivalenceRelations': equivalence_relations
}
return target_json
[docs]@blueprint.route('/db-relationships')
@require_api_auth()
def relationships():
"""Renders relationships for an identifiers from DB."""
id_ = request.values['id']
scheme = request.values['scheme']
relation = request.values['relation']
grouping = request.values.get('grouping') # optional parameter
identifier = Identifier.query.filter_by(scheme=scheme, value=id_).first()
if not identifier:
return abort(404)
else:
if grouping:
citations = RelationshipAPI\
.get_citations2(identifier, relation, grouping)
else:
citations = RelationshipAPI.get_citations2(identifier, relation)
citations_ids = []
for gid, citlist in citations:
for grouprel, group, id in citlist:
citations_ids.append(id.value)
return json.dumps({'target': identifier.value,
'citations': citations_ids})