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