From 743299e36a63637a75a0d2a8119429027d7474c6 Mon Sep 17 00:00:00 2001 From: abram axel booth Date: Wed, 11 Dec 2024 17:11:02 -0500 Subject: [PATCH] fix: handle bad mediatype request --- trove/render/__init__.py | 4 ++-- trove/views/indexcard.py | 12 ++++++++++-- trove/views/search.py | 19 ++++++++++++++++--- trove/views/vocab.py | 33 ++++++++++++++++++++++++++------- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/trove/render/__init__.py b/trove/render/__init__.py index 312dda96b..351ac791f 100644 --- a/trove/render/__init__.py +++ b/trove/render/__init__.py @@ -27,7 +27,7 @@ _renderer_type.MEDIATYPE: _renderer_type for _renderer_type in RENDERERS } -DEFAULT_RENDERER = RdfJsonapiRenderer # the most stable one +DEFAULT_RENDERER_TYPE = RdfJsonapiRenderer # the most stable one def get_renderer_type(request: http.HttpRequest) -> type[BaseRenderer]: @@ -45,5 +45,5 @@ def get_renderer_type(request: http.HttpRequest) -> type[BaseRenderer]: _chosen_renderer_type = _renderer_type break if _chosen_renderer_type is None: - _chosen_renderer_type = DEFAULT_RENDERER + _chosen_renderer_type = DEFAULT_RENDERER_TYPE return _chosen_renderer_type diff --git a/trove/views/indexcard.py b/trove/views/indexcard.py index e2da39d58..a685428d8 100644 --- a/trove/views/indexcard.py +++ b/trove/views/indexcard.py @@ -2,7 +2,10 @@ from primitive_metadata import gather from trove import exceptions as trove_exceptions -from trove.render import get_renderer_type +from trove.render import ( + DEFAULT_RENDERER_TYPE, + get_renderer_type, +) from trove.trovesearch.trovesearch_gathering import trovesearch_by_indexstrategy from trove.vocab.namespaces import TROVE from trove.vocab.trove import trove_indexcard_iri @@ -14,8 +17,8 @@ class IndexcardView(View): def get(self, request, indexcard_uuid): - _renderer_type = get_renderer_type(request) try: + _renderer_type = get_renderer_type(request) _search_gathering = trovesearch_by_indexstrategy.new_gathering({ # TODO (gather): allow omitting kwargs that go unused 'search_params': None, @@ -32,6 +35,11 @@ def get(self, request, indexcard_uuid): content_rendering=_renderer.render_document(), http_request=request, ) + except trove_exceptions.CannotRenderMediatype as _error: + return make_http_error_response( + error=_error, + renderer=DEFAULT_RENDERER_TYPE(_indexcard_iri), + ) except trove_exceptions.TroveError as _error: return make_http_error_response( error=_error, diff --git a/trove/views/search.py b/trove/views/search.py index 7e664716c..91ed7a575 100644 --- a/trove/views/search.py +++ b/trove/views/search.py @@ -12,7 +12,10 @@ ) from trove.trovesearch.trovesearch_gathering import trovesearch_by_indexstrategy from trove.vocab.namespaces import TROVE -from trove.render import get_renderer_type +from trove.render import ( + DEFAULT_RENDERER_TYPE, + get_renderer_type, +) from ._responder import ( make_http_error_response, make_http_response, @@ -49,8 +52,8 @@ class CardsearchView(View): def get(self, request): - _renderer_type = get_renderer_type(request) try: + _renderer_type = get_renderer_type(request) _search_iri, _search_gathering = _parse_request(request, _renderer_type, CardsearchParams) _search_gathering.ask( DEFAULT_CARDSEARCH_ASK, # TODO: build from `include`/`fields` @@ -61,6 +64,11 @@ def get(self, request): content_rendering=_renderer.render_document(), http_request=request, ) + except trove_exceptions.CannotRenderMediatype as _error: + return make_http_error_response( + error=_error, + renderer=DEFAULT_RENDERER_TYPE(_search_iri), + ) except trove_exceptions.TroveError as _error: return make_http_error_response( error=_error, @@ -70,8 +78,8 @@ def get(self, request): class ValuesearchView(View): def get(self, request): - _renderer_type = get_renderer_type(request) try: + _renderer_type = get_renderer_type(request) _search_iri, _search_gathering = _parse_request(request, _renderer_type, ValuesearchParams) _search_gathering.ask( DEFAULT_VALUESEARCH_ASK, # TODO: build from `include`/`fields` @@ -82,6 +90,11 @@ def get(self, request): content_rendering=_renderer.render_document(), http_request=request, ) + except trove_exceptions.CannotRenderMediatype as _error: + return make_http_error_response( + error=_error, + renderer=DEFAULT_RENDERER_TYPE(_search_iri), + ) except trove_exceptions.TroveError as _error: return make_http_error_response( error=_error, diff --git a/trove/views/vocab.py b/trove/views/vocab.py index 3323a465d..dcab1c373 100644 --- a/trove/views/vocab.py +++ b/trove/views/vocab.py @@ -1,10 +1,17 @@ from django import http from django.views import View -from trove.render import get_renderer_type +from trove import exceptions as trove_exceptions +from trove.render import ( + DEFAULT_RENDERER_TYPE, + get_renderer_type, +) from trove.vocab.namespaces import TROVE from trove.vocab.trove import TROVE_API_THESAURUS -from ._responder import make_http_response +from ._responder import ( + make_http_error_response, + make_http_response, +) class TroveVocabView(View): @@ -14,8 +21,20 @@ def get(self, request, vocab_term): _data = {_iri: TROVE_API_THESAURUS[_iri]} except KeyError: raise http.Http404 - _renderer = get_renderer_type(request)(_iri, _data) - return make_http_response( - content_rendering=_renderer.render_document(), - http_request=request, - ) + try: + _renderer_type = get_renderer_type(request) + _renderer = _renderer_type(_iri, _data) + return make_http_response( + content_rendering=_renderer.render_document(), + http_request=request, + ) + except trove_exceptions.CannotRenderMediatype as _error: + return make_http_error_response( + error=_error, + renderer=DEFAULT_RENDERER_TYPE(_iri), + ) + except trove_exceptions.TroveError as _error: + return make_http_error_response( + error=_error, + renderer=_renderer_type(_iri), + )