diff --git a/atramhasis/audit.py b/atramhasis/audit.py index 88a3d59a..6d512708 100644 --- a/atramhasis/audit.py +++ b/atramhasis/audit.py @@ -16,12 +16,15 @@ def _origin_from_request(request): return 'HTML' elif 'application/json' in request.accept: return 'REST' + elif 'application/ld+json' in request.accept: + return 'RDF' else: return None def _origin_from_response(response): if response.content_type == 'application/rdf+xml' \ + or response.content_type == 'application/ld+json' \ or response.content_type == 'text/turtle' \ or response.content_type == 'application/x-turtle': return 'RDF' diff --git a/atramhasis/routes.py b/atramhasis/routes.py index 3aefa7cc..c628448e 100644 --- a/atramhasis/routes.py +++ b/atramhasis/routes.py @@ -27,6 +27,8 @@ def includeme(config): config.add_route('atramhasis.rdf_conceptscheme_export_turtle_ext', pattern='/conceptschemes/{scheme_id}.ttl') config.add_route('atramhasis.rdf_individual_export_ext', pattern='/conceptschemes/{scheme_id}/c/{c_id}.rdf') config.add_route('atramhasis.rdf_individual_export_turtle_ext', pattern='/conceptschemes/{scheme_id}/c/{c_id}.ttl') + config.add_route('atramhasis.rdf_conceptscheme_jsonld_ext', pattern='/conceptschemes/{scheme_id}.jsonld') + config.add_route('atramhasis.rdf_individual_jsonld_ext', pattern='/conceptschemes/{scheme_id}/c/{c_id}.jsonld') config.add_route('conceptschemes', pattern='/conceptschemes', accept='text/html', request_method="GET") config.add_route('conceptscheme', pattern='/conceptschemes/{scheme_id}', accept='text/html', request_method="GET") @@ -83,3 +85,7 @@ def includeme(config): accept='text/turtle') config.add_route('atramhasis.rdf_individual_export_turtle_x', pattern='/conceptschemes/{scheme_id}/c/{c_id}', accept='application/x-turtle') + config.add_route('atramhasis.rdf_conceptscheme_jsonld', pattern='/conceptschemes/{scheme_id}', + accept='application/ld+json') + config.add_route('atramhasis.rdf_individual_jsonld', pattern='/conceptschemes/{scheme_id}/c/{c_id}', + accept='application/ld+json') diff --git a/atramhasis/templates/concept.jinja2 b/atramhasis/templates/concept.jinja2 index 4c735f37..51a3404b 100644 --- a/atramhasis/templates/concept.jinja2 +++ b/atramhasis/templates/concept.jinja2 @@ -3,19 +3,19 @@ {{ super() }} - + {% if concept.notes|length > 0 %} {% endif %} - + {% if concept.notes|length > 0 %} {% endif %} {% endblock %} -{% block html_title %}{{ concept.label(request.locale_name).label|title }}{% endblock %} +{% block html_title %}{{ concept.label(locale).label|title }}{% endblock %} {% from "macros.jinja2" import render_relaties_lijst, @@ -32,6 +32,7 @@ diff --git a/atramhasis/templates/conceptscheme.jinja2 b/atramhasis/templates/conceptscheme.jinja2 index 1a652d42..4b76e127 100644 --- a/atramhasis/templates/conceptscheme.jinja2 +++ b/atramhasis/templates/conceptscheme.jinja2 @@ -30,6 +30,7 @@ {%- for c in concepts %} -
{{ c.label }}
[ ID : {{ c.id }} ]
{{ c.type }}
+
{{ c.label }}
[ ID : {{ c.id }} ]
{{ c.type }}
{%- endfor %} diff --git a/atramhasis/views/rdf.py b/atramhasis/views/rdf.py index 5d093521..0a47cab4 100644 --- a/atramhasis/views/rdf.py +++ b/atramhasis/views/rdf.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- - import os +from pyramid import compat +from pyramid.renderers import render from pyramid.response import Response, FileResponse from pyramid.view import view_defaults, view_config +from pyramid_skosprovider.views import ProviderView from skosprovider_rdf import utils from atramhasis.errors import ( @@ -119,3 +121,23 @@ def rdf_individual_export_turtle(self): response.body = graph.serialize(format='turtle') response.content_disposition = 'attachment; filename="%s.ttl"' % (str(self.c_id),) return response + + @audit + @view_config(route_name='atramhasis.rdf_conceptscheme_jsonld', permission='view') + @view_config(route_name='atramhasis.rdf_conceptscheme_jsonld_ext', permission='view') + def get_conceptscheme_jsonld(self): + conceptscheme = ProviderView(self.request).get_conceptscheme_jsonld() + response = Response(content_type='application/ld+json') + response.text = compat.text_(render('skosjsonld', conceptscheme, self.request)) + response.content_disposition = 'attachment; filename="%s.jsonld"' % (str(self.scheme_id),) + return response + + @audit + @view_config(route_name='atramhasis.rdf_individual_jsonld', permission='view') + @view_config(route_name='atramhasis.rdf_individual_jsonld_ext', permission='view') + def get_concept(self): + concept = ProviderView(self.request).get_concept() + response = Response(content_type='application/ld+json') + response.text = compat.text_(render('skosjsonld', concept, self.request)) + response.content_disposition = 'attachment; filename="%s.jsonld"' % (str(self.c_id),) + return response diff --git a/atramhasis/views/views.py b/atramhasis/views/views.py index bbc43339..971eede7 100644 --- a/atramhasis/views/views.py +++ b/atramhasis/views/views.py @@ -151,6 +151,9 @@ def concept_view(self): scheme_id = self.request.matchdict['scheme_id'] c_id = self.request.matchdict['c_id'] provider = self.request.skos_registry.get_provider(scheme_id) + label = self._read_request_param('label') + ctype = self._read_request_param('ctype') + if not provider: raise ConceptSchemeNotFoundException(scheme_id) if 'atramhasis.force_display_label_language' in provider.metadata: @@ -166,10 +169,10 @@ def concept_view(self): else: return Response('Thing without type: ' + str(c_id), status_int=500) url = self.request.route_url('concept', scheme_id=scheme_id, c_id=c_id) - update_last_visited_concepts(self.request, {'label': c.label(self.request.locale_name).label, 'url': url}) + update_last_visited_concepts(self.request, {'label': c.label(locale).label, 'url': url}) return {'concept': c, 'conceptType': concept_type, 'scheme_id': scheme_id, 'conceptschemes': conceptschemes, 'provider': provider, - 'locale': locale} + 'locale': locale, 'ctype': ctype, 'label': label} except NoResultFound: raise ConceptNotFoundException(c_id) @@ -190,13 +193,17 @@ def search_result(self): ctype = self._read_request_param('ctype') provider = self.skos_registry.get_provider(scheme_id) if provider: + if 'atramhasis.force_display_label_language' in provider.metadata: + locale = provider.metadata['atramhasis.force_display_label_language'] + else: + locale = self.request.locale_name if label is not None: - concepts = provider.find({'label': label, 'type': ctype}, language=self.request.locale_name, sort='label') + concepts = provider.find({'label': label, 'type': ctype}, language=locale, sort='label') elif (label is None) and (ctype is not None): - concepts = provider.find({'type': ctype}, language=self.request.locale_name, sort='label') + concepts = provider.find({'type': ctype}, language=locale, sort='label') else: - concepts = provider.get_all(language=self.request.locale_name, sort='label') - return {'concepts': concepts, 'scheme_id': scheme_id, 'conceptschemes': conceptschemes} + concepts = provider.get_all(language=locale, sort='label') + return {'concepts': concepts, 'scheme_id': scheme_id, 'conceptschemes': conceptschemes, 'ctype': ctype, 'label': label} return Response(content_type='text/plain', status_int=404) @view_config(route_name='locale') diff --git a/requirements.txt b/requirements.txt index 07cf1f7b..c0fa8ada 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,8 +7,8 @@ skosprovider==0.7.1 #-e git+https://github.com/koenedaele/skosprovider.git@develop#egg=skosprovider skosprovider_sqlalchemy==0.6.0 #-e git+https://github.com/koenedaele/skosprovider_sqlalchemy.git@0.6.0#egg=skosprovider_sqlalchemy -pyramid_skosprovider==0.9.0 -#-e git+https://github.com/koenedaele/pyramid_skosprovider.git@0.9.0#egg=pyramid_skosprovider +pyramid_skosprovider==0.9.1 +#-e git+https://github.com/koenedaele/pyramid_skosprovider.git@0.9.1#egg=pyramid_skosprovider skosprovider_rdf==0.8.1 #-e git+https://github.com/OnroerendErfgoed/skosprovider_rdf.git@develop#egg=skosprovider_rdf skosprovider_getty==0.5.1 diff --git a/setup.py b/setup.py index 7a5ae57d..725a32a1 100644 --- a/setup.py +++ b/setup.py @@ -113,7 +113,7 @@ def run(self): ] setup(name='atramhasis', - version='0.7.0b1', + version='0.7.0b4', description='A web based editor for thesauri adhering to the SKOS specification.', long_description=README + '\n\n' + CHANGES, long_description_content_type='text/x-rst', diff --git a/tests/test_functional.py b/tests/test_functional.py index 6c8d1003..8d275fc5 100644 --- a/tests/test_functional.py +++ b/tests/test_functional.py @@ -723,6 +723,26 @@ def test_rdf_conceptscheme_turtle_ext(self): self.assertEqual('200 OK', ttl_response.status) self.assertEqual('text/turtle', ttl_response.content_type) + def test_rdf_conceptscheme_jsonld(self): + res = self.testapp.get('/conceptschemes/MATERIALS', headers={'Accept': 'application/ld+json'}) + self.assertEqual('200 OK', res.status) + self.assertEqual('application/ld+json', res.content_type) + + def test_rdf_conceptscheme_jsonld_ext(self): + res = self.testapp.get('/conceptschemes/MATERIALS.jsonld') + self.assertEqual('200 OK', res.status) + self.assertEqual('application/ld+json', res.content_type) + + def test_rdf_individual_jsonld(self): + res = self.testapp.get('/conceptschemes/MATERIALS/c/1', headers={'Accept': 'application/ld+json'}) + self.assertEqual('200 OK', res.status) + self.assertEqual('application/ld+json', res.content_type) + + def test_rdf_individual_jsonld_ext(self): + res = self.testapp.get('/conceptschemes/MATERIALS/c/1.jsonld') + self.assertEqual('200 OK', res.status) + self.assertEqual('application/ld+json', res.content_type) + def test_rdf_individual_xml(self): rdf_response = self.testapp.get('/conceptschemes/MATERIALS/c/1', headers={'Accept': 'application/rdf+xml'}) self.assertEqual('200 OK', rdf_response.status)