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/01/25 22:09:37 UTC

[airavata-django-portal] 04/06: AIRAVATA-2615 Implementing ExperimentState as an enum

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 73b380cd3b3b420e43124e0cd1939d32ecc09c94
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Thu Jan 25 10:57:01 2018 -0500

    AIRAVATA-2615 Implementing ExperimentState as an enum
---
 .../django_airavata_api/js/models/BaseEnum.js      | 25 ++++++++++++++++++++++
 .../django_airavata_api/js/models/BaseModel.js     | 10 ++++++++-
 .../js/models/ExperimentState.js                   | 15 +++++++++++++
 .../js/models/ExperimentStatus.js                  | 23 +++++---------------
 .../js/models/FullExperiment.js                    |  2 +-
 5 files changed, 55 insertions(+), 20 deletions(-)

diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseEnum.js b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseEnum.js
new file mode 100644
index 0000000..bb11276
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseEnum.js
@@ -0,0 +1,25 @@
+
+export default class BaseEnum {
+    constructor(name, value) {
+        this.name = name;
+        this.value = value;
+        // immutable
+        Object.freeze(this);
+    }
+    toJSON() {
+        return this.value;
+    }
+    static byName(name) {
+        return this.values.find(x => x.name === name);
+    }
+    static byValue(value) {
+        return this.values.find(x => x.value === value);
+    }
+    // This must be called to initialize static methods on the Enum subclass
+    static init(names) {
+        const enums = names.map((name, index) => new this(name, index));
+        Object.freeze(enums);
+        Object.defineProperty(this, 'values', {get: function() { return enums;}});
+        this.values.forEach(v => this[v.name] = v);
+    }
+}
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
index 49f773b..8b5679f 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/BaseModel.js
@@ -1,3 +1,4 @@
+import BaseEnum from './BaseEnum'
 
 export default class BaseModel {
 
@@ -51,7 +52,14 @@ export default class BaseModel {
     }
 
     convertModelField(modelClass, fieldValue, fieldDefault) {
-        return typeof fieldValue !== 'undefined' ? new modelClass(fieldValue) : fieldDefault;
+        if (typeof fieldValue !== 'undefined') {
+            if (modelClass.prototype instanceof BaseEnum) {
+                return modelClass.byValue(fieldValue);
+            } else {
+                return new modelClass(fieldValue);
+            }
+        }
+        return fieldDefault;
     }
 
     getDefaultValue(fieldDefault) {
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentState.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentState.js
new file mode 100644
index 0000000..ab3a626
--- /dev/null
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentState.js
@@ -0,0 +1,15 @@
+import BaseEnum from './BaseEnum'
+
+export default class ExperimentState extends BaseEnum {
+}
+ExperimentState.init([
+    'CREATED',
+    'VALIDATED',
+    'SCHEDULED',
+    'LAUNCHED',
+    'EXECUTING',
+    'CANCELING',
+    'CANCELED',
+    'COMPLETED',
+    'FAILED'
+]);
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js
index 2b5efc7..2660cf3 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/ExperimentStatus.js
@@ -1,8 +1,11 @@
 import BaseModel from './BaseModel';
+import ExperimentState from './ExperimentState';
 
 const FIELDS = [
-    // TODO: state is an enum field
-     'state',
+     {
+         name: 'state',
+         type: ExperimentState,
+     },
      {
          name: 'timeOfStateChange',
          type: 'date',
@@ -10,24 +13,8 @@ const FIELDS = [
      'reason',
 ];
 
-const STATE_NAMES = {
-    0: "CREATED",
-    1: "VALIDATED",
-    2: "SCHEDULED",
-    3: "LAUNCHED",
-    4: "EXECUTING",
-    5: "CANCELING",
-    6: "CANCELED",
-    7: "COMPLETED",
-    8: "FAILED",
-}
-
 export default class ExperimentStatus extends BaseModel {
     constructor(data = {}) {
         super(FIELDS, data);
     }
-
-    get stateName() {
-        return STATE_NAMES[this.state];
-    }
 }
diff --git a/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js b/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
index 34e8d65..6059b2a 100644
--- a/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
+++ b/django_airavata/apps/api/static/django_airavata_api/js/models/FullExperiment.js
@@ -59,6 +59,6 @@ export default class FullExperiment extends BaseModel {
     }
 
     get experimentStatusName() {
-        return this.experimentStatus ? this.experimentStatus.stateName : null;
+        return this.experimentStatus ? this.experimentStatus.state.name : null;
     }
 }

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