From db3f33e9d632672bedf13090d18b6ba7ee5c2871 Mon Sep 17 00:00:00 2001 From: Kenzo-Hugo Hillion <kenzo-hugo.hillion1@pasteur.fr> Date: Fri, 15 Nov 2019 13:28:12 +0100 Subject: [PATCH] add detailed option for function API --- .../metagenedb/api/catalog/views/function.py | 17 ++++++++++++++++- .../api/catalog/views/test_function.py | 0 .../common/utils/external_api/test_togows.py | 0 .../common/utils/external_api/togows.py | 10 +++++++++- backend/metagenedb/settings/django.py | 3 +++ 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 backend/metagenedb/api/catalog/views/test_function.py create mode 100644 backend/metagenedb/common/utils/external_api/test_togows.py diff --git a/backend/metagenedb/api/catalog/views/function.py b/backend/metagenedb/api/catalog/views/function.py index 949909d..45f7ec7 100644 --- a/backend/metagenedb/api/catalog/views/function.py +++ b/backend/metagenedb/api/catalog/views/function.py @@ -1,19 +1,34 @@ + +import logging from rest_framework.response import Response from metagenedb.api.catalog.filters import FunctionFilter from metagenedb.apps.catalog.models import Function from metagenedb.apps.catalog.serializers import FunctionSerializer +from metagenedb.common.utils.external_api.togows import GetFunctionExternalInfo from .bulk_viewset import BulkViewSet +logger = logging.getLogger(__name__) + + class FunctionViewSet(BulkViewSet): queryset = Function.objects.all() serializer_class = FunctionSerializer lookup_field = 'function_id' filterset_class = FunctionFilter + def _get_external_info(self, db_data): + detailed_info_retriever = GetFunctionExternalInfo(db_data['function_id'], + db_data['source']) + detailed_data = detailed_info_retriever.get_details() # @TODO check consistency? + return detailed_data + def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) - return Response(serializer.data) + returned_data = serializer.data + if request.query_params.get('detailed', None): + returned_data = self._get_external_info(returned_data) + return Response(returned_data) diff --git a/backend/metagenedb/api/catalog/views/test_function.py b/backend/metagenedb/api/catalog/views/test_function.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/metagenedb/common/utils/external_api/test_togows.py b/backend/metagenedb/common/utils/external_api/test_togows.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/metagenedb/common/utils/external_api/togows.py b/backend/metagenedb/common/utils/external_api/togows.py index d319e0f..28cd6f7 100644 --- a/backend/metagenedb/common/utils/external_api/togows.py +++ b/backend/metagenedb/common/utils/external_api/togows.py @@ -1,5 +1,7 @@ import logging +from django.conf import settings + from bioapi.togows import TogoWSEntryAPI @@ -21,7 +23,13 @@ class GetFunctionExternalInfo: Get detailed information from KEGG orthology through Togows. """ kegg_api = TogoWSEntryAPI("kegg-orthology") - return kegg_api.get(self.function_id)[0] + response = kegg_api.get(self.function_id)[0] + response[settings.API_KEY_ADDITIONAL_INFO] = { + 'comment': f"Information retrieved from external source: {kegg_api.url}", + 'url': f"{kegg_api.url}{self.function_id}" + } + return response def get_details(self): + logger.info("Retrieving information from KEGG through togows") return getattr(self, f"_get_{self.source}", self._get_unknown_source)() diff --git a/backend/metagenedb/settings/django.py b/backend/metagenedb/settings/django.py index 53496e4..99b3700 100644 --- a/backend/metagenedb/settings/django.py +++ b/backend/metagenedb/settings/django.py @@ -146,3 +146,6 @@ STATIC_ROOT = public_root('static') STATIC_URL = env.str('STATIC_URL', default='/static/') SECRET_KEY = env.str('SECRET_KEY', default='') + +# -- key for API when additional information is added to the payload +API_KEY_ADDITIONAL_INFO = env.str('API_KEY_ADDITIONAL_INFO', default='metagenedb_additional_info') -- GitLab