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

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

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)