You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2019/06/28 21:09:38 UTC

[airavata-django-portal] 01/03: AIRAVATA-3029 Add in any output view providers added to the app interface

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit f2b68c7c8576e36d0e038df2cb90ee823e381ec7
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Fri Jun 28 14:59:43 2019 -0400

    AIRAVATA-3029 Add in any output view providers added to the app interface
---
 django_airavata/apps/api/output_views.py | 36 +++++++++++++++++++++++++-------
 django_airavata/apps/api/views.py        | 22 ++++++++++++-------
 2 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/django_airavata/apps/api/output_views.py b/django_airavata/apps/api/output_views.py
index bae671f..2640dab 100644
--- a/django_airavata/apps/api/output_views.py
+++ b/django_airavata/apps/api/output_views.py
@@ -21,11 +21,12 @@ DEFAULT_VIEW_PROVIDERS = {
 }
 
 
-def get_output_views(experiment):
+def get_output_views(experiment, application_interface):
     output_views = {}
     for output in experiment.experimentOutputs:
         output_views[output.name] = []
-        output_view_provider_ids = _get_output_view_providers(output)
+        output_view_provider_ids = _get_output_view_providers(
+            output, application_interface)
         for output_view_provider_id in output_view_provider_ids:
             output_view_provider = None
             if output_view_provider_id in DEFAULT_VIEW_PROVIDERS:
@@ -59,21 +60,42 @@ def get_output_views(experiment):
     return output_views
 
 
-def _get_output_view_providers(experiment_output):
+def _get_output_view_providers(experiment_output, application_interface):
     output_view_providers = []
     logger.debug("experiment_output={}".format(experiment_output))
     if experiment_output.metaData:
         try:
             output_metadata = json.loads(experiment_output.metaData)
-            output_view_providers.extend(
-                output_metadata['output-view-providers'])
             logger.debug("output_metadata={}".format(output_metadata))
+            if 'output-view-providers' in output_metadata:
+                output_view_providers.extend(
+                    output_metadata['output-view-providers'])
         except Exception as e:
             logger.exception(
                 "Failed to parse metadata for output {}".format(
                     experiment_output.name))
     if 'default' not in output_view_providers:
         output_view_providers.insert(0, 'default')
-    # if len(output_view_providers) == 0:
-    #     output_view_providers.extend(_get_default_view_providers())
+    # Add in any output view providers defined on the application interface
+    app_output_view_providers = _get_application_output_view_providers(
+        application_interface, experiment_output.name)
+    for view_provider in app_output_view_providers:
+        if view_provider not in output_view_providers:
+            output_view_providers.append(view_provider)
     return output_view_providers
+
+
+def _get_application_output_view_providers(application_interface, output_name):
+    app_output = [o for o in application_interface.applicationOutputs if o.name == output_name]
+    if len(app_output) == 1:
+        app_output = app_output[0]
+    if app_output.metaData:
+        try:
+            output_metadata = json.loads(app_output.metaData)
+            if 'output-view-providers' in output_metadata:
+                return output_metadata['output-view-providers']
+        except Exception as e:
+            logger.exception(
+                "Failed to parse metadata for output {}".format(
+                    app_output.name))
+    return []
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 73b5f02..3c71f1f 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -431,7 +431,15 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
                 output.type == DataType.URI_COLLECTION)
             for dp in output.value.split(',')
             if output.value.startswith('airavata-dp')]
-        exp_output_views = output_views.get_output_views(experimentModel)
+        appInterfaceId = experimentModel.executionId
+        try:
+            applicationInterface = self.request.airavata_client \
+                .getApplicationInterface(self.authz_token, appInterfaceId)
+        except Exception as e:
+            log.exception("Failed to load app interface")
+            applicationInterface = None
+        exp_output_views = output_views.get_output_views(
+            experimentModel, applicationInterface)
         inputDataProducts = [
             self.request.airavata_client.getDataProduct(self.authz_token,
                                                         inp.value)
@@ -448,13 +456,13 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
                 inp.type == DataType.URI_COLLECTION)
             for dp in inp.value.split(',')
             if inp.value.startswith('airavata-dp')]
-        appInterfaceId = experimentModel.executionId
         try:
-            applicationInterface = self.request.airavata_client \
-                .getApplicationInterface(self.authz_token, appInterfaceId)
-            appModuleId = applicationInterface.applicationModules[0]
-            applicationModule = self.request.airavata_client \
-                .getApplicationModule(self.authz_token, appModuleId)
+            if applicationInterface is not None:
+                appModuleId = applicationInterface.applicationModules[0]
+                applicationModule = self.request.airavata_client \
+                    .getApplicationModule(self.authz_token, appModuleId)
+            else:
+                log.warning("Cannot log application model since app interface failed to load")
         except Exception as e:
             log.exception("Failed to load app interface/module")
             applicationModule = None