diff --git a/backend/metagenedb/api/catalog/qparams_validators/source.py b/backend/metagenedb/api/catalog/qparams_validators/source.py new file mode 100644 index 0000000000000000000000000000000000000000..7bdd0a2b66e2d8019f2c3454af13a35cddd3e04d --- /dev/null +++ b/backend/metagenedb/api/catalog/qparams_validators/source.py @@ -0,0 +1,7 @@ +from marshmallow import fields + +from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams + + +class SourceQueryParams(PaginatedQueryParams): + detailed = fields.Boolean() diff --git a/backend/metagenedb/api/catalog/views/source.py b/backend/metagenedb/api/catalog/views/source.py index fe888f88ef3b7cb6679c8357696f7a34ee8e66c2..6781dbbe446b0aa76003b0531c0ebb9c60eb73ae 100644 --- a/backend/metagenedb/api/catalog/views/source.py +++ b/backend/metagenedb/api/catalog/views/source.py @@ -1,7 +1,12 @@ from drf_yasg.utils import swagger_auto_schema +from marshmallow.exceptions import ValidationError +from rest_framework.response import Response +from rest_framework.status import HTTP_422_UNPROCESSABLE_ENTITY from metagenedb.apps.catalog.models import Source from metagenedb.apps.catalog.serializers import SourceSerializer +from metagenedb.api.catalog.qparams_validators.source import SourceQueryParams +from metagenedb.common.utils.external_api.doi_api import GetDOIExternalInfo from .base import BulkViewSet @@ -10,6 +15,7 @@ class SourceViewSet(BulkViewSet): queryset = Source.objects.all() serializer_class = SourceSerializer lookup_field = 'slug' + query_params_parser = SourceQueryParams @swagger_auto_schema( operation_description="List all gene sources", @@ -19,13 +25,36 @@ class SourceViewSet(BulkViewSet): def list(self, *args, **kwargs): return super().list(*args, **kwargs) + def _get_external_info(self, db_data): + detailed_info_retriever = GetDOIExternalInfo(db_data['doi']) + try: + detailed_data = detailed_info_retriever.get_details() + except NotImplementedError as not_implemented_error: + logger.warning("Could not found API for the source, returning item from the DB. Error: %s" % + not_implemented_error) + detailed_data = db_data + return detailed_data + @swagger_auto_schema( operation_description="Retrieve gene source from a name", operation_summary="API to retrieve gene source.", tags=['Source'], ) - def retrieve(self, *args, **kwargs): - return super().retrieve(*args, **kwargs) + def retrieve(self, request, *args, **kwargs): + try: + query_params = self.query_params_parser().load(request.query_params) + except ValidationError as validation_error: + error_message = validation_error.normalized_messages() + error_message.update({ + 'allowed_query_params': ', '.join(self.query_params_parser().declared_fields.keys()) + }) + return Response(error_message, status=HTTP_422_UNPROCESSABLE_ENTITY) + instance = self.get_object() + serializer = self.get_serializer(instance) + returned_data = serializer.data + if query_params.get('detailed', False) is True: + returned_data = self._get_external_info(returned_data) + return Response(returned_data) @swagger_auto_schema( tags=['Source'], diff --git a/backend/metagenedb/common/utils/external_api/doi_api.py b/backend/metagenedb/common/utils/external_api/doi_api.py new file mode 100644 index 0000000000000000000000000000000000000000..98de500622ae2e009b4c31a4de55fac978fc4333 --- /dev/null +++ b/backend/metagenedb/common/utils/external_api/doi_api.py @@ -0,0 +1,27 @@ +import logging + +from django.conf import settings + +from dabeplech import DOIAPI + + +logger = logging.getLogger(__name__) + + +class GetDOIExternalInfo: + + def __init__(self, doi: str): + self.doi = doi + + def get_details(self): + """ + Get detailed information from DOI. + """ + logger.info("Retrieving information from DOI") + api = DOIAPI() + response = api.get(self.doi) + response[settings.API_KEY_ADDITIONAL_INFO] = { + 'comment': f"Information retrieved from external source: {api.url}", + 'url': f"{api.last_url_requested}" + } + return response diff --git a/frontend/src/views/genedetail/genedetail.html b/frontend/src/views/genedetail/genedetail.html index e2b9a9789f95d012d50957de79c0861bd5c98cd9..a37e07cf49a32380f4f5cdc025fddd6ff99309ec 100644 --- a/frontend/src/views/genedetail/genedetail.html +++ b/frontend/src/views/genedetail/genedetail.html @@ -69,7 +69,7 @@ <v-toolbar class="tertiary white--text" dense> <v-icon class="white--text">format_list_bulleted</v-icon> <v-toolbar-title> - Gene source + Gene catalog </v-toolbar-title> </v-toolbar> <!-- Simple information -->