# -*- coding: utf8 -*-
'''
This module contains function for rendering SKOS objects to JSON.
'''
from pyramid.renderers import JSON
from skosprovider.skos import (
Concept,
Collection,
Label,
Note,
Source
)
import logging
log = logging.getLogger(__name__)
json_renderer = JSON()
[docs]def concept_adapter(obj, request):
'''
Adapter for rendering a :class:`skosprovider.skos.Concept` to json.
:param skosprovider.skos.Concept obj: The concept to be rendered.
:rtype: :class:`dict`
'''
p = request.skos_registry.get_provider(obj.concept_scheme.uri)
language = request.params.get('language', request.locale_name)
label = obj.label(language)
return {
'id': obj.id,
'type': 'concept',
'uri': obj.uri,
'label': label.label if label else None,
'concept_scheme': {
'uri': obj.concept_scheme.uri,
'labels': obj.concept_scheme.labels
},
'labels': obj.labels,
'notes': obj.notes,
'sources': obj.sources,
'narrower': _map_relations(obj.narrower, p, language),
'broader': _map_relations(obj.broader, p, language),
'related': _map_relations(obj.related, p, language),
'member_of': _map_relations(obj.member_of, p, language),
'subordinate_arrays': _map_relations(obj.subordinate_arrays, p, language),
'matches': obj.matches
}
[docs]def collection_adapter(obj, request):
'''
Adapter for rendering a :class:`skosprovider.skos.Collection` to json.
:param skosprovider.skos.Collection obj: The collection to be rendered.
:rtype: :class:`dict`
'''
p = request.skos_registry.get_provider(obj.concept_scheme.uri)
language = request.params.get('language', request.locale_name)
label = obj.label(language)
return {
'id': obj.id,
'type': 'collection',
'uri': obj.uri,
'label': label.label if label else None,
'concept_scheme': {
'uri': obj.concept_scheme.uri,
'labels': obj.concept_scheme.labels
},
'labels': obj.labels,
'notes': obj.notes,
'sources': obj.sources,
'members': _map_relations(obj.members, p, language),
'member_of': _map_relations(obj.member_of, p, language),
'superordinates': _map_relations(obj.superordinates, p, language)
}
def _map_relations(relations, p, language='any'):
'''
:param: :class:`list` relations: Relations to be mapped. These are
concept or collection id's.
:param: :class:`skosprovider.providers.VocabularyProvider` p: Provider
to look up id's.
:param string language: Language to render the relations' labels in
:rtype: :class:`list`
'''
ret = []
for r in relations:
c = p.get_by_id(r)
if c:
ret.append(_map_relation(c, language))
else:
log.warning(
'A relation references a concept or collection %d in provider %s that can not be found. Please check the integrity of your data.' %
(r, p.get_vocabulary_id())
)
return ret
def _map_relation(c, language='any'):
"""
Map related concept or collection, leaving out the relations.
:param c: the concept or collection to map
:param string language: Language to render the relation's label in
:rtype: :class:`dict`
"""
label = c.label(language)
return {
'id': c.id,
'type': c.type,
'uri': c.uri,
'label': label.label if label else None
}
[docs]def label_adapter(obj, request):
'''
Adapter for rendering a :class:`skosprovider.skos.Label` to json.
:param skosprovider.skos.Label obj: The label to be rendered.
:rtype: :class:`dict`
'''
return {
'label': obj.label,
'type': obj.type,
'language': obj.language
}
[docs]def note_adapter(obj, request):
'''
Adapter for rendering a :class:`skosprovider.skos.Note` to json.
:param skosprovider.skos.Note obj: The note to be rendered.
:rtype: :class:`dict`
'''
return {
'note': obj.note,
'type': obj.type,
'language': obj.language,
'markup': obj.markup
}
[docs]def source_adapter(obj, request):
'''
Adapter for rendering a :class:`skosprovider.skos.Source` to json.
:param skosprovider.skos.Source obj: The source to be rendered.
:rtype: :class:`dict`
'''
return {
'citation': obj.citation,
'markup': obj.markup
}
json_renderer.add_adapter(Concept, concept_adapter)
json_renderer.add_adapter(Collection, collection_adapter)
json_renderer.add_adapter(Label, label_adapter)
json_renderer.add_adapter(Note, note_adapter)
json_renderer.add_adapter(Source, source_adapter)