def get(self, request, *args, **kwargs): self._setup_request(request) allowed_params = [query_param.rstrip('_') for query_param in OaiParam._member_names_] for query_param in self.params.keys(): if query_param not in allowed_params: return self.error( code="badArgument", text="""The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax.""", ) if not self.oai_verb: return self.error( code="badArgument", text="""The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax.""", ) self.create_harvest_steps(request) if self.metadataPrefix not in REGISTERED_CONVERTERS.keys(): return self.error( code="cannotDisseminateFormat", text="The metadata format identified by the value '{}' given for the metadataPrefix argument is not " "supported by the item or by the repository.".format(self.metadataPrefix) ) verb_dict = { 'Identify': self.identify, 'ListIdentifiers': self.list_identifiers, 'GetRecord': self.item, 'ListMetadataFormats': self.list_metadata_formats, 'ListRecords': self.list_records, 'ListSets': self.list_datasets } try: return verb_dict[self.oai_verb]() except OAIException as oe: return self.error(oe.code, oe.message) except KeyError as ke: if self.oai_verb is None: error_msg = 'The request did not provide any verb.' else: error_msg = 'The verb "{}" is illegal'.format(self.oai_verb) return self.error('badVerb', error_msg)
def retrieve(self, request, pk=None, format=None, *args, **kwargs): def get_mode(default=None): params = request.GET return params.get('schema', default) self._clean_callback(request) query = NaveESQuery( index_name=self.get_index_name, doc_types=self.doc_types, default_facets=self.facets, cluster_geo=False, size=1, converter=self.get_converter() ) try: query = query.build_item_query(query, request.query_params, pk) except ValueError as ve: logger.error("Unable to build request because: {}".format(ve)) # todo display error message when bad/unknown hubId is given return HttpResponseBadRequest() mlt = True if request.query_params.get('mlt', 'false') == "true" else False mlt_count = int(request.query_params.get('mlt.count', 5)) mlt_filter_queries = request.query_params.getlist('mlt.qf', []) mlt_fq_dict = {} for fq in mlt_filter_queries: if ":" in fq: k, v = fq.split(":", maxsplit=1) mlt_fq_dict[k] = v record = ElasticSearchRDFRecord(hub_id=pk) record.get_graph_by_id(hub_id=pk) response = NaveItemResponse( query, self, index=self.get_index_name, mlt=mlt, mlt_count=mlt_count, mlt_filter_query=mlt_fq_dict, rdf_record=record ) renderer_format = request.accepted_renderer.format if renderer_format in list(EXTENSION_TO_MIME_TYPE.keys()) and renderer_format not in ['xml', 'json']: graph = record.get_graph() graph_string = graph.serialize(format=renderer_format).decode('utf-8') mime_type = EXTENSION_TO_MIME_TYPE.get(renderer_format) return Response(data=graph_string, content_type=mime_type) target_uri = record.document_uri if settings.RDF_USE_LOCAL_GRAPH: graph = record.get_graph() else: store = rdfstore.get_rdfstore() graph, _ = RDFModel.get_context_graph(store, named_graph=record.named_graph) if not graph: from django.http import HttpResponseNotFound return HttpResponseNotFound() mode = get_mode(self.default_converter) bindings = GraphBindings(about_uri=target_uri, graph=graph) delving_fields = False if request.GET.get("delving_fields") == 'false' else True converter = None if mode in ['api', 'api-flat']: index_doc = bindings.to_index_doc() if mode == 'api' else bindings.to_flat_index_doc() elif mode in REGISTERED_CONVERTERS.keys(): converter = REGISTERED_CONVERTERS.get(mode) index_doc = converter( bindings=bindings, graph=graph, about_uri=bindings.about_uri() ).convert(add_delving_fields=delving_fields) elif self.default_converter in REGISTERED_CONVERTERS.keys(): converter = REGISTERED_CONVERTERS.get(self.default_converter) index_doc = converter( bindings=bindings, graph=graph, about_uri=bindings.about_uri() ).convert(add_delving_fields=delving_fields) else: logger.warn("unable to convert results to schema {}".format(mode)) index_doc = bindings.to_index_doc() layout_fields = OrderedDict() layout_fields['layout'] = converter().get_layout_fields() if converter else [] if response.get_mlt(): mlt = {"item": [NaveESItemSerializer(item).data for item in response.get_mlt()]} else: mlt = "" result = {'result': { 'layout': layout_fields, 'item': {'fields': index_doc}, "relatedItems": mlt}} return Response(result)