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 2018/04/25 14:01:59 UTC

[airavata-django-portal] 02/02: AIRAVATA-2760 Use editor UI component in metadata if available

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 632ef1e10af87f642fcd462a974ecf87dfadca04
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Wed Apr 25 10:01:47 2018 -0400

    AIRAVATA-2760 Use editor UI component in metadata if available
---
 django_airavata/apps/api/serializers.py               | 17 ++++++++++++++++-
 .../js/models/InputDataObjectType.js                  | 19 +++++++++++++++++++
 django_airavata/apps/api/views.py                     |  4 ++--
 .../js/components/experiment/ExperimentEditor.vue     |  5 +++++
 4 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/django_airavata/apps/api/serializers.py b/django_airavata/apps/api/serializers.py
index 3d64f7d..fffdd5f 100644
--- a/django_airavata/apps/api/serializers.py
+++ b/django_airavata/apps/api/serializers.py
@@ -1,6 +1,7 @@
 
 import copy
 import datetime
+import json
 import logging
 from urllib.parse import quote, urlencode
 
@@ -113,6 +114,20 @@ class GatewayIdDefaultField(serializers.CharField):
         self.default = settings.GATEWAY_ID
 
 
+class StoredJSONField(serializers.JSONField):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+    def to_representation(self, value):
+        try:
+            if value:
+                return json.loads(value)
+            else:
+                return value
+        except Exception:
+            return value
+
+
 class GroupSerializer(serializers.Serializer):
     url = FullyEncodedHyperlinkedIdentityField(view_name='django_airavata_api:group-detail', lookup_field='id', lookup_url_kwarg='group_id')
     id = serializers.CharField(default=GroupModel.thrift_spec[1][4], read_only=True)
@@ -198,7 +213,7 @@ class InputDataObjectTypeSerializer(serializers.Serializer):
     type = serializers.IntegerField(required=False)
     applicationArgument = serializers.CharField(required=False)
     standardInput = serializers.BooleanField(required=False)
-    metaData = serializers.CharField(required=False)
+    metaData = StoredJSONField(required=False)
     inputOrder = serializers.IntegerField(required=False)
     isRequired = serializers.BooleanField(required=False)
     requiredToAddedToCommandLine = serializers.BooleanField(required=False)
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
index eb5407b..c403d1d 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/InputDataObjectType.js
@@ -26,6 +26,25 @@ export default class InputDataObjectType extends BaseModel {
         super(FIELDS, data);
     }
 
+    get uiComponentId() {
+        const metadata = this._getMetadata();
+        if (metadata && 'editor' in metadata && 'ui-component-id' in metadata['editor']) {
+            return metadata['editor']['ui-component-id'];
+        } else {
+            return null;
+        }
+    }
+
+    _getMetadata() {
+        // metaData could really be anything, here we expect it to be an object
+        // so safely check if it is first
+        if (this.metaData && typeof this.metaData === 'object') {
+            return this.metaData;
+        } else {
+            return null;
+        }
+    }
+
     validate(experiment, value = undefined) {
         let inputValue = typeof value != 'undefined' ? value : this.value;
         let results = {};
diff --git a/django_airavata/apps/api/views.py b/django_airavata/apps/api/views.py
index 5e4f3d1..35ead26 100644
--- a/django_airavata/apps/api/views.py
+++ b/django_airavata/apps/api/views.py
@@ -445,8 +445,8 @@ class ApplicationModuleViewSet(APIBackedViewSet):
             if app_module_id in app_interface.applicationModules:
                 app_interfaces.append(app_interface)
         if len(app_interfaces) == 1:
-            serializer = thrift_utils.create_serializer(
-                ApplicationInterfaceDescription, instance=app_interfaces[0], context={'request': request})
+            serializer = serializers.ApplicationInterfaceDescriptionSerializer(
+                app_interfaces[0], context={'request': request})
             return Response(serializer.data)
         elif len(app_interfaces) > 1:
             log.error(
diff --git a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
index 94a8d44..dd201b2 100644
--- a/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
+++ b/django_airavata/apps/workspace/static/django_airavata_workspace/js/components/experiment/ExperimentEditor.vue
@@ -205,6 +205,11 @@ export default {
             return this.getValidationFeedback(properties) ? 'invalid' : null;
         },
         getInputEditorComponentName: function(experimentInput) {
+            // If input specifices an editor UI component, use that
+            if (experimentInput.uiComponentId) {
+                return experimentInput.uiComponentId;
+            }
+            // Default UI components based on input type
             if (experimentInput.type === models.DataType.STRING) {
                 return 'string-input-editor';
             } else if (experimentInput.type === models.DataType.URI) {

-- 
To stop receiving notification emails like this one, please contact
machristie@apache.org.