From 595ae01362230a5c1e76766f9be56d2c1f2908f5 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Mon, 29 Nov 2021 15:11:19 +0100
Subject: [PATCH] TMSS-671: added fixed_time_scheduling_enabled setting,
 default True

---
 .../scheduling/lib/dynamic_scheduling.py      |  6 ++--
 .../src/tmss/tmssapp/models/specification.py  |  1 +
 SAS/TMSS/backend/src/tmss/tmssapp/populate.py |  3 +-
 .../authenticate/permission.stack.handler.js  |  3 +-
 .../tmss_webapp/src/services/util.service.js  | 31 ++++++++++++++++++-
 5 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
index ee4f26d905e..ca8b27b0ae1 100644
--- a/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
+++ b/SAS/TMSS/backend/services/scheduling/lib/dynamic_scheduling.py
@@ -407,8 +407,10 @@ class TMSSDynamicSchedulingMessageHandler(TMSSEventMessageHandler):
             if self._do_schedule_event.wait(timeout=10):
                 self._do_schedule_event.clear()
                 try:
-                    # always schedule fixed_time scheduling_units, even if dynamic scheduling is disabled
-                    schedule_fixed_time_scheduling_units()
+                    if models.Setting.objects.get(name=models.SystemSettingFlag.Choices.FIXED_TIME_SCHEDULING_ENABLED.value).value:
+                        schedule_fixed_time_scheduling_units()
+                    else:
+                        logger.warning("Skipping update of fixed_time schedule because the setting %s=%s", models.SystemSettingFlag.Choices.FIXED_TIME_SCHEDULING_ENABLED.value, models.Setting.objects.get(name=models.SystemSettingFlag.Choices.DYNAMIC_SCHEDULING_ENABLED.value).value)
 
                     if models.Setting.objects.get(name=models.SystemSettingFlag.Choices.DYNAMIC_SCHEDULING_ENABLED.value).value:
                         do_dynamic_schedule()
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
index f2a06f32ccb..e5a6ad4eae1 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/models/specification.py
@@ -95,6 +95,7 @@ class SystemSettingFlag(AbstractChoice):
     """Defines the model and predefined list of possible Flags to be used in Setting.
     The items in the Choises class below are automagically populated into the database via a data migration."""
     class Choices(Enum):
+        FIXED_TIME_SCHEDULING_ENABLED = "fixed_time_scheduling_enabled"
         DYNAMIC_SCHEDULING_ENABLED = "dynamic_scheduling_enabled"
 
 
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
index ce6817c8b8f..7132c6c62c3 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/populate.py
@@ -233,7 +233,8 @@ def populate_subtask_allowed_state_transitions_extra(apps, schema_editor):
         ])
 
 def populate_settings(apps, schema_editor):
-    Setting.objects.create(name=SystemSettingFlag.objects.get(value='dynamic_scheduling_enabled'), value=isDevelopmentEnvironment())
+    Setting.objects.create(name=SystemSettingFlag.objects.get(value=SystemSettingFlag.Choices.DYNAMIC_SCHEDULING_ENABLED.value), value=isDevelopmentEnvironment())
+    Setting.objects.create(name=SystemSettingFlag.objects.get(value=SystemSettingFlag.Choices.FIXED_TIME_SCHEDULING_ENABLED.value), value=True)
 
 def populate_test_data():
     """
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
index 79d7486e976..1a6619a6b52 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/authenticate/permission.stack.handler.js
@@ -46,6 +46,7 @@ const PermissionStackUtil = {
             task_relation_draft: 'task_relation_draft',
             task_relation_blueprint: 'task_relation_blueprint',
             dynamicScheduler: 'setting/dynamic_scheduling_enabled',
+            fixedTimeScheduler: 'setting/fixed_time_scheduling_enabled',
             systemevent: 'system_event',
         }
         const modules = Object.keys(module_url);
@@ -133,7 +134,7 @@ const PermissionStackUtil = {
                         delete: allowedPermission?(_.includes(allowedPermission, 'DELETE')):false
                     };
                 }
-                else if (module === 'dynamicScheduler') {
+                else if (module === 'dynamicScheduler' || module === 'fixedTimeScheduler') {
                     permissionStack[module] = {
                         setting: allowedPermission?(_.includes(allowedPermission, 'PATCH')):false,
                     };
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js b/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
index 4529a11408a..5bd4f7b13be 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/services/util.service.js
@@ -244,6 +244,20 @@ const UtilService = {
         return null;
       }
     },
+    /**
+     * Get FixedTime Scheduling On/Off Status
+     * @returns JSON object
+     */
+    getFixedTimeSchedulerStatus: async function() {
+      try {
+        const url = `/api/setting/fixed_time_scheduling_enabled`;
+        const response = await axios.get(url);
+        return response.data;
+      } catch (error) {
+        console.error('[getFixedTimeSchedulerStatus]',"Mistake", error);
+        return null;
+      }
+    },
     /**
      * Update Switch On/Off status of Dynamic Scheduling
      * @param {Object} JSON object 
@@ -258,7 +272,22 @@ const UtilService = {
         console.error('[updateDynamicSchedulerStatus]',"Mistake", error);
         return null
       }
-  },
+    },
+    /**
+     * Update Switch On/Off status of FixedTime Scheduling
+     * @param {Object} JSON object
+     * @returns
+     */
+    updateFixedTimeSchedulerStatus: async function (response) {
+      try {
+        const url = `/api/setting/fixed_time_scheduling_enabled`;
+        response = await axios.patch(url, response);
+        return response.data;
+      } catch (error) {
+        console.error('[updateFixedTimeSchedulerStatus]',"Mistake", error);
+        return null
+      }
+    },
 }
 
 export default UtilService;
\ No newline at end of file
-- 
GitLab