collection_ld_adapter()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nop 2
dl 0
loc 12
rs 10
c 0
b 0
f 0
1
# -*- coding: utf8 -*-
2
'''
3
This module contains function for rendering SKOS objects to JSON.
4
'''
5
6
from pyramid.renderers import JSON
7
8
from skosprovider.skos import (
9
    ConceptScheme,
10
    Concept,
11
    Collection,
12
    Label,
13
    Note,
14
    Source
15
)
16
17
from skosprovider.jsonld import (
18
    jsonld_c_dumper,
19
    jsonld_conceptscheme_dumper,
20
)
21
22
import logging
23
log = logging.getLogger(__name__)
24
25
json_renderer = JSON()
26
27
28
def concept_adapter(obj, request):
29
    '''
30
    Adapter for rendering a :class:`skosprovider.skos.Concept` to json.
31
32
    :param skosprovider.skos.Concept obj: The concept to be rendered.
33
    :rtype: :class:`dict`
34
    '''
35
    p = request.skos_registry.get_provider(obj.concept_scheme.uri)
36
    language = request.params.get('language', request.locale_name)
37
    label = obj.label(language)
38
    return {
39
        'id': obj.id,
40
        'type': 'concept',
41
        'uri': obj.uri,
42
        'label': label.label if label else None,
43
        'concept_scheme': {
44
            'uri': obj.concept_scheme.uri,
45
            'labels': obj.concept_scheme.labels
46
        },
47
        'labels': obj.labels,
48
        'notes': obj.notes,
49
        'sources': obj.sources,
50
        'narrower': _map_relations(obj.narrower, p, language),
51
        'broader': _map_relations(obj.broader, p, language),
52
        'related': _map_relations(obj.related, p, language),
53
        'member_of': _map_relations(obj.member_of, p, language),
54
        'subordinate_arrays':  _map_relations(obj.subordinate_arrays, p, language),
55
        'matches': obj.matches
56
    }
57
58
59
def collection_adapter(obj, request):
60
    '''
61
    Adapter for rendering a :class:`skosprovider.skos.Collection` to json.
62
63
    :param skosprovider.skos.Collection obj: The collection to be rendered.
64
    :rtype: :class:`dict`
65
    '''
66
    p = request.skos_registry.get_provider(obj.concept_scheme.uri)
67
    language = request.params.get('language', request.locale_name)
68
    label = obj.label(language)
69
    return {
70
        'id': obj.id,
71
        'type': 'collection',
72
        'uri': obj.uri,
73
        'label': label.label if label else None,
74
        'concept_scheme': {
75
            'uri': obj.concept_scheme.uri,
76
            'labels': obj.concept_scheme.labels
77
        },
78
        'labels': obj.labels,
79
        'notes': obj.notes,
80
        'sources': obj.sources,
81
        'members': _map_relations(obj.members, p, language),
82
        'member_of': _map_relations(obj.member_of, p, language),
83
        'superordinates':  _map_relations(obj.superordinates, p, language),
84
        'infer_concept_relations': obj.infer_concept_relations
85
    }
86
87
88
def _map_relations(relations, p, language='any'):
89
    '''
90
    :param: :class:`list` relations: Relations to be mapped. These are
91
        concept or collection id's.
92
    :param: :class:`skosprovider.providers.VocabularyProvider` p: Provider
93
        to look up id's.
94
    :param string language: Language to render the relations' labels in
95
    :rtype: :class:`list`
96
    '''
97
    ret = []
98
    for r in relations:
99
        c = p.get_by_id(r)
100
        if c:
101
            ret.append(_map_relation(c, language))
102
        else:
103
            log.warning(
104
                'A relation references a concept or collection %d in provider %s that can not be found. Please check the integrity of your data.' %
105
                (r, p.get_vocabulary_id())
106
            )
107
    return ret
108
109
110
def _map_relation(c, language='any'):
111
    """
112
    Map related concept or collection, leaving out the relations.
113
114
    :param c: the concept or collection to map
115
    :param string language: Language to render the relation's label in
116
    :rtype: :class:`dict`
117
    """
