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:37 UTC

[airavata-django-portal] branch master updated (7ebf25a -> 9b038a2)

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

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


    from 7ebf25a  Remove margin-left on sibling block style buttons
     new f2b68c7  AIRAVATA-3029 Add in any output view providers added to the app interface
     new 43fcfb7  AIRAVATA-3209 Provide file object to view provider generate_data
     new 9b038a2  AIRAVATA-3029 Indicate active output view in menu

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 django_airavata/apps/api/output_views.py           | 89 ++++++++++++++++------
 django_airavata/apps/api/views.py                  | 22 ++++--
 .../output-displays/OutputDisplayContainer.vue     |  1 +
 3 files changed, 82 insertions(+), 30 deletions(-)


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

Posted by ma...@apache.org.
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


[airavata-django-portal] 03/03: AIRAVATA-3029 Indicate active output view in menu

Posted by ma...@apache.org.
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 9b038a27377374c736d90e2f84ffcced2e04e035
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Fri Jun 28 17:09:10 2019 -0400

    AIRAVATA-3029 Indicate active output view in menu
---
 .../js/components/experiment/output-displays/OutputDisplayContainer.vue  | 1 +
 1 file changed, 1 insertion(+)

diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
index a811909..57157ae 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/output-displays/OutputDisplayContainer.vue
@@ -13,6 +13,7 @@
         <b-dropdown-item
           v-for="view in outputViews"
           :key="view['provider-id']"
+          :active="view['provider-id'] === currentView['provider-id']"
           @click="selectView(view)"
         >{{ view['name']}}</b-dropdown-item>
       </b-dropdown>


[airavata-django-portal] 02/03: AIRAVATA-3209 Provide file object to view provider generate_data

Posted by ma...@apache.org.
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 43fcfb7a94b73863227acbe3c9697d6e85999909
Author: Marcus Christie <ma...@apache.org>
AuthorDate: Fri Jun 28 17:07:18 2019 -0400

    AIRAVATA-3209 Provide file object to view provider generate_data
---
 django_airavata/apps/api/output_views.py | 57 ++++++++++++++++++++++----------
 django_airavata/apps/api/views.py        |  2 +-
 2 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/django_airavata/apps/api/output_views.py b/django_airavata/apps/api/output_views.py
index 2640dab..d9fa758 100644
--- a/django_airavata/apps/api/output_views.py
+++ b/django_airavata/apps/api/output_views.py
@@ -3,6 +3,10 @@ import logging
 
 from django.conf import settings
 
+from airavata.model.application.io.ttypes import DataType
+
+from . import data_products_helper
+
 logger = logging.getLogger(__name__)
 
 
@@ -21,7 +25,7 @@ DEFAULT_VIEW_PROVIDERS = {
 }
 
 
-def get_output_views(experiment, application_interface):
+def get_output_views(request, experiment, application_interface):
     output_views = {}
     for output in experiment.experimentOutputs:
         output_views[output.name] = []
@@ -39,24 +43,18 @@ def get_output_views(experiment, application_interface):
                 logger.error("Unable to find output view provider with "
                              "name '{}'".format(output_view_provider_id))
             if output_view_provider is not None:
+                view_config = {
+                    'provider-id': output_view_provider_id,
+                    'display-type': output_view_provider.display_type,
+                    'name': getattr(output_view_provider, 'name',
+                                    output_view_provider_id)
+                }
                 if getattr(output_view_provider, 'immediate', False):
                     # Immediately call generate_data function
-                    # TODO: also pass a file object if URI (and handle
-                    # URI_COLLECTION)
-                    data = output_view_provider.generate_data(
-                        output, experiment)
-                    output_views[output.name].append({
-                        'provider-id': output_view_provider_id,
-                        'display-type': output_view_provider.display_type,
-                        'data': data,
-                        'name': getattr(output_view_provider, 'name', output_view_provider_id)
-                    })
-                else:
-                    output_views[output.name].append({
-                        'provider-id': output_view_provider_id,
-                        'display-type': output_view_provider.display_type,
-                        'name': getattr(output_view_provider, 'name', output_view_provider_id)
-                    })
+                    data = _generate_data(
+                        request, output_view_provider, output, experiment)
+                    view_config['data'] = data
+                output_views[output.name].append(view_config)
     return output_views
 
 
@@ -86,7 +84,9 @@ def _get_output_view_providers(experiment_output, application_interface):
 
 
 def _get_application_output_view_providers(application_interface, output_name):
-    app_output = [o for o in application_interface.applicationOutputs if o.name == 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:
@@ -99,3 +99,24 @@ def _get_application_output_view_providers(application_interface, output_name):
                 "Failed to parse metadata for output {}".format(
                     app_output.name))
     return []
+
+
+def _generate_data(request,
+                   output_view_provider,
+                   experiment_output,
+                   experiment):
+    # TODO: handle URI_COLLECTION also
+    logger.debug("getting data product for {}".format(experiment_output.value))
+    output_file = None
+    if (experiment_output.value and
+        experiment_output.type in (DataType.URI,
+                                   DataType.STDOUT,
+                                   DataType.STDERR) and
+            experiment_output.value.startswith("airavata-dp")):
+        data_product = request.airavata_client.getDataProduct(
+            request.authz_token, experiment_output.value)
+        if data_products_helper.exists(request, data_product):
+            output_file = data_products_helper.open()
+    data = output_view_provider.generate_data(
+        experiment_output, experiment, output_file=output_file)
+    return data
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 3c71f1f..b784582 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -439,7 +439,7 @@ class FullExperimentViewSet(mixins.RetrieveModelMixin,
             log.exception("Failed to load app interface")
             applicationInterface = None
         exp_output_views = output_views.get_output_views(
-            experimentModel, applicationInterface)
+            self.request, experimentModel, applicationInterface)
         inputDataProducts = [
             self.request.airavata_client.getDataProduct(self.authz_token,
                                                         inp.value)