From ddd7f414795a6aabb1638e145383b6fc213ed592 Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Wed, 12 Oct 2022 05:43:48 +0300 Subject: [PATCH 01/27] initial --- src/config/config_service.py | 10 ++++++---- src/model/script_config.py | 5 +++++ src/web/server.py | 11 +++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/config/config_service.py b/src/config/config_service.py index c1182374..76edec32 100644 --- a/src/config/config_service.py +++ b/src/config/config_service.py @@ -3,13 +3,14 @@ import os import re from collections import namedtuple -from typing import Union +from typing import List, Union from auth.authorization import Authorizer from config.exceptions import InvalidConfigException from model import script_config from model.model_helper import InvalidFileException -from model.script_config import get_sorted_config +from model.script_config import get_sorted_config, GetShortConfigFailedError +from src.model.script_config import ShortConfig from utils import os_utils, file_utils, process_utils, custom_json, custom_yaml from utils.file_utils import to_filename from utils.string_utils import is_blank, strip @@ -176,7 +177,7 @@ def list_configs(self, user, mode=None): conf_service = self - def load_script(path, content): + def load_script(path, content) -> Union[ShortConfig, GetShortConfigFailedError]: try: config_object = self.load_config_file(path, content) short_config = script_config.read_short(path, config_object) @@ -193,6 +194,7 @@ def load_script(path, content): return short_config except: LOGGER.exception('Could not load script: ' + path) + return GetShortConfigFailedError(path) return self._visit_script_configs(load_script) @@ -209,7 +211,7 @@ def load_config_model(self, name, user, parameter_values=None, skip_invalid_para return self._load_script_config(path, config_object, user, parameter_values, skip_invalid_parameters) - def _visit_script_configs(self, visitor): + def _visit_script_configs(self, visitor) -> List[ Union[ShortConfig, GetShortConfigFailedError] ]: configs_dir = self._script_configs_folder files = os.listdir(configs_dir) diff --git a/src/model/script_config.py b/src/model/script_config.py index 3823c29d..dac281da 100644 --- a/src/model/script_config.py +++ b/src/model/script_config.py @@ -28,6 +28,11 @@ def __init__(self): self.admin_users = [] self.group = None +class GetShortConfigFailedError(object): + def __init__(self, path): + self.path = path + # self.group = 'Parsing failed' + self.cannotParse = True @observable_fields( 'script_command', diff --git a/src/web/server.py b/src/web/server.py index b052fa3c..3d2d68d7 100755 --- a/src/web/server.py +++ b/src/web/server.py @@ -137,9 +137,16 @@ def get(self, user): configs = self.application.config_service.list_configs(user, mode) - scripts = [{'name': conf.name, 'group': conf.group} for conf in configs] + scripts = [] + failed = [] - self.write(json.dumps({'scripts': scripts})) + for conf in configs: + if hasattr(conf, 'cannotParse'): + failed.append({'path': conf.path }) + else: + scripts.append({'name': conf.name, 'group': conf.group }) + + self.write(json.dumps({'scripts': scripts, 'failed': failed})) class AdminUpdateScriptEndpoint(BaseRequestHandler): From aa827623a6979bddc24fad75de07bc1517b581bf Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Fri, 14 Oct 2022 04:56:58 +0300 Subject: [PATCH 02/27] frontend initial (tests not fixed) --- .../components/scripts/ScriptFailedGroup.vue | 44 +++++++++++++++++++ .../components/scripts/ScriptListGroup.css | 20 +++++++++ .../components/scripts/ScriptListGroup.vue | 23 +--------- .../components/scripts/ScriptsList.vue | 12 ++++- web-src/src/main-app/store/scripts.js | 9 +++- 5 files changed, 83 insertions(+), 25 deletions(-) create mode 100644 web-src/src/main-app/components/scripts/ScriptFailedGroup.vue create mode 100644 web-src/src/main-app/components/scripts/ScriptListGroup.css diff --git a/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue b/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue new file mode 100644 index 00000000..171519fb --- /dev/null +++ b/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue @@ -0,0 +1,44 @@ + + + + + \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptListGroup.css b/web-src/src/main-app/components/scripts/ScriptListGroup.css new file mode 100644 index 00000000..f9395280 --- /dev/null +++ b/web-src/src/main-app/components/scripts/ScriptListGroup.css @@ -0,0 +1,20 @@ +.script-list-group .collection-item.script-group { + border: none; + display: flex; + flex-direction: row; + padding-right: 16px; + align-items: center; +} + +.script-list-group .collection-item.script-group span { + flex: 1 1 auto; +} + +.script-list-group .collection-item.script-group i { + flex: 0 0 auto; + line-height: 16px; +} + +.script-list-group .collection-item.script-list-item { + padding-left: 36px; +} \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptListGroup.vue b/web-src/src/main-app/components/scripts/ScriptListGroup.vue index ab9e5283..8f9013c7 100644 --- a/web-src/src/main-app/components/scripts/ScriptListGroup.vue +++ b/web-src/src/main-app/components/scripts/ScriptListGroup.vue @@ -30,26 +30,5 @@ export default { \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptsList.vue b/web-src/src/main-app/components/scripts/ScriptsList.vue index f283a29f..6fd087a8 100644 --- a/web-src/src/main-app/components/scripts/ScriptsList.vue +++ b/web-src/src/main-app/components/scripts/ScriptsList.vue @@ -4,6 +4,7 @@ + @@ -11,11 +12,12 @@ import {isBlankString, isEmptyString, isNull, removeElement} from '@/common/utils/common'; import {mapState} from 'vuex'; import ScriptListGroup from './ScriptListGroup'; +import ScriptFailedGroup from './ScriptFailedGroup'; import ScriptListItem from './ScriptListItem'; export default { name: 'ScriptsList', - components: {ScriptListGroup, ScriptListItem}, + components: {ScriptListGroup, ScriptListItem, ScriptFailedGroup}, props: { searchText: { type: String, @@ -30,7 +32,7 @@ export default { }, computed: { - ...mapState('scripts', ['scripts', 'selectedScript']), + ...mapState('scripts', ['scripts', 'selectedScript', 'failedScripts']), items() { let groups = this.scripts.filter(script => !isBlankString(script.group)) @@ -55,6 +57,12 @@ export default { result.sort((o1, o2) => o1.name.toLowerCase().localeCompare(o2.name.toLowerCase())); return result; + }, + + failedItems() { + const groupName = 'Failed to parse' + const result = {name: groupName, isGroup: true, scripts: [...this.failedScripts], isActive: this.activeGroup == groupName} + return result } }, methods: { diff --git a/web-src/src/main-app/store/scripts.js b/web-src/src/main-app/store/scripts.js index d3a8ac2f..3c8061f7 100644 --- a/web-src/src/main-app/store/scripts.js +++ b/web-src/src/main-app/store/scripts.js @@ -9,6 +9,7 @@ export default { state: { scripts: [], + failedScripts: [], selectedScript: null, predefinedParameters: null }, @@ -21,12 +22,14 @@ export default { axiosInstance.get('scripts') .then(({data}) => { - const {scripts} = data; + const scripts = data.scripts; + const failedScripts = data.failed; scripts.sort(function (script1, script2) { return script1.name.toLowerCase().localeCompare(script2.name.toLowerCase()); }); commit('SET_SCRIPTS', scripts); + commit('SET_FAILED_SCRIPTS', failedScripts); dispatch('selectScriptByHash'); }); }, @@ -73,6 +76,10 @@ export default { state.scripts = scripts }, + SET_FAILED_SCRIPTS(state, failedScripts) { + state.failedScripts = failedScripts + }, + SELECT_SCRIPT(state, {selectedScript, predefinedParameters}) { state.selectedScript = selectedScript; state.predefinedParameters = predefinedParameters; From fa4672ad898c71e5c8fd1429f9275b8c32feab4f Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Fri, 14 Oct 2022 05:05:21 +0300 Subject: [PATCH 03/27] a lil clarification in group name --- web-src/src/main-app/components/scripts/ScriptsList.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-src/src/main-app/components/scripts/ScriptsList.vue b/web-src/src/main-app/components/scripts/ScriptsList.vue index 6fd087a8..5bf762de 100644 --- a/web-src/src/main-app/components/scripts/ScriptsList.vue +++ b/web-src/src/main-app/components/scripts/ScriptsList.vue @@ -60,7 +60,7 @@ export default { }, failedItems() { - const groupName = 'Failed to parse' + const groupName = 'Failed to parse (these files have invalid JSON structure)' const result = {name: groupName, isGroup: true, scripts: [...this.failedScripts], isActive: this.activeGroup == groupName} return result } From 0cf987329fcab7aaefe6e018d2bd7d0b90d28a3c Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Sun, 16 Oct 2022 01:42:24 +0300 Subject: [PATCH 04/27] added parsing_failed to ShortConfig type (.py files only) --- src/config/config_service.py | 12 +++++++----- src/model/script_config.py | 7 +------ src/web/server.py | 11 ++--------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/config/config_service.py b/src/config/config_service.py index 76edec32..5f7ff8b5 100644 --- a/src/config/config_service.py +++ b/src/config/config_service.py @@ -9,8 +9,7 @@ from config.exceptions import InvalidConfigException from model import script_config from model.model_helper import InvalidFileException -from model.script_config import get_sorted_config, GetShortConfigFailedError -from src.model.script_config import ShortConfig +from model.script_config import get_sorted_config, ShortConfig from utils import os_utils, file_utils, process_utils, custom_json, custom_yaml from utils.file_utils import to_filename from utils.string_utils import is_blank, strip @@ -177,7 +176,7 @@ def list_configs(self, user, mode=None): conf_service = self - def load_script(path, content) -> Union[ShortConfig, GetShortConfigFailedError]: + def load_script(path, content) -> ShortConfig: try: config_object = self.load_config_file(path, content) short_config = script_config.read_short(path, config_object) @@ -194,7 +193,10 @@ def load_script(path, content) -> Union[ShortConfig, GetShortConfigFailedError]: return short_config except: LOGGER.exception('Could not load script: ' + path) - return GetShortConfigFailedError(path) + failed_short_config = ShortConfig() + failed_short_config.name = path + failed_short_config.parsing_failed = True + return failed_short_config return self._visit_script_configs(load_script) @@ -211,7 +213,7 @@ def load_config_model(self, name, user, parameter_values=None, skip_invalid_para return self._load_script_config(path, config_object, user, parameter_values, skip_invalid_parameters) - def _visit_script_configs(self, visitor) -> List[ Union[ShortConfig, GetShortConfigFailedError] ]: + def _visit_script_configs(self, visitor) -> List[ ShortConfig ]: configs_dir = self._script_configs_folder files = os.listdir(configs_dir) diff --git a/src/model/script_config.py b/src/model/script_config.py index dac281da..f1ff0773 100644 --- a/src/model/script_config.py +++ b/src/model/script_config.py @@ -27,12 +27,7 @@ def __init__(self): self.allowed_users = [] self.admin_users = [] self.group = None - -class GetShortConfigFailedError(object): - def __init__(self, path): - self.path = path - # self.group = 'Parsing failed' - self.cannotParse = True + self.parsing_failed = False @observable_fields( 'script_command', diff --git a/src/web/server.py b/src/web/server.py index 3d2d68d7..b052fa3c 100755 --- a/src/web/server.py +++ b/src/web/server.py @@ -137,16 +137,9 @@ def get(self, user): configs = self.application.config_service.list_configs(user, mode) - scripts = [] - failed = [] + scripts = [{'name': conf.name, 'group': conf.group} for conf in configs] - for conf in configs: - if hasattr(conf, 'cannotParse'): - failed.append({'path': conf.path }) - else: - scripts.append({'name': conf.name, 'group': conf.group }) - - self.write(json.dumps({'scripts': scripts, 'failed': failed})) + self.write(json.dumps({'scripts': scripts})) class AdminUpdateScriptEndpoint(BaseRequestHandler): From 1e406ea19dfd098ce7d7910e6bb4ad4be993df0b Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Sun, 16 Oct 2022 02:03:02 +0300 Subject: [PATCH 05/27] reverting vue changes --- .../components/scripts/ScriptFailedGroup.vue | 44 ------------------- .../components/scripts/ScriptListGroup.css | 20 --------- .../components/scripts/ScriptListGroup.vue | 20 ++++++++- .../components/scripts/ScriptsList.vue | 12 +---- web-src/src/main-app/store/scripts.js | 8 +--- 5 files changed, 22 insertions(+), 82 deletions(-) delete mode 100644 web-src/src/main-app/components/scripts/ScriptFailedGroup.vue delete mode 100644 web-src/src/main-app/components/scripts/ScriptListGroup.css diff --git a/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue b/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue deleted file mode 100644 index 171519fb..00000000 --- a/web-src/src/main-app/components/scripts/ScriptFailedGroup.vue +++ /dev/null @@ -1,44 +0,0 @@ - - - - - \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptListGroup.css b/web-src/src/main-app/components/scripts/ScriptListGroup.css deleted file mode 100644 index f9395280..00000000 --- a/web-src/src/main-app/components/scripts/ScriptListGroup.css +++ /dev/null @@ -1,20 +0,0 @@ -.script-list-group .collection-item.script-group { - border: none; - display: flex; - flex-direction: row; - padding-right: 16px; - align-items: center; -} - -.script-list-group .collection-item.script-group span { - flex: 1 1 auto; -} - -.script-list-group .collection-item.script-group i { - flex: 0 0 auto; - line-height: 16px; -} - -.script-list-group .collection-item.script-list-item { - padding-left: 36px; -} \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptListGroup.vue b/web-src/src/main-app/components/scripts/ScriptListGroup.vue index 8f9013c7..3d1711b9 100644 --- a/web-src/src/main-app/components/scripts/ScriptListGroup.vue +++ b/web-src/src/main-app/components/scripts/ScriptListGroup.vue @@ -30,5 +30,23 @@ export default { \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptsList.vue b/web-src/src/main-app/components/scripts/ScriptsList.vue index 5bf762de..6cbd8c68 100644 --- a/web-src/src/main-app/components/scripts/ScriptsList.vue +++ b/web-src/src/main-app/components/scripts/ScriptsList.vue @@ -4,7 +4,6 @@ - @@ -12,12 +11,11 @@ import {isBlankString, isEmptyString, isNull, removeElement} from '@/common/utils/common'; import {mapState} from 'vuex'; import ScriptListGroup from './ScriptListGroup'; -import ScriptFailedGroup from './ScriptFailedGroup'; import ScriptListItem from './ScriptListItem'; export default { name: 'ScriptsList', - components: {ScriptListGroup, ScriptListItem, ScriptFailedGroup}, + components: {ScriptListGroup, ScriptListItem}, props: { searchText: { type: String, @@ -32,7 +30,7 @@ export default { }, computed: { - ...mapState('scripts', ['scripts', 'selectedScript', 'failedScripts']), + ...mapState('scripts', ['scripts', 'selectedScript']), items() { let groups = this.scripts.filter(script => !isBlankString(script.group)) @@ -58,12 +56,6 @@ export default { return result; }, - - failedItems() { - const groupName = 'Failed to parse (these files have invalid JSON structure)' - const result = {name: groupName, isGroup: true, scripts: [...this.failedScripts], isActive: this.activeGroup == groupName} - return result - } }, methods: { groupClicked(groupName) { diff --git a/web-src/src/main-app/store/scripts.js b/web-src/src/main-app/store/scripts.js index 3c8061f7..4e92c997 100644 --- a/web-src/src/main-app/store/scripts.js +++ b/web-src/src/main-app/store/scripts.js @@ -22,14 +22,12 @@ export default { axiosInstance.get('scripts') .then(({data}) => { - const scripts = data.scripts; - const failedScripts = data.failed; + const {scripts} = data; scripts.sort(function (script1, script2) { return script1.name.toLowerCase().localeCompare(script2.name.toLowerCase()); }); commit('SET_SCRIPTS', scripts); - commit('SET_FAILED_SCRIPTS', failedScripts); dispatch('selectScriptByHash'); }); }, @@ -76,10 +74,6 @@ export default { state.scripts = scripts }, - SET_FAILED_SCRIPTS(state, failedScripts) { - state.failedScripts = failedScripts - }, - SELECT_SCRIPT(state, {selectedScript, predefinedParameters}) { state.selectedScript = selectedScript; state.predefinedParameters = predefinedParameters; From 56d0b8e2a36358de519d191ce7f913d0b26c78a6 Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Sun, 16 Oct 2022 02:05:55 +0300 Subject: [PATCH 06/27] additional Vue reverts --- .../components/scripts/ScriptListGroup.vue | 37 ++++++++++--------- .../components/scripts/ScriptsList.vue | 2 +- web-src/src/main-app/store/scripts.js | 1 - 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/web-src/src/main-app/components/scripts/ScriptListGroup.vue b/web-src/src/main-app/components/scripts/ScriptListGroup.vue index 3d1711b9..ab9e5283 100644 --- a/web-src/src/main-app/components/scripts/ScriptListGroup.vue +++ b/web-src/src/main-app/components/scripts/ScriptListGroup.vue @@ -31,22 +31,25 @@ export default { \ No newline at end of file diff --git a/web-src/src/main-app/components/scripts/ScriptsList.vue b/web-src/src/main-app/components/scripts/ScriptsList.vue index 6cbd8c68..f283a29f 100644 --- a/web-src/src/main-app/components/scripts/ScriptsList.vue +++ b/web-src/src/main-app/components/scripts/ScriptsList.vue @@ -55,7 +55,7 @@ export default { result.sort((o1, o2) => o1.name.toLowerCase().localeCompare(o2.name.toLowerCase())); return result; - }, + } }, methods: { groupClicked(groupName) { diff --git a/web-src/src/main-app/store/scripts.js b/web-src/src/main-app/store/scripts.js index 4e92c997..d3a8ac2f 100644 --- a/web-src/src/main-app/store/scripts.js +++ b/web-src/src/main-app/store/scripts.js @@ -9,7 +9,6 @@ export default { state: { scripts: [], - failedScripts: [], selectedScript: null, predefinedParameters: null }, From 62df42980a8a4f8ec58ac95432a472899a7e6821 Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Mon, 17 Oct 2022 03:49:02 +0300 Subject: [PATCH 07/27] server.py parsing_failed parameter transmission fixed --- src/web/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/web/server.py b/src/web/server.py index b052fa3c..60684f9e 100755 --- a/src/web/server.py +++ b/src/web/server.py @@ -137,7 +137,7 @@ def get(self, user): configs = self.application.config_service.list_configs(user, mode) - scripts = [{'name': conf.name, 'group': conf.group} for conf in configs] + scripts = [{'name': conf.name, 'group': conf.group, 'parsing_failed': conf.parsing_failed } for conf in configs] self.write(json.dumps({'scripts': scripts})) From a33f79ee7c373d1604f6b9aa6c33b95e38feb69e Mon Sep 17 00:00:00 2001 From: RollingHog <46373241+RollingHog@users.noreply.github.com> Date: Mon, 17 Oct 2022 03:50:21 +0300 Subject: [PATCH 08/27] bad script red highlight added --- .../src/main-app/components/scripts/ScriptListItem.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/web-src/src/main-app/components/scripts/ScriptListItem.vue b/web-src/src/main-app/components/scripts/ScriptListItem.vue index 3c653da1..088d1275 100644 --- a/web-src/src/main-app/components/scripts/ScriptListItem.vue +++ b/web-src/src/main-app/components/scripts/ScriptListItem.vue @@ -1,7 +1,7 @@