118
    label = c.label(language)
119
    return {
120
        'id': c.id,
121
        'type': c.type,
122
        'uri': c.uri,
123
        'label': label.label if label else None
124
    }
125
126
127
def label_adapter(obj, request):
128
    '''
129
    Adapter for rendering a :class:`skosprovider.skos.Label` to json.
130
131
    :param skosprovider.skos.Label obj: The label to be rendered.
132
    :rtype: :class:`dict`
133
    '''
134
    return {
135
        'label': obj.label,
136
        'type': obj.type,
137
        'language': obj.language
138
    }
139
140
141
def note_adapter(obj, request):
142
    '''
143
    Adapter for rendering a :class:`skosprovider.skos.Note` to json.
144
145
    :param skosprovider.skos.Note obj: The note to be rendered.
146
    :rtype: :class:`dict`
147
    '''
148
    return {
149
        'note': obj.note,
150
        'type': obj.type,
151
        'language': obj.language,
152
        'markup': obj.markup
153
    }
154
155
156
def source_adapter(obj, request):
157
    '''
158
    Adapter for rendering a :class:`skosprovider.skos.Source` to json.
159
160
    :param skosprovider.skos.Source obj: The source to be rendered.
161
    :rtype: :class:`dict`
162
    '''
163
    return {
164
        'citation': obj.citation,
165
        'markup': obj.markup
166
    }
167
168
169
json_renderer.add_adapter(Concept, concept_adapter)
170
json_renderer.add_adapter(Collection, collection_adapter)
171
json_renderer.add_adapter(Label, label_adapter)
172
json_renderer.add_adapter(Note, note_adapter)
173
json_renderer.add_adapter(Source, source_adapter)
174
175
176
jsonld_renderer = JSON()
177
178
179
def conceptscheme_ld_adapter(obj, request):
180
    '''
181
    Adapter for rendering a :class:`skosprovider.skos.ConceptScheme` to jsonld.
182
183
    :param skosprovider.skos.ConceptScheme obj: The conceptscheme to be rendered.
184
    :rtype: :class:`dict`
185
    '''
186
    p = request.skos_registry.get_provider(obj.uri)
187
    language = request.params.get('language', request.locale_name)
188
    request.response.content_type = 'application/ld+json'
189
    context = request.route_url('skosprovider.context')
190
    return jsonld_conceptscheme_dumper(p, context, language=language)
191
192
193
def concept_ld_adapter(obj, request):
194
    '''
195
    Adapter for rendering a :class:`skosprovider.skos.Concept` to jsonld.
196
197
    :param skosprovider.skos.Concept obj: The concept to be rendered.
198
    :rtype: :class:`dict`
199
    '''
200
    p = request.skos_registry.get_provider(obj.concept_scheme.uri)
201
    language = request.params.get('language', request.locale_name)
202
    request.response.content_type = 'application/ld+json'
203
    context = request.route_url('skosprovider.context')
204
    return jsonld_c_dumper(p, obj.id, context, language=language)
205
206
207
def collection_ld_adapter(obj, request):
208
    '''
209
    Adapter for rendering a :class:`skosprovider.skos.Concept` to jsonld.
210
211
    :param skosprovider.skos.Concept obj: The concept to be rendered.
212
    :rtype: :class:`dict`
213
    '''
214
    p = request.skos_registry.get_provider(obj.concept_scheme.uri)
215
    language = request.params.get('language', request.locale_name)
216
    request.response.content_type = 'application/ld+json'
217
    context = request.route_url('skosprovider.context')
218
    return jsonld_c_dumper(p, obj.id, context, language=language)
219
220
221
jsonld_renderer.add_adapter(ConceptScheme, conceptscheme_ld_adapter)
222
jsonld_renderer.add_adapter(Concept, concept_ld_adapter)
223
jsonld_renderer.add_adapter(Collection, collection_ld_adapter)
224