From 66761a2544bb2b625e7947f7accf828e06ee906f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 12:51:26 +0100 Subject: [PATCH 01/37] set stylesheet on main windows instead of on application --- pype/tools/settings/__main__.py | 3 --- pype/tools/settings/settings/widgets/window.py | 7 ++++++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pype/tools/settings/__main__.py b/pype/tools/settings/__main__.py index 2e27c28208..7e9f80a52c 100644 --- a/pype/tools/settings/__main__.py +++ b/pype/tools/settings/__main__.py @@ -6,9 +6,6 @@ from Qt import QtWidgets, QtGui if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) - - stylesheet = settings.style.load_stylesheet() - app.setStyleSheet(stylesheet) app.setWindowIcon(QtGui.QIcon(settings.style.app_icon_path())) _develop = "-d" in sys.argv or "--develop" in sys.argv diff --git a/pype/tools/settings/settings/widgets/window.py b/pype/tools/settings/settings/widgets/window.py index 670d00fb2b..2dd5111d74 100644 --- a/pype/tools/settings/settings/widgets/window.py +++ b/pype/tools/settings/settings/widgets/window.py @@ -1,5 +1,6 @@ -from Qt import QtWidgets +from Qt import QtWidgets, QtGui from .base import SystemWidget, ProjectWidget +from .. import style class MainWidget(QtWidgets.QWidget): @@ -13,6 +14,10 @@ class MainWidget(QtWidgets.QWidget): self.resize(self.widget_width, self.widget_height) + stylesheet = style.load_stylesheet() + self.setStyleSheet(stylesheet) + self.setWindowIcon(QtGui.QIcon(style.app_icon_path())) + header_tab_widget = QtWidgets.QTabWidget(parent=self) studio_widget = SystemWidget(user_role, header_tab_widget) From 8c2f4876c9a2fb3a65cc498508796e08d06d5495 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 12:52:48 +0100 Subject: [PATCH 02/37] added settings module --- pype/modules/__init__.py | 4 ++- pype/modules/base.py | 3 +- pype/modules/settings_module.py | 53 +++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 pype/modules/settings_module.py diff --git a/pype/modules/__init__.py b/pype/modules/__init__.py index 11157f24b1..00303aafc6 100644 --- a/pype/modules/__init__.py +++ b/pype/modules/__init__.py @@ -7,7 +7,7 @@ from .base import ( ModulesManager, TrayModulesManager ) - +from .settings_module import SettingsModule from .rest_api import ( RestApiModule, IRestApi @@ -44,6 +44,8 @@ __all__ = ( "ModulesManager", "TrayModulesManager", + "SettingsModule", + "UserModule", "IUserModule", diff --git a/pype/modules/base.py b/pype/modules/base.py index 72d0eb4503..0176384a59 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -390,7 +390,8 @@ class TrayModulesManager(ModulesManager): "Avalon", "Clockify", "Standalone Publish", - "Logging" + "Logging", + "settings" ) def __init__(self): diff --git a/pype/modules/settings_module.py b/pype/modules/settings_module.py new file mode 100644 index 0000000000..dbc28786a0 --- /dev/null +++ b/pype/modules/settings_module.py @@ -0,0 +1,53 @@ +from . import PypeModule, ITrayModule + + +class SettingsModule(PypeModule, ITrayModule): + name = "settings" + + def initialize(self, _modules_settings): + # This module is always enabled + self.enabled = True + + # User role + # TODO should be changeable + self.user_role = "manager" + + # Tray attributes + self.settings_window = None + + def connect_with_modules(self, *_a, **_kw): + return + + def create_settings_window(self): + if self.settings_window: + return + from pype.tools.settings import MainWidget + self.settings_window = MainWidget(self.user_role) + + def show_settings_window(self): + if not self.settings_window: + raise AssertionError("Window is not initialized.") + + self.settings_window.show() + + # Pull window to the front. + self.settings_window.raise_() + self.settings_window.activateWindow() + + def tray_init(self): + self.create_settings_window() + + def tray_menu(self, tray_menu): + """Add **change credentials** option to tray menu.""" + from Qt import QtWidgets + + # Actions + action = QtWidgets.QAction("Settings", tray_menu) + action.triggered.connect(self.show_settings_window) + tray_menu.addAction(action) + + def tray_start(self): + return + + def tray_exit(self): + return From d9560df784d49398c5180500bde950bcc7401a6b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 13:12:08 +0100 Subject: [PATCH 03/37] change default user role to developer --- pype/modules/settings_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pype/modules/settings_module.py b/pype/modules/settings_module.py index dbc28786a0..0651170148 100644 --- a/pype/modules/settings_module.py +++ b/pype/modules/settings_module.py @@ -10,7 +10,7 @@ class SettingsModule(PypeModule, ITrayModule): # User role # TODO should be changeable - self.user_role = "manager" + self.user_role = "developer" # Tray attributes self.settings_window = None From 6a3184e56f68439f74cbb435489b74af61ba0649 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 13:15:49 +0100 Subject: [PATCH 04/37] do not cache defaults --- pype/settings/lib.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index dfd4707dbf..11ade3abcd 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -80,10 +80,12 @@ def reset_default_settings(): def get_default_settings(): - global _DEFAULT_SETTINGS - if _DEFAULT_SETTINGS is None: - _DEFAULT_SETTINGS = load_jsons_from_dir(DEFAULTS_DIR) - return copy.deepcopy(_DEFAULT_SETTINGS) + # TODO add cacher + return load_jsons_from_dir(DEFAULTS_DIR) + # global _DEFAULT_SETTINGS + # if _DEFAULT_SETTINGS is None: + # _DEFAULT_SETTINGS = load_jsons_from_dir(DEFAULTS_DIR) + # return copy.deepcopy(_DEFAULT_SETTINGS) def load_json_file(fpath): From ab5fadccbb18e6c53687fc1e51b8feb9867a391b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:05:21 +0100 Subject: [PATCH 05/37] extracted constants to constants.py --- pype/settings/constants.py | 36 +++++++++++++ pype/settings/lib.py | 54 +++++--------------- pype/tools/settings/settings/widgets/base.py | 7 +-- 3 files changed, 54 insertions(+), 43 deletions(-) create mode 100644 pype/settings/constants.py diff --git a/pype/settings/constants.py b/pype/settings/constants.py new file mode 100644 index 0000000000..4a9f0e2287 --- /dev/null +++ b/pype/settings/constants.py @@ -0,0 +1,36 @@ +# Metadata keys for work with studio and project overrides +M_OVERRIDEN_KEY = "__overriden_keys__" +# Metadata key for storing information about environments +M_ENVIRONMENT_KEY = "__environment_keys__" +# Metadata key for storing dynamic created labels +M_DYNAMIC_KEY_LABEL = "__dynamic_keys_labels__" +# NOTE key popping not implemented yet +M_POP_KEY = "__pop_key__" + +METADATA_KEYS = ( + M_OVERRIDEN_KEY, + M_ENVIRONMENT_KEY, + M_DYNAMIC_KEY_LABEL, + M_POP_KEY +) + +# File where studio's system overrides are stored +SYSTEM_SETTINGS_KEY = "system_settings" +ENVIRONMENTS_KEY = "environments" +PROJECT_SETTINGS_KEY = "project_settings" +PROJECT_ANATOMY_KEY = "project_anatomy" + + +__all__ = ( + "M_OVERRIDEN_KEY", + "M_ENVIRONMENT_KEY", + "M_DYNAMIC_KEY_LABEL", + "M_POP_KEY", + + "METADATA_KEYS", + + "SYSTEM_SETTINGS_KEY", + "ENVIRONMENTS_KEY", + "PROJECT_SETTINGS_KEY", + "PROJECT_ANATOMY_KEY" +) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index dfd4707dbf..62febfc1d2 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -2,52 +2,26 @@ import os import json import logging import copy +from .constants import ( + M_OVERRIDEN_KEY, + M_ENVIRONMENT_KEY, + M_DYNAMIC_KEY_LABEL, + M_POP_KEY, + + METADATA_KEYS, + + SYSTEM_SETTINGS_KEY, + ENVIRONMENTS_KEY, + PROJECT_SETTINGS_KEY, + PROJECT_ANATOMY_KEY +) +) log = logging.getLogger(__name__) # Py2 + Py3 json decode exception JSON_EXC = getattr(json.decoder, "JSONDecodeError", ValueError) -# Metadata keys for work with studio and project overrides -M_OVERRIDEN_KEY = "__overriden_keys__" -# Metadata key for storing information about environments -M_ENVIRONMENT_KEY = "__environment_keys__" -# Metadata key for storing dynamic created labels -M_DYNAMIC_KEY_LABEL = "__dynamic_keys_labels__" -# NOTE key popping not implemented yet -M_POP_KEY = "__pop_key__" - -METADATA_KEYS = ( - M_OVERRIDEN_KEY, - M_ENVIRONMENT_KEY, - M_DYNAMIC_KEY_LABEL, - M_POP_KEY -) - -# Folder where studio overrides are stored -STUDIO_OVERRIDES_PATH = os.getenv("PYPE_PROJECT_CONFIGS") or "" - -# File where studio's system overrides are stored -SYSTEM_SETTINGS_KEY = "system_settings" -SYSTEM_SETTINGS_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, SYSTEM_SETTINGS_KEY + ".json" -) - -# File where studio's environment overrides are stored -ENVIRONMENTS_KEY = "environments" - -# File where studio's default project overrides are stored -PROJECT_SETTINGS_KEY = "project_settings" -PROJECT_SETTINGS_FILENAME = PROJECT_SETTINGS_KEY + ".json" -PROJECT_SETTINGS_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, PROJECT_SETTINGS_FILENAME -) - -PROJECT_ANATOMY_KEY = "project_anatomy" -PROJECT_ANATOMY_FILENAME = PROJECT_ANATOMY_KEY + ".json" -PROJECT_ANATOMY_PATH = os.path.join( - STUDIO_OVERRIDES_PATH, PROJECT_ANATOMY_FILENAME -) # Path to default settings DEFAULTS_DIR = os.path.join(os.path.dirname(__file__), "defaults") diff --git a/pype/tools/settings/settings/widgets/base.py b/pype/tools/settings/settings/widgets/base.py index 4ff7ec26e7..ddd814e38e 100644 --- a/pype/tools/settings/settings/widgets/base.py +++ b/pype/tools/settings/settings/widgets/base.py @@ -2,11 +2,12 @@ import os import copy import json from Qt import QtWidgets, QtCore, QtGui -from pype.settings.lib import ( +from pype.settings.constants import ( SYSTEM_SETTINGS_KEY, PROJECT_SETTINGS_KEY, - PROJECT_ANATOMY_KEY, - + PROJECT_ANATOMY_KEY +) +from pype.settings.lib import ( DEFAULTS_DIR, reset_default_settings, From 5d9fb93558e9dfa436afb9d3ad156cfeb89c48d9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:06:26 +0100 Subject: [PATCH 06/37] implemented abstract settings handler SettingsHandler --- pype/settings/handlers.py | 89 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 pype/settings/handlers.py diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py new file mode 100644 index 0000000000..b2381ed4f6 --- /dev/null +++ b/pype/settings/handlers.py @@ -0,0 +1,89 @@ +from abc import ABCMeta, abstractmethod +import six + + +@six.add_metaclass(ABCMeta) +class SettingsHandler: + @abstractmethod + def save_studio_settings(self, data): + """Save studio overrides of system settings. + + Do not use to store whole system settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function + `studio_system_settings`. + + Args: + data(dict): Data of studio overrides with override metadata. + """ + pass + + @abstractmethod + def save_project_settings(self, project_name, overrides): + """Save studio overrides of project settings. + + Data are saved for specific project or as defaults for all projects. + + Do not use to store whole project settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function + `get_studio_project_settings_overrides` for global project settings + and `get_project_settings_overrides` for project specific settings. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + pass + + @abstractmethod + def save_project_anatomy(self, project_name, anatomy_data): + """Save studio overrides of project anatomy data. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + pass + + @abstractmethod + def get_studio_system_settings_overrides(self): + """Studio overrides of system settings.""" + pass + + @abstractmethod + def get_studio_project_settings_overrides(self): + """Studio overrides of default project settings.""" + pass + + @abstractmethod + def get_studio_project_anatomy_overrides(self): + """Studio overrides of default project anatomy data.""" + pass + + @abstractmethod + def get_project_settings_overrides(self, project_name): + """Studio overrides of project settings for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ + pass + + @abstractmethod + def get_project_anatomy_overrides(self, project_name): + """Studio overrides of project anatomy for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ + pass + From de92f0a8d3c06f3c282b827d6eb80e1a188d26fd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:07:47 +0100 Subject: [PATCH 07/37] extracted current storing process to SettingsFileHandler --- pype/settings/handlers.py | 208 +++++++++++++++++++ pype/settings/lib.py | 163 ++------------- pype/tools/settings/settings/widgets/base.py | 49 +++-- 3 files changed, 248 insertions(+), 172 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index b2381ed4f6..c1829273b1 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -1,5 +1,24 @@ +import os +import json +import logging from abc import ABCMeta, abstractmethod import six +import pype +from .constants import ( + M_OVERRIDEN_KEY, + M_ENVIRONMENT_KEY, + M_DYNAMIC_KEY_LABEL, + M_POP_KEY, + + METADATA_KEYS, + + SYSTEM_SETTINGS_KEY, + ENVIRONMENTS_KEY, + PROJECT_SETTINGS_KEY, + PROJECT_ANATOMY_KEY +) + +JSON_EXC = getattr(json.decoder, "JSONDecodeError", ValueError) @six.add_metaclass(ABCMeta) @@ -87,3 +106,192 @@ class SettingsHandler: """ pass + +class SettingsFileHandler(SettingsHandler): + def __init__(self): + self.log = logging.getLogger("SettingsFileHandler") + + # Folder where studio overrides are stored + studio_overrides_dir = os.getenv("PYPE_PROJECT_CONFIGS") + if not studio_overrides_dir: + studio_overrides_dir = os.path.dirname(os.path.dirname( + os.path.abspath(pype.__file__) + )) + system_settings_path = os.path.join( + studio_overrides_dir, SYSTEM_SETTINGS_KEY + ".json" + ) + + # File where studio's default project overrides are stored + project_settings_filename = PROJECT_SETTINGS_KEY + ".json" + project_settings_path = os.path.join( + studio_overrides_dir, project_settings_filename + ) + + project_anatomy_filename = PROJECT_ANATOMY_KEY + ".json" + project_anatomy_path = os.path.join( + studio_overrides_dir, project_anatomy_filename + ) + + self.studio_overrides_dir = studio_overrides_dir + self.system_settings_path = system_settings_path + + self.project_settings_filename = project_settings_filename + self.project_anatomy_filename = project_anatomy_filename + + self.project_settings_path = project_settings_path + self.project_anatomy_path = project_anatomy_path + + def load_json_file(self, fpath): + # Load json data + try: + with open(fpath, "r") as opened_file: + return json.load(opened_file) + + except JSON_EXC: + self.log.warning( + "File has invalid json format \"{}\"".format(fpath), + exc_info=True + ) + return {} + + def path_to_project_settings(self, project_name): + if not project_name: + return self.project_settings_path + return os.path.join( + self.studio_overrides_dir, + project_name, + self.project_settings_filename + ) + + def path_to_project_anatomy(self, project_name): + if not project_name: + return self.project_anatomy_path + return os.path.join( + self.studio_overrides_dir, + project_name, + self.project_anatomy_filename + ) + + def save_studio_settings(self, data): + """Save studio overrides of system settings. + + Do not use to store whole system settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function + `studio_system_settings`. + + Args: + data(dict): Data of studio overrides with override metadata. + """ + dirpath = os.path.dirname(self.system_settings_path) + if not os.path.exists(dirpath): + os.makedirs(dirpath) + + self.log.debug( + "Saving studio overrides. Output path: {}".format( + self.system_settings_path + ) + ) + with open(self.system_settings_path, "w") as file_stream: + json.dump(data, file_stream, indent=4) + + def save_project_settings(self, project_name, overrides): + """Save studio overrides of project settings. + + Data are saved for specific project or as defaults for all projects. + + Do not use to store whole project settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function + `get_studio_project_settings_overrides` for global project settings + and `get_project_settings_overrides` for project specific settings. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + project_overrides_json_path = self.path_to_project_settings( + project_name + ) + dirpath = os.path.dirname(project_overrides_json_path) + if not os.path.exists(dirpath): + os.makedirs(dirpath) + + self.log.debug( + "Saving overrides of project \"{}\". Output path: {}".format( + project_name, project_overrides_json_path + ) + ) + with open(project_overrides_json_path, "w") as file_stream: + json.dump(overrides, file_stream, indent=4) + + def save_project_anatomy(self, project_name, anatomy_data): + """Save studio overrides of project anatomy data. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + project_anatomy_json_path = self.path_to_project_anatomy(project_name) + dirpath = os.path.dirname(project_anatomy_json_path) + if not os.path.exists(dirpath): + os.makedirs(dirpath) + + self.log.debug( + "Saving anatomy of project \"{}\". Output path: {}".format( + project_name, project_anatomy_json_path + ) + ) + with open(project_anatomy_json_path, "w") as file_stream: + json.dump(anatomy_data, file_stream, indent=4) + + def get_studio_system_settings_overrides(self): + """Studio overrides of system settings.""" + if os.path.exists(self.system_settings_path): + return self.load_json_file(self.system_settings_path) + return {} + + def get_studio_project_settings_overrides(self): + """Studio overrides of default project settings.""" + if os.path.exists(self.project_settings_path): + return self.load_json_file(self.project_settings_path) + return {} + + def get_studio_project_anatomy_overrides(self): + """Studio overrides of default project anatomy data.""" + if os.path.exists(self.project_anatomy_path): + return self.load_json_file(self.project_anatomy_path) + return {} + + def get_project_settings_overrides(self, project_name): + """Studio overrides of project settings for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ + path_to_json = self.path_to_project_settings(project_name) + if not os.path.exists(path_to_json): + return {} + return self.load_json_file(path_to_json) + + def get_project_anatomy_overrides(self, project_name): + """Studio overrides of project anatomy for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ + if not project_name: + return {} + + path_to_json = self.path_to_project_anatomy(project_name) + if not os.path.exists(path_to_json): + return {} + return self.load_json_file(path_to_json) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index 62febfc1d2..0852c92a24 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -15,6 +15,8 @@ from .constants import ( PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) +from .handlers import ( + SettingsFileHandler ) log = logging.getLogger(__name__) @@ -29,6 +31,9 @@ DEFAULTS_DIR = os.path.join(os.path.dirname(__file__), "defaults") # Variable where cache of default settings are stored _DEFAULT_SETTINGS = None +# Handler of studio overrides +SETTINGS_HANDLER = SettingsFileHandler() + class DuplicatedEnvGroups(Exception): def __init__(self, duplicated): @@ -220,150 +225,6 @@ def subkey_merge(_dict, value, keys): return _dict -def path_to_project_settings(project_name): - if not project_name: - return PROJECT_SETTINGS_PATH - return os.path.join( - STUDIO_OVERRIDES_PATH, - project_name, - PROJECT_SETTINGS_FILENAME - ) - - -def path_to_project_anatomy(project_name): - if not project_name: - return PROJECT_ANATOMY_PATH - return os.path.join( - STUDIO_OVERRIDES_PATH, - project_name, - PROJECT_ANATOMY_FILENAME - ) - - -def save_studio_settings(data): - """Save studio overrides of system settings. - - Do not use to store whole system settings data with defaults but only it's - overrides with metadata defining how overrides should be applied in load - function. For loading should be used function `studio_system_settings`. - - Args: - data(dict): Data of studio overrides with override metadata. - """ - dirpath = os.path.dirname(SYSTEM_SETTINGS_PATH) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving studio overrides. Output path: {}".format( - SYSTEM_SETTINGS_PATH - )) - with open(SYSTEM_SETTINGS_PATH, "w") as file_stream: - json.dump(data, file_stream, indent=4) - - -def save_project_settings(project_name, overrides): - """Save studio overrides of project settings. - - Data are saved for specific project or as defaults for all projects. - - Do not use to store whole project settings data with defaults but only it's - overrides with metadata defining how overrides should be applied in load - function. For loading should be used function - `get_studio_project_settings_overrides` for global project settings - and `get_project_settings_overrides` for project specific settings. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - project_overrides_json_path = path_to_project_settings(project_name) - dirpath = os.path.dirname(project_overrides_json_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving overrides of project \"{}\". Output path: {}".format( - project_name, project_overrides_json_path - )) - with open(project_overrides_json_path, "w") as file_stream: - json.dump(overrides, file_stream, indent=4) - - -def save_project_anatomy(project_name, anatomy_data): - """Save studio overrides of project anatomy data. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - project_anatomy_json_path = path_to_project_anatomy(project_name) - dirpath = os.path.dirname(project_anatomy_json_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - print("Saving anatomy of project \"{}\". Output path: {}".format( - project_name, project_anatomy_json_path - )) - with open(project_anatomy_json_path, "w") as file_stream: - json.dump(anatomy_data, file_stream, indent=4) - - -def get_studio_system_settings_overrides(): - """Studio overrides of system settings.""" - if os.path.exists(SYSTEM_SETTINGS_PATH): - return load_json_file(SYSTEM_SETTINGS_PATH) - return {} - - -def get_studio_project_settings_overrides(): - """Studio overrides of default project settings.""" - if os.path.exists(PROJECT_SETTINGS_PATH): - return load_json_file(PROJECT_SETTINGS_PATH) - return {} - - -def get_studio_project_anatomy_overrides(): - """Studio overrides of default project anatomy data.""" - if os.path.exists(PROJECT_ANATOMY_PATH): - return load_json_file(PROJECT_ANATOMY_PATH) - return {} - - -def get_project_settings_overrides(project_name): - """Studio overrides of project settings for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - - path_to_json = path_to_project_settings(project_name) - if not os.path.exists(path_to_json): - return {} - return load_json_file(path_to_json) - - -def get_project_anatomy_overrides(project_name): - """Studio overrides of project anatomy for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - if not project_name: - return {} - - path_to_json = path_to_project_anatomy(project_name) - if not os.path.exists(path_to_json): - return {} - return load_json_file(path_to_json) - - def merge_overrides(source_dict, override_dict): """Merge data from override_dict to source_dict.""" @@ -397,7 +258,7 @@ def apply_overrides(source_data, override_data): def get_system_settings(clear_metadata=True): """System settings with applied studio overrides.""" default_values = get_default_settings()[SYSTEM_SETTINGS_KEY] - studio_values = get_studio_system_settings_overrides() + studio_values = SETTINGS_HANDLER.get_studio_system_settings_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -407,7 +268,7 @@ def get_system_settings(clear_metadata=True): def get_default_project_settings(clear_metadata=True): """Project settings with applied studio's default project overrides.""" default_values = get_default_settings()[PROJECT_SETTINGS_KEY] - studio_values = get_studio_project_settings_overrides() + studio_values = SETTINGS_HANDLER.get_studio_project_settings_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -417,7 +278,7 @@ def get_default_project_settings(clear_metadata=True): def get_default_anatomy_settings(clear_metadata=True): """Project anatomy data with applied studio's default project overrides.""" default_values = get_default_settings()[PROJECT_ANATOMY_KEY] - studio_values = get_studio_project_anatomy_overrides() + studio_values = SETTINGS_HANDLER.get_studio_project_anatomy_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -433,7 +294,9 @@ def get_anatomy_settings(project_name, clear_metadata=True): ) studio_overrides = get_default_anatomy_settings(False) - project_overrides = get_project_anatomy_overrides(project_name) + project_overrides = SETTINGS_HANDLER.get_project_anatomy_overrides( + project_name + ) result = apply_overrides(studio_overrides, project_overrides) if clear_metadata: @@ -450,7 +313,9 @@ def get_project_settings(project_name, clear_metadata=True): ) studio_overrides = get_default_project_settings(False) - project_overrides = get_project_settings_overrides(project_name) + project_overrides = SETTINGS_HANDLER.get_project_settings_overrides( + project_name + ) result = apply_overrides(studio_overrides, project_overrides) if clear_metadata: diff --git a/pype/tools/settings/settings/widgets/base.py b/pype/tools/settings/settings/widgets/base.py index ddd814e38e..7c09abad73 100644 --- a/pype/tools/settings/settings/widgets/base.py +++ b/pype/tools/settings/settings/widgets/base.py @@ -9,21 +9,11 @@ from pype.settings.constants import ( ) from pype.settings.lib import ( DEFAULTS_DIR, + SETTINGS_HANDLER, reset_default_settings, get_default_settings, - get_studio_system_settings_overrides, - get_studio_project_settings_overrides, - get_studio_project_anatomy_overrides, - - get_project_settings_overrides, - get_project_anatomy_overrides, - - save_studio_settings, - save_project_settings, - save_project_anatomy, - apply_overrides, find_environments, DuplicatedEnvGroups @@ -370,7 +360,7 @@ class SystemWidget(SettingsCategoryWidget): if not self.duplicated_env_group_validation(overrides=values): return - save_studio_settings(values) + SETTINGS_HANDLER.save_studio_settings(values) def update_values(self): default_values = lib.convert_data_to_gui_data({ @@ -382,8 +372,11 @@ class SystemWidget(SettingsCategoryWidget): if self._hide_studio_overrides: system_values = lib.NOT_SET else: + studio_system_overrides = ( + SETTINGS_HANDLER.get_studio_system_settings_overrides() + ) system_values = lib.convert_overrides_to_gui_data( - {self.main_schema_key: get_studio_system_settings_overrides()} + {self.main_schema_key: studio_system_overrides} ) for input_field in self.input_fields: @@ -547,8 +540,12 @@ class ProjectWidget(SettingsCategoryWidget): _project_anatomy = lib.NOT_SET self.is_overidable = False else: - _project_overrides = get_project_settings_overrides(project_name) - _project_anatomy = get_project_anatomy_overrides(project_name) + _project_overrides = ( + SETTINGS_HANDLER.get_project_settings_overrides(project_name) + ) + _project_anatomy = ( + SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) + ) self.is_overidable = True overrides = {self.main_schema_key: { @@ -582,11 +579,15 @@ class ProjectWidget(SettingsCategoryWidget): # Saving overrides data project_overrides_data = output_data.get(PROJECT_SETTINGS_KEY, {}) - save_project_settings(self.project_name, project_overrides_data) + SETTINGS_HANDLER.save_project_settings( + self.project_name, project_overrides_data + ) # Saving anatomy data project_anatomy_data = output_data.get(PROJECT_ANATOMY_KEY, {}) - save_project_anatomy(self.project_name, project_anatomy_data) + SETTINGS_HANDLER.save_project_anatomy( + self.project_name, project_anatomy_data + ) def update_values(self): if self.project_name is not None: @@ -602,14 +603,16 @@ class ProjectWidget(SettingsCategoryWidget): if self._hide_studio_overrides: studio_values = lib.NOT_SET else: + project_settings_value = ( + SETTINGS_HANDLER.get_studio_project_settings_overrides() + ) + project_anatomy_value = ( + SETTINGS_HANDLER.get_studio_project_anatomy_overrides() + ) studio_values = lib.convert_overrides_to_gui_data({ self.main_schema_key: { - PROJECT_SETTINGS_KEY: ( - get_studio_project_settings_overrides() - ), - PROJECT_ANATOMY_KEY: ( - get_studio_project_anatomy_overrides() - ) + PROJECT_SETTINGS_KEY: project_settings_value, + PROJECT_ANATOMY_KEY: project_anatomy_value } }) From 50434ecb6022bdbf55ba36f7db0bb6aa8bfde2b0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:08:04 +0100 Subject: [PATCH 08/37] use absolute path to defaults --- pype/settings/lib.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index 0852c92a24..e9f1a15feb 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -26,7 +26,10 @@ JSON_EXC = getattr(json.decoder, "JSONDecodeError", ValueError) # Path to default settings -DEFAULTS_DIR = os.path.join(os.path.dirname(__file__), "defaults") +DEFAULTS_DIR = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "defaults" +) # Variable where cache of default settings are stored _DEFAULT_SETTINGS = None From 19b2c77621e2a8cfb91ab5322e24d0ee12486e2a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:23:00 +0100 Subject: [PATCH 09/37] implemented naive singleton for mongo connection for pype's purposes --- pype/lib/__init__.py | 3 +- pype/lib/mongo.py | 86 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/pype/lib/__init__.py b/pype/lib/__init__.py index 02b5178311..e856956822 100644 --- a/pype/lib/__init__.py +++ b/pype/lib/__init__.py @@ -7,7 +7,8 @@ from .log import PypeLogger, timeit from .mongo import ( decompose_url, compose_url, - get_default_components + get_default_components, + PypeMongoConnection ) from .anatomy import Anatomy diff --git a/pype/lib/mongo.py b/pype/lib/mongo.py index f950572c6e..f82c8b5e23 100644 --- a/pype/lib/mongo.py +++ b/pype/lib/mongo.py @@ -1,9 +1,13 @@ import os +import sys +import time +import logging +import pymongo -try: - from urllib.parse import urlparse, parse_qs -except ImportError: +if sys.version_info[0] == 2: from urlparse import urlparse, parse_qs +else: + from urllib.parse import urlparse, parse_qs class MongoEnvNotSet(Exception): @@ -79,3 +83,79 @@ def get_default_components(): "URL for Mongo logging connection is not set." ) return decompose_url(mongo_url) + + +def extract_port_from_url(url): + parsed_url = urlparse(url) + if parsed_url.scheme is None: + _url = "mongodb://{}".format(url) + parsed_url = urlparse(_url) + return parsed_url.port + + +class PypeMongoConnection: + """Singleton MongoDB connection. + + Keeps MongoDB connections by url. + """ + mongo_clients = {} + log = logging.getLogger("PypeMongoConnection") + + @classmethod + def get_mongo_client(cls, mongo_url=None): + if mongo_url is None: + mongo_url = os.environ["PYPE_MONGO"] + + connection = cls.mongo_clients.get(mongo_url) + if connection: + # Naive validation of existing connection + try: + connection.server_info() + except Exception: + connection = None + + if not connection: + cls.log.debug("Creating mongo connection to {}".format(mongo_url)) + connection = cls.create_connection(mongo_url) + cls.mongo_clients[mongo_url] = connection + + return connection + + @classmethod + def create_connection(cls, mongo_url, timeout=None): + if timeout is None: + timeout = int(os.environ.get("AVALON_TIMEOUT") or 1000) + + kwargs = { + "host": mongo_url, + "serverSelectionTimeoutMS": timeout + } + + port = extract_port_from_url(mongo_url) + if port is not None: + kwargs["port"] = int(port) + + mongo_client = pymongo.MongoClient(**kwargs) + + for _retry in range(3): + try: + t1 = time.time() + mongo_client.server_info() + + except Exception: + cls.log.warning("Retrying...") + time.sleep(1) + timeout *= 1.5 + + else: + break + + else: + raise IOError(( + "ERROR: Couldn't connect to {} in less than {:.3f}ms" + ).format(mongo_url, timeout)) + + cls.log.info("Connected to {}, delay {:.3f}s".format( + mongo_url, time.time() - t1 + )) + return mongo_client From b6120e3a23e8d8eb9e9dde55d065ddf872711986 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:33:17 +0100 Subject: [PATCH 10/37] prepared structure of MongoSettingsHandler --- pype/settings/handlers.py | 80 +++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 8 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index c1829273b1..300d4492eb 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -5,15 +5,7 @@ from abc import ABCMeta, abstractmethod import six import pype from .constants import ( - M_OVERRIDEN_KEY, - M_ENVIRONMENT_KEY, - M_DYNAMIC_KEY_LABEL, - M_POP_KEY, - - METADATA_KEYS, - SYSTEM_SETTINGS_KEY, - ENVIRONMENTS_KEY, PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) @@ -295,3 +287,75 @@ class SettingsFileHandler(SettingsHandler): if not os.path.exists(path_to_json): return {} return self.load_json_file(path_to_json) + + +class MongoSettingsHandler(SettingsHandler): + def __init__(self): + pass + + @classmethod + def save_studio_settings(self, data): + """Save studio overrides of system settings. + + Do not use to store whole system settings data with defaults but only it's + overrides with metadata defining how overrides should be applied in load + function. For loading should be used function `studio_system_settings`. + + Args: + data(dict): Data of studio overrides with override metadata. + """ + + def save_project_settings(self, project_name, overrides): + """Save studio overrides of project settings. + + Data are saved for specific project or as defaults for all projects. + + Do not use to store whole project settings data with defaults but only it's + overrides with metadata defining how overrides should be applied in load + function. For loading should be used function + `get_studio_project_settings_overrides` for global project settings + and `get_project_settings_overrides` for project specific settings. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + + def save_project_anatomy(self, project_name, anatomy_data): + """Save studio overrides of project anatomy data. + + Args: + project_name(str, null): Project name for which overrides are + or None for global settings. + data(dict): Data of project overrides with override metadata. + """ + + def get_studio_system_settings_overrides(self): + """Studio overrides of system settings.""" + + def get_studio_project_settings_overrides(self): + """Studio overrides of default project settings.""" + + def get_studio_project_anatomy_overrides(self): + """Studio overrides of default project anatomy data.""" + + def get_project_settings_overrides(self, project_name): + """Studio overrides of project settings for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ + + def get_project_anatomy_overrides(self, project_name): + """Studio overrides of project anatomy for specific project. + + Args: + project_name(str): Name of project for which data should be loaded. + + Returns: + dict: Only overrides for entered project, may be empty dictionary. + """ \ No newline at end of file From 9299eb55e968d8a735af500240df83fc3c34b07c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 16:34:31 +0100 Subject: [PATCH 11/37] removed ENVIRONEMNTS_KEY as not used --- pype/settings/constants.py | 2 -- pype/settings/lib.py | 2 -- 2 files changed, 4 deletions(-) diff --git a/pype/settings/constants.py b/pype/settings/constants.py index 4a9f0e2287..d21817fb8e 100644 --- a/pype/settings/constants.py +++ b/pype/settings/constants.py @@ -16,7 +16,6 @@ METADATA_KEYS = ( # File where studio's system overrides are stored SYSTEM_SETTINGS_KEY = "system_settings" -ENVIRONMENTS_KEY = "environments" PROJECT_SETTINGS_KEY = "project_settings" PROJECT_ANATOMY_KEY = "project_anatomy" @@ -30,7 +29,6 @@ __all__ = ( "METADATA_KEYS", "SYSTEM_SETTINGS_KEY", - "ENVIRONMENTS_KEY", "PROJECT_SETTINGS_KEY", "PROJECT_ANATOMY_KEY" ) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index e9f1a15feb..009d855e02 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -5,13 +5,11 @@ import copy from .constants import ( M_OVERRIDEN_KEY, M_ENVIRONMENT_KEY, - M_DYNAMIC_KEY_LABEL, M_POP_KEY, METADATA_KEYS, SYSTEM_SETTINGS_KEY, - ENVIRONMENTS_KEY, PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) From 1a89b125bec4564b29b37a3eb52786476368bb34 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 17:27:46 +0100 Subject: [PATCH 12/37] filled basic implementation of mongo settings handler --- pype/settings/handlers.py | 93 +++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 8 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index 300d4492eb..cc6e7f9d10 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -290,29 +290,60 @@ class SettingsFileHandler(SettingsHandler): class MongoSettingsHandler(SettingsHandler): + """Settings handler that use mongo for storing and loading of settings.""" + system_settings_key = "system_settings" + project_anatomy_key = "project_anatomy" + project_settings_key = "project_settings" + def __init__(self): - pass + # Get mongo connection + from pype.lib import PypeMongoConnection + settings_collection = PypeMongoConnection.get_mongo_client() + + # TODO prepare version of pype + # - pype version should define how are settings saved and loaded + + # TODO modify to not use hardcoded keys + database_name = "pype" + collection_name = "settings" + + self.settings_collection = settings_collection + + self.database_name = database_name + self.collection_name = collection_name + + self.collection = settings_collection[database_name][collection_name] @classmethod def save_studio_settings(self, data): """Save studio overrides of system settings. - Do not use to store whole system settings data with defaults but only it's - overrides with metadata defining how overrides should be applied in load - function. For loading should be used function `studio_system_settings`. + Do not use to store whole system settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function + `studio_system_settings`. Args: data(dict): Data of studio overrides with override metadata. """ + self.collection.replace_one( + { + "type": self.system_settings_key + }, + { + "type": self.system_settings_key, + "value": data + } + ) def save_project_settings(self, project_name, overrides): """Save studio overrides of project settings. Data are saved for specific project or as defaults for all projects. - Do not use to store whole project settings data with defaults but only it's - overrides with metadata defining how overrides should be applied in load - function. For loading should be used function + Do not use to store whole project settings data with defaults but only + it's overrides with metadata defining how overrides should be applied + in load function. For loading should be used function `get_studio_project_settings_overrides` for global project settings and `get_project_settings_overrides` for project specific settings. @@ -322,6 +353,18 @@ class MongoSettingsHandler(SettingsHandler): data(dict): Data of project overrides with override metadata. """ + self.collection.replace_one( + { + "type": self.project_settings_key, + "project_name": project_name + }, + { + "type": self.project_settings_key, + "project_name": project_name, + "value": overrides + } + ) + def save_project_anatomy(self, project_name, anatomy_data): """Save studio overrides of project anatomy data. @@ -330,15 +373,37 @@ class MongoSettingsHandler(SettingsHandler): or None for global settings. data(dict): Data of project overrides with override metadata. """ + self.collection.replace_one( + { + "type": self.project_anatomy_key, + "project_name": project_name + }, + { + "type": self.project_anatomy_key, + "project_name": project_name, + "value": anatomy_data + } + ) def get_studio_system_settings_overrides(self): """Studio overrides of system settings.""" + return self.collection.find_one({ + "type": self.system_settings_key + }) or {} def get_studio_project_settings_overrides(self): """Studio overrides of default project settings.""" + return self.collection.find_one({ + "type": self.project_settings_key, + "project_name": None + }) or {} def get_studio_project_anatomy_overrides(self): """Studio overrides of default project anatomy data.""" + return self.collection.find_one({ + "type": self.project_anatomy_key, + "project_name": None + }) or {} def get_project_settings_overrides(self, project_name): """Studio overrides of project settings for specific project. @@ -349,6 +414,12 @@ class MongoSettingsHandler(SettingsHandler): Returns: dict: Only overrides for entered project, may be empty dictionary. """ + if not project_name: + return {} + return self.collection.find_one({ + "type": self.project_settings_key, + "project_name": project_name + }) or {} def get_project_anatomy_overrides(self, project_name): """Studio overrides of project anatomy for specific project. @@ -358,4 +429,10 @@ class MongoSettingsHandler(SettingsHandler): Returns: dict: Only overrides for entered project, may be empty dictionary. - """ \ No newline at end of file + """ + if not project_name: + return {} + return self.collection.find_one({ + "type": self.project_anatomy_key, + "project_name": project_name + }) or {} From c6fbd4797945d0458673484b9ad20007790138f6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 17:28:32 +0100 Subject: [PATCH 13/37] moved back settings lib functions and _SETTINGS_HANDLER is set with wrapper --- pype/settings/lib.py | 71 ++++++++++++++++++-- pype/tools/settings/settings/widgets/base.py | 50 +++++++------- pype/tools/settings/settings/widgets/lib.py | 2 +- 3 files changed, 89 insertions(+), 34 deletions(-) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index 009d855e02..d1d050cdaf 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -1,5 +1,6 @@ import os import json +import functools import logging import copy from .constants import ( @@ -14,7 +15,8 @@ from .constants import ( PROJECT_ANATOMY_KEY ) from .handlers import ( - SettingsFileHandler + SettingsFileHandler, + MongoSettingsHandler ) log = logging.getLogger(__name__) @@ -33,7 +35,62 @@ DEFAULTS_DIR = os.path.join( _DEFAULT_SETTINGS = None # Handler of studio overrides -SETTINGS_HANDLER = SettingsFileHandler() +_SETTINGS_HANDLER = None + + +def require_handler(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + global _SETTINGS_HANDLER + if _SETTINGS_HANDLER is None: + _SETTINGS_HANDLER = create_settings_handler() + return func(*args, **kwargs) + return wrapper + + +def create_settings_handler(): + # This may be logic which handler is used (in future) + return MongoSettingsHandler() + + +@require_handler +def save_studio_settings(data): + _SETTINGS_HANDLER.save_studio_settings(data) + + +@require_handler +def save_project_settings(project_name, overrides): + _SETTINGS_HANDLER.save_project_settings(project_name, overrides) + + +@require_handler +def save_project_anatomy(project_name, anatomy_data): + _SETTINGS_HANDLER.save_project_anatomy(project_name, anatomy_data) + + +@require_handler +def get_studio_system_settings_overrides(): + _SETTINGS_HANDLER.get_studio_system_settings_overrides() + + +@require_handler +def get_studio_project_settings_overrides(): + _SETTINGS_HANDLER.get_studio_project_settings_overrides() + + +@require_handler +def get_studio_project_anatomy_overrides(): + _SETTINGS_HANDLER.get_studio_project_anatomy_overrides() + + +@require_handler +def get_project_settings_overrides(project_name): + _SETTINGS_HANDLER.get_project_settings_overrides(project_name) + + +@require_handler +def get_project_anatomy_overrides(project_name): + _SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) class DuplicatedEnvGroups(Exception): @@ -259,7 +316,7 @@ def apply_overrides(source_data, override_data): def get_system_settings(clear_metadata=True): """System settings with applied studio overrides.""" default_values = get_default_settings()[SYSTEM_SETTINGS_KEY] - studio_values = SETTINGS_HANDLER.get_studio_system_settings_overrides() + studio_values = get_studio_system_settings_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -269,7 +326,7 @@ def get_system_settings(clear_metadata=True): def get_default_project_settings(clear_metadata=True): """Project settings with applied studio's default project overrides.""" default_values = get_default_settings()[PROJECT_SETTINGS_KEY] - studio_values = SETTINGS_HANDLER.get_studio_project_settings_overrides() + studio_values = get_studio_project_settings_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -279,7 +336,7 @@ def get_default_project_settings(clear_metadata=True): def get_default_anatomy_settings(clear_metadata=True): """Project anatomy data with applied studio's default project overrides.""" default_values = get_default_settings()[PROJECT_ANATOMY_KEY] - studio_values = SETTINGS_HANDLER.get_studio_project_anatomy_overrides() + studio_values = get_studio_project_anatomy_overrides() result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) @@ -295,7 +352,7 @@ def get_anatomy_settings(project_name, clear_metadata=True): ) studio_overrides = get_default_anatomy_settings(False) - project_overrides = SETTINGS_HANDLER.get_project_anatomy_overrides( + project_overrides = get_project_anatomy_overrides( project_name ) @@ -314,7 +371,7 @@ def get_project_settings(project_name, clear_metadata=True): ) studio_overrides = get_default_project_settings(False) - project_overrides = SETTINGS_HANDLER.get_project_settings_overrides( + project_overrides = get_project_settings_overrides( project_name ) diff --git a/pype/tools/settings/settings/widgets/base.py b/pype/tools/settings/settings/widgets/base.py index 7c09abad73..8e16c3614c 100644 --- a/pype/tools/settings/settings/widgets/base.py +++ b/pype/tools/settings/settings/widgets/base.py @@ -7,13 +7,24 @@ from pype.settings.constants import ( PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) + from pype.settings.lib import ( DEFAULTS_DIR, - SETTINGS_HANDLER, reset_default_settings, get_default_settings, + get_studio_system_settings_overrides, + get_studio_project_settings_overrides, + get_studio_project_anatomy_overrides, + + get_project_settings_overrides, + get_project_anatomy_overrides, + + save_studio_settings, + save_project_settings, + save_project_anatomy, + apply_overrides, find_environments, DuplicatedEnvGroups @@ -360,7 +371,7 @@ class SystemWidget(SettingsCategoryWidget): if not self.duplicated_env_group_validation(overrides=values): return - SETTINGS_HANDLER.save_studio_settings(values) + save_studio_settings(values) def update_values(self): default_values = lib.convert_data_to_gui_data({ @@ -372,11 +383,8 @@ class SystemWidget(SettingsCategoryWidget): if self._hide_studio_overrides: system_values = lib.NOT_SET else: - studio_system_overrides = ( - SETTINGS_HANDLER.get_studio_system_settings_overrides() - ) system_values = lib.convert_overrides_to_gui_data( - {self.main_schema_key: studio_system_overrides} + {self.main_schema_key: get_studio_system_settings_overrides()} ) for input_field in self.input_fields: @@ -540,12 +548,8 @@ class ProjectWidget(SettingsCategoryWidget): _project_anatomy = lib.NOT_SET self.is_overidable = False else: - _project_overrides = ( - SETTINGS_HANDLER.get_project_settings_overrides(project_name) - ) - _project_anatomy = ( - SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) - ) + _project_overrides = get_project_settings_overrides(project_name) + _project_anatomy = get_project_anatomy_overrides(project_name) self.is_overidable = True overrides = {self.main_schema_key: { @@ -579,15 +583,11 @@ class ProjectWidget(SettingsCategoryWidget): # Saving overrides data project_overrides_data = output_data.get(PROJECT_SETTINGS_KEY, {}) - SETTINGS_HANDLER.save_project_settings( - self.project_name, project_overrides_data - ) + save_project_settings(self.project_name, project_overrides_data) # Saving anatomy data project_anatomy_data = output_data.get(PROJECT_ANATOMY_KEY, {}) - SETTINGS_HANDLER.save_project_anatomy( - self.project_name, project_anatomy_data - ) + save_project_anatomy(self.project_name, project_anatomy_data) def update_values(self): if self.project_name is not None: @@ -603,16 +603,14 @@ class ProjectWidget(SettingsCategoryWidget): if self._hide_studio_overrides: studio_values = lib.NOT_SET else: - project_settings_value = ( - SETTINGS_HANDLER.get_studio_project_settings_overrides() - ) - project_anatomy_value = ( - SETTINGS_HANDLER.get_studio_project_anatomy_overrides() - ) studio_values = lib.convert_overrides_to_gui_data({ self.main_schema_key: { - PROJECT_SETTINGS_KEY: project_settings_value, - PROJECT_ANATOMY_KEY: project_anatomy_value + PROJECT_SETTINGS_KEY: ( + get_studio_project_settings_overrides() + ), + PROJECT_ANATOMY_KEY: ( + get_studio_project_anatomy_overrides() + ) } }) diff --git a/pype/tools/settings/settings/widgets/lib.py b/pype/tools/settings/settings/widgets/lib.py index 9a6331009b..9c56f51726 100644 --- a/pype/tools/settings/settings/widgets/lib.py +++ b/pype/tools/settings/settings/widgets/lib.py @@ -2,7 +2,7 @@ import os import re import json import copy -from pype.settings.lib import ( +from pype.settings.constants import ( M_OVERRIDEN_KEY, M_ENVIRONMENT_KEY, M_DYNAMIC_KEY_LABEL From 2816f50473cd0afcf70ab0e19a6a4afd6a388945 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 11 Dec 2020 17:34:38 +0100 Subject: [PATCH 14/37] few minor fixes --- pype/settings/handlers.py | 1 - pype/settings/lib.py | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index cc6e7f9d10..d43ab8b30d 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -314,7 +314,6 @@ class MongoSettingsHandler(SettingsHandler): self.collection = settings_collection[database_name][collection_name] - @classmethod def save_studio_settings(self, data): """Save studio overrides of system settings. diff --git a/pype/settings/lib.py b/pype/settings/lib.py index d1d050cdaf..9aa4a6a85d 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -55,42 +55,42 @@ def create_settings_handler(): @require_handler def save_studio_settings(data): - _SETTINGS_HANDLER.save_studio_settings(data) + return _SETTINGS_HANDLER.save_studio_settings(data) @require_handler def save_project_settings(project_name, overrides): - _SETTINGS_HANDLER.save_project_settings(project_name, overrides) + return _SETTINGS_HANDLER.save_project_settings(project_name, overrides) @require_handler def save_project_anatomy(project_name, anatomy_data): - _SETTINGS_HANDLER.save_project_anatomy(project_name, anatomy_data) + return _SETTINGS_HANDLER.save_project_anatomy(project_name, anatomy_data) @require_handler def get_studio_system_settings_overrides(): - _SETTINGS_HANDLER.get_studio_system_settings_overrides() + return _SETTINGS_HANDLER.get_studio_system_settings_overrides() @require_handler def get_studio_project_settings_overrides(): - _SETTINGS_HANDLER.get_studio_project_settings_overrides() + return _SETTINGS_HANDLER.get_studio_project_settings_overrides() @require_handler def get_studio_project_anatomy_overrides(): - _SETTINGS_HANDLER.get_studio_project_anatomy_overrides() + return _SETTINGS_HANDLER.get_studio_project_anatomy_overrides() @require_handler def get_project_settings_overrides(project_name): - _SETTINGS_HANDLER.get_project_settings_overrides(project_name) + return _SETTINGS_HANDLER.get_project_settings_overrides(project_name) @require_handler def get_project_anatomy_overrides(project_name): - _SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) + return _SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) class DuplicatedEnvGroups(Exception): From 87e463ab6c42e814c67b6d4f954a32d4e0249ac2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 09:54:29 +0100 Subject: [PATCH 15/37] move setting environments after PYPE_MONGO is set --- pype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pype.py b/pype.py index 2580bafb55..e90c257595 100644 --- a/pype.py +++ b/pype.py @@ -113,7 +113,7 @@ def boot(): """ print(art) - set_environments() + # find pype versions bootstrap = BootstrapRepos() pype_versions = bootstrap.find_pype() @@ -139,6 +139,7 @@ def boot(): else: os.environ["PYPE_MONGO"] = pype_mongo + set_environments() if getattr(sys, 'frozen', False): if not pype_versions: import igniter From 638d9c2843518031d6b8530d2ce05924b975a317 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 10:08:57 +0100 Subject: [PATCH 16/37] implemented class for caches --- pype/settings/handlers.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index d43ab8b30d..798739e4d0 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -1,6 +1,7 @@ import os import json import logging +import datetime from abc import ABCMeta, abstractmethod import six import pype @@ -289,6 +290,34 @@ class SettingsFileHandler(SettingsHandler): return self.load_json_file(path_to_json) +class CacheValues: + cache_lifetime = 10 + + def __init__(self): + self.data = None + self.creation_time = None + + def update_data(self, data): + self.data = data + self.creation_time = datetime.datetime.now() + + def update_from_document(self, document): + value = "{}" + if document: + value = document.get("value") or value + self.data = json.loads(value) + + def to_json_string(self): + return json.dumps(self.data or {}) + + @property + def is_outdated(self): + if self.creation_time is None: + return True + delta = (datetime.datetime.now() - self.creation_time).seconds + return delta > self.cache_lifetime + + class MongoSettingsHandler(SettingsHandler): """Settings handler that use mongo for storing and loading of settings.""" system_settings_key = "system_settings" From 2bad8adc9fd157fa67cd523515d7b11a51fe1e26 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 10:09:11 +0100 Subject: [PATCH 17/37] mongo handler is using caches --- pype/settings/handlers.py | 133 ++++++++++++++++++++++++-------------- 1 file changed, 85 insertions(+), 48 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index 798739e4d0..724548fd12 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -1,6 +1,7 @@ import os import json import logging +import collections import datetime from abc import ABCMeta, abstractmethod import six @@ -320,9 +321,6 @@ class CacheValues: class MongoSettingsHandler(SettingsHandler): """Settings handler that use mongo for storing and loading of settings.""" - system_settings_key = "system_settings" - project_anatomy_key = "project_anatomy" - project_settings_key = "project_settings" def __init__(self): # Get mongo connection @@ -343,6 +341,10 @@ class MongoSettingsHandler(SettingsHandler): self.collection = settings_collection[database_name][collection_name] + self.system_settings_cache = CacheValues() + self.project_settings_cache = collections.defaultdict(CacheValues) + self.project_anatomy_cache = collections.defaultdict(CacheValues) + def save_studio_settings(self, data): """Save studio overrides of system settings. @@ -354,14 +356,17 @@ class MongoSettingsHandler(SettingsHandler): Args: data(dict): Data of studio overrides with override metadata. """ + self.system_settings_cache.update_data(data) + self.collection.replace_one( { - "type": self.system_settings_key + "type": SYSTEM_SETTINGS_KEY }, { - "type": self.system_settings_key, - "value": data - } + "type": SYSTEM_SETTINGS_KEY, + "value": self.system_settings_cache.to_json_string() + }, + upsert=True ) def save_project_settings(self, project_name, overrides): @@ -380,17 +385,11 @@ class MongoSettingsHandler(SettingsHandler): or None for global settings. data(dict): Data of project overrides with override metadata. """ + data_cache = self.project_settings_cache[project_name] + data_cache.update_data(overrides) - self.collection.replace_one( - { - "type": self.project_settings_key, - "project_name": project_name - }, - { - "type": self.project_settings_key, - "project_name": project_name, - "value": overrides - } + self._save_project_data( + project_name, PROJECT_SETTINGS_KEY, data_cache ) def save_project_anatomy(self, project_name, anatomy_data): @@ -401,37 +400,62 @@ class MongoSettingsHandler(SettingsHandler): or None for global settings. data(dict): Data of project overrides with override metadata. """ + data_cache = self.project_anatomy_cache[project_name] + data_cache.update_data(anatomy_data) + + self._save_project_data( + project_name, PROJECT_ANATOMY_KEY, data_cache + ) + + def _save_project_data(self, project_name, doc_type, data_cache): + is_default = bool(project_name is None) + replace_filter = { + "type": doc_type, + "is_default": is_default + } + replace_data = { + "type": doc_type, + "value": data_cache.to_json_string(), + "is_default": is_default + } + if not is_default: + replace_filter["project_name"] = project_name + replace_data["project_name"] = project_name + self.collection.replace_one( - { - "type": self.project_anatomy_key, - "project_name": project_name - }, - { - "type": self.project_anatomy_key, - "project_name": project_name, - "value": anatomy_data - } + replace_filter, + replace_data, + upsert=True ) def get_studio_system_settings_overrides(self): """Studio overrides of system settings.""" - return self.collection.find_one({ - "type": self.system_settings_key - }) or {} + if self.system_settings_cache.is_outdated: + document = self.collection.find_one({ + "type": SYSTEM_SETTINGS_KEY + }) + + self.system_settings_cache.update_from_document(document) + return self.system_settings_cache.data + + def _get_project_settings_overrides(self, project_name): + if self.project_settings_cache[project_name].is_outdated: + document_filter = { + "type": PROJECT_SETTINGS_KEY, + } + if project_name is None: + document_filter["is_default"] = True + else: + document_filter["project_name"] = project_name + document = self.collection.find_one(document_filter) + self.project_settings_cache[project_name].update_from_document( + document + ) + return self.project_settings_cache[project_name].data def get_studio_project_settings_overrides(self): """Studio overrides of default project settings.""" - return self.collection.find_one({ - "type": self.project_settings_key, - "project_name": None - }) or {} - - def get_studio_project_anatomy_overrides(self): - """Studio overrides of default project anatomy data.""" - return self.collection.find_one({ - "type": self.project_anatomy_key, - "project_name": None - }) or {} + return self._get_project_settings_overrides(None) def get_project_settings_overrides(self, project_name): """Studio overrides of project settings for specific project. @@ -444,10 +468,26 @@ class MongoSettingsHandler(SettingsHandler): """ if not project_name: return {} - return self.collection.find_one({ - "type": self.project_settings_key, - "project_name": project_name - }) or {} + return self._get_project_settings_overrides(project_name) + + def _get_project_anatomy_overrides(self, project_name): + if self.project_anatomy_cache[project_name].is_outdated: + document_filter = { + "type": PROJECT_ANATOMY_KEY, + } + if project_name is None: + document_filter["is_default"] = True + else: + document_filter["project_name"] = project_name + document = self.collection.find_one(document_filter) + self.project_anatomy_cache[project_name].update_from_document( + document + ) + return self.project_anatomy_cache[project_name].data + + def get_studio_project_anatomy_overrides(self): + """Studio overrides of default project anatomy data.""" + return self._get_project_anatomy_overrides(None) def get_project_anatomy_overrides(self, project_name): """Studio overrides of project anatomy for specific project. @@ -460,7 +500,4 @@ class MongoSettingsHandler(SettingsHandler): """ if not project_name: return {} - return self.collection.find_one({ - "type": self.project_anatomy_key, - "project_name": project_name - }) or {} + return self._get_project_anatomy_overrides(project_name) From 51ad0b5b9678f3a39403680c4def943719634128 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 10:14:34 +0100 Subject: [PATCH 18/37] hanler is imported in `create_settings_handler` --- pype/settings/lib.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pype/settings/lib.py b/pype/settings/lib.py index 9aa4a6a85d..0b9c5813be 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -14,10 +14,6 @@ from .constants import ( PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) -from .handlers import ( - SettingsFileHandler, - MongoSettingsHandler -) log = logging.getLogger(__name__) @@ -49,7 +45,9 @@ def require_handler(func): def create_settings_handler(): - # This may be logic which handler is used (in future) + from .handlers import MongoSettingsHandler + # Handler can't be created in global space on initialization but only when + # needed. Plus here may be logic: Which handler is used (in future). return MongoSettingsHandler() From 4d3e74e039a37726d40eb32be25ef8bc9bbc13a2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 10:14:57 +0100 Subject: [PATCH 19/37] load_json_file is used from lib --- pype/settings/handlers.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index 724548fd12..332392cf42 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -11,6 +11,7 @@ from .constants import ( PROJECT_SETTINGS_KEY, PROJECT_ANATOMY_KEY ) +from .lib import load_json_file JSON_EXC = getattr(json.decoder, "JSONDecodeError", ValueError) @@ -135,19 +136,6 @@ class SettingsFileHandler(SettingsHandler): self.project_settings_path = project_settings_path self.project_anatomy_path = project_anatomy_path - def load_json_file(self, fpath): - # Load json data - try: - with open(fpath, "r") as opened_file: - return json.load(opened_file) - - except JSON_EXC: - self.log.warning( - "File has invalid json format \"{}\"".format(fpath), - exc_info=True - ) - return {} - def path_to_project_settings(self, project_name): if not project_name: return self.project_settings_path @@ -244,19 +232,19 @@ class SettingsFileHandler(SettingsHandler): def get_studio_system_settings_overrides(self): """Studio overrides of system settings.""" if os.path.exists(self.system_settings_path): - return self.load_json_file(self.system_settings_path) + return load_json_file(self.system_settings_path) return {} def get_studio_project_settings_overrides(self): """Studio overrides of default project settings.""" if os.path.exists(self.project_settings_path): - return self.load_json_file(self.project_settings_path) + return load_json_file(self.project_settings_path) return {} def get_studio_project_anatomy_overrides(self): """Studio overrides of default project anatomy data.""" if os.path.exists(self.project_anatomy_path): - return self.load_json_file(self.project_anatomy_path) + return load_json_file(self.project_anatomy_path) return {} def get_project_settings_overrides(self, project_name): @@ -271,7 +259,7 @@ class SettingsFileHandler(SettingsHandler): path_to_json = self.path_to_project_settings(project_name) if not os.path.exists(path_to_json): return {} - return self.load_json_file(path_to_json) + return load_json_file(path_to_json) def get_project_anatomy_overrides(self, project_name): """Studio overrides of project anatomy for specific project. @@ -288,7 +276,7 @@ class SettingsFileHandler(SettingsHandler): path_to_json = self.path_to_project_anatomy(project_name) if not os.path.exists(path_to_json): return {} - return self.load_json_file(path_to_json) + return load_json_file(path_to_json) class CacheValues: From 0b8811c3211cbcb1ef1c5e1daf49790c9ed1a8e0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 10:20:13 +0100 Subject: [PATCH 20/37] added PypeMongoConnection to `__all__` --- pype/lib/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pype/lib/__init__.py b/pype/lib/__init__.py index e856956822..9444ef5195 100644 --- a/pype/lib/__init__.py +++ b/pype/lib/__init__.py @@ -131,6 +131,8 @@ __all__ = [ "decompose_url", "compose_url", "get_default_components", + "PypeMongoConnection", + "IniSettingRegistry", "JSONSettingRegistry", "PypeSettingsRegistry", From 2a6541eb9038af93160c9c78c8e4efbd00fd74bf Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 11:23:16 +0100 Subject: [PATCH 21/37] return copy of data ot pure data --- pype/settings/handlers.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/pype/settings/handlers.py b/pype/settings/handlers.py index 332392cf42..0df4c98820 100644 --- a/pype/settings/handlers.py +++ b/pype/settings/handlers.py @@ -1,5 +1,6 @@ import os import json +import copy import logging import collections import datetime @@ -286,6 +287,11 @@ class CacheValues: self.data = None self.creation_time = None + def data_copy(self): + if not self.data: + return {} + return copy.deepcopy(self.data) + def update_data(self, data): self.data = data self.creation_time = datetime.datetime.now() @@ -424,7 +430,7 @@ class MongoSettingsHandler(SettingsHandler): }) self.system_settings_cache.update_from_document(document) - return self.system_settings_cache.data + return self.system_settings_cache.data_copy() def _get_project_settings_overrides(self, project_name): if self.project_settings_cache[project_name].is_outdated: @@ -439,7 +445,7 @@ class MongoSettingsHandler(SettingsHandler): self.project_settings_cache[project_name].update_from_document( document ) - return self.project_settings_cache[project_name].data + return self.project_settings_cache[project_name].data_copy() def get_studio_project_settings_overrides(self): """Studio overrides of default project settings.""" @@ -471,7 +477,7 @@ class MongoSettingsHandler(SettingsHandler): self.project_anatomy_cache[project_name].update_from_document( document ) - return self.project_anatomy_cache[project_name].data + return self.project_anatomy_cache[project_name].data_copy() def get_studio_project_anatomy_overrides(self): """Studio overrides of default project anatomy data.""" From 52a523d3487db460ed7b4a7668e427c231d20854 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 13:33:12 +0100 Subject: [PATCH 22/37] dont set visibility on service's menu but service's menu action --- pype/modules/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index 0176384a59..ed95746f23 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -150,15 +150,15 @@ class ITrayService(ITrayModule): if ITrayService._services_submenu is None: from Qt import QtWidgets services_submenu = QtWidgets.QMenu("Services", tray_menu) - services_submenu.setVisible(False) + services_submenu.menuAction().setVisible(False) ITrayService._services_submenu = services_submenu return ITrayService._services_submenu @staticmethod def add_service_action(action): ITrayService._services_submenu.addAction(action) - if not ITrayService._services_submenu.isVisible(): - ITrayService._services_submenu.setVisible(True) + if not ITrayService._services_submenu.menuAction().isVisible(): + ITrayService._services_submenu.menuAction().setVisible(True) @staticmethod def _load_service_icons(): From d8b1820d64b8f1b8cd78552369b1aa6c75094d84 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:43:31 +0100 Subject: [PATCH 23/37] family widget get project name from dbcon.Session --- pype/tools/standalonepublish/widgets/widget_family.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pype/tools/standalonepublish/widgets/widget_family.py b/pype/tools/standalonepublish/widgets/widget_family.py index 5c0c8ccd38..bc913591c8 100644 --- a/pype/tools/standalonepublish/widgets/widget_family.py +++ b/pype/tools/standalonepublish/widgets/widget_family.py @@ -310,7 +310,10 @@ class FamilyWidget(QtWidgets.QWidget): def refresh(self): has_families = False - settings = get_project_settings(os.environ['AVALON_PROJECT']) + project_name = self.dbcon.Session.get("AVALON_PROJECT") + if not project_name: + return + settings = get_project_settings(project_name) sp_settings = settings.get('standalonepublisher', {}) print(sp_settings) From 1d8618e3b4d0216677f961392722be6a3082002d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:44:02 +0100 Subject: [PATCH 24/37] check if there is current item --- pype/tools/standalonepublish/widgets/widget_family.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pype/tools/standalonepublish/widgets/widget_family.py b/pype/tools/standalonepublish/widgets/widget_family.py index bc913591c8..c3a642ba60 100644 --- a/pype/tools/standalonepublish/widgets/widget_family.py +++ b/pype/tools/standalonepublish/widgets/widget_family.py @@ -285,7 +285,10 @@ class FamilyWidget(QtWidgets.QWidget): self.schedule(self._on_data_changed, 500, channel="gui") def on_selection_changed(self, *args): - plugin = self.list_families.currentItem().data(PluginRole) + item = self.list_families.currentItem() + if not item: + return + plugin = item.data(PluginRole) if plugin is None: return From da4db49d6d2f4e0b6e63f2398a7256523eb3b1b1 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:44:20 +0100 Subject: [PATCH 25/37] clear families on refresh --- pype/tools/standalonepublish/widgets/widget_family.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pype/tools/standalonepublish/widgets/widget_family.py b/pype/tools/standalonepublish/widgets/widget_family.py index c3a642ba60..dda4e5b03e 100644 --- a/pype/tools/standalonepublish/widgets/widget_family.py +++ b/pype/tools/standalonepublish/widgets/widget_family.py @@ -318,7 +318,8 @@ class FamilyWidget(QtWidgets.QWidget): return settings = get_project_settings(project_name) sp_settings = settings.get('standalonepublisher', {}) - print(sp_settings) + + self.list_families.clear() for key, creator in sp_settings.get("create", {}).items(): if key == "__dynamic_keys_labels__": From b3095e61f984fb88bb577e715c353e7339036aa6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:44:34 +0100 Subject: [PATCH 26/37] trigger project change in asset widget --- pype/tools/standalonepublish/widgets/widget_asset.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pype/tools/standalonepublish/widgets/widget_asset.py b/pype/tools/standalonepublish/widgets/widget_asset.py index 6f041a535f..91565668cc 100644 --- a/pype/tools/standalonepublish/widgets/widget_asset.py +++ b/pype/tools/standalonepublish/widgets/widget_asset.py @@ -121,6 +121,7 @@ class AssetWidget(QtWidgets.QWidget): """ + project_changed = QtCore.Signal(str) assets_refreshed = QtCore.Signal() # on model refresh selection_changed = QtCore.Signal() # on view selection change current_changed = QtCore.Signal() # on view current index change @@ -249,6 +250,9 @@ class AssetWidget(QtWidgets.QWidget): project_name = self.combo_projects.currentText() if project_name in projects: self.dbcon.Session["AVALON_PROJECT"] = project_name + + self.project_changed.emit(project_name) + self.refresh() def _refresh_model(self): From 9c539aa07d56b19f25f4c38e9841fae011900587 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:44:51 +0100 Subject: [PATCH 27/37] refresh family widget on project change --- pype/tools/standalonepublish/app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pype/tools/standalonepublish/app.py b/pype/tools/standalonepublish/app.py index feba46987f..a22dae32b9 100644 --- a/pype/tools/standalonepublish/app.py +++ b/pype/tools/standalonepublish/app.py @@ -62,6 +62,7 @@ class Window(QtWidgets.QDialog): # signals widget_assets.selection_changed.connect(self.on_asset_changed) + widget_assets.project_changed.connect(self.on_project_change) widget_family.stateChanged.connect(self.set_valid_family) self.widget_assets = widget_assets @@ -116,6 +117,9 @@ class Window(QtWidgets.QDialog): parents.append(parent['name']) return parents + def on_project_change(self, project_name): + self.widget_family.refresh() + def on_asset_changed(self): '''Callback on asset selection changed From 1b7aa14cf1b526050fea3a3ca1cc63d149b3ca85 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 14:50:59 +0100 Subject: [PATCH 28/37] clear is as first on refresh --- pype/tools/standalonepublish/widgets/widget_family.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pype/tools/standalonepublish/widgets/widget_family.py b/pype/tools/standalonepublish/widgets/widget_family.py index dda4e5b03e..ed30dba420 100644 --- a/pype/tools/standalonepublish/widgets/widget_family.py +++ b/pype/tools/standalonepublish/widgets/widget_family.py @@ -312,15 +312,16 @@ class FamilyWidget(QtWidgets.QWidget): """ def refresh(self): + self.list_families.clear() + has_families = False project_name = self.dbcon.Session.get("AVALON_PROJECT") if not project_name: return + settings = get_project_settings(project_name) sp_settings = settings.get('standalonepublisher', {}) - self.list_families.clear() - for key, creator in sp_settings.get("create", {}).items(): if key == "__dynamic_keys_labels__": continue From 3ea1c32ae15dca84c04e8585d79c615bd604cd49 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:34:16 +0100 Subject: [PATCH 29/37] avalon module has lowered key in settings --- pype/modules/avalon_apps/avalon_app.py | 2 +- pype/modules/base.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/avalon_apps/avalon_app.py b/pype/modules/avalon_apps/avalon_app.py index d80c0afe6f..683d804412 100644 --- a/pype/modules/avalon_apps/avalon_app.py +++ b/pype/modules/avalon_apps/avalon_app.py @@ -9,7 +9,7 @@ from .. import ( class AvalonModule(PypeModule, ITrayModule, IRestApi): - name = "Avalon" + name = "avalon" def initialize(self, modules_settings): # This module is always enabled diff --git a/pype/modules/base.py b/pype/modules/base.py index ed95746f23..ddc6ad5f65 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -387,7 +387,7 @@ class TrayModulesManager(ModulesManager): "User setting", "Ftrack", "muster", - "Avalon", + "avalon", "Clockify", "Standalone Publish", "Logging", diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index bd5b3e8294..b1eeebf322 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -1,5 +1,5 @@ { - "Avalon": { + "avalon": { "AVALON_MONGO": "", "AVALON_TIMEOUT": 1000, "AVALON_THUMBNAIL_ROOT": { diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index af4426fd01..5f586f9ee6 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -6,7 +6,7 @@ "is_file": true, "children": [{ "type": "dict", - "key": "Avalon", + "key": "avalon", "label": "Avalon", "collapsable": true, "children": [{ From 816646a207a56d6b8ac4643614df8f1fa434477d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:35:50 +0100 Subject: [PATCH 30/37] Rest Api module key lowered in settings --- pype/modules/rest_api/rest_api.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/modules/rest_api/rest_api.py b/pype/modules/rest_api/rest_api.py index bd9e7d2a83..2a074fd97a 100644 --- a/pype/modules/rest_api/rest_api.py +++ b/pype/modules/rest_api/rest_api.py @@ -97,7 +97,7 @@ class RestApiModule(PypeModule, ITrayService): `_handle_callback_result` defined in handler. """ label = "Rest API Service" - name = "Rest Api" + name = "rest_api" def initialize(self, modules_settings): rest_api_settings = modules_settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index b1eeebf322..83b5db0d30 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -104,7 +104,7 @@ } } }, - "Rest Api": { + "rest_api": { "default_port": 8021, "exclude_ports": [] }, diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 5f586f9ee6..7bc2b17c6d 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -40,7 +40,7 @@ }, { "type": "dict", - "key": "Rest Api", + "key": "rest_api", "label": "Rest Api", "collapsable": true, "children": [{ From d77d35717737eef065e4d26174dddfb8edc50938 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:37:20 +0100 Subject: [PATCH 31/37] "User Settings" module name changed to "user" --- pype/modules/base.py | 2 +- pype/modules/user/user_module.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index ddc6ad5f65..6931f2cf32 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -384,7 +384,7 @@ class ModulesManager: class TrayModulesManager(ModulesManager): # Define order of modules in menu modules_menu_order = ( - "User setting", + "user", "Ftrack", "muster", "avalon", diff --git a/pype/modules/user/user_module.py b/pype/modules/user/user_module.py index 240ede947b..21e687c43d 100644 --- a/pype/modules/user/user_module.py +++ b/pype/modules/user/user_module.py @@ -27,7 +27,7 @@ class UserModule(PypeModule, ITrayModule, IRestApi): cred_filename = 'user_info.json' env_name = "PYPE_USERNAME" - name = "User setting" + name = "user" def initialize(self, modules_settings): user_settings = modules_settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index 83b5db0d30..5cac15fa47 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -141,7 +141,7 @@ "Logging": { "enabled": true }, - "User setting": { + "user": { "enabled": true }, "Standalone Publish": { diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 7bc2b17c6d..cf58dec1cd 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -155,7 +155,7 @@ }] }, { "type": "dict", - "key": "User setting", + "key": "user", "label": "User setting", "collapsable": true, "checkbox_key": "enabled", From 63d903e52ad9f587f15c6eef5d9151efa8eb84b3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:38:30 +0100 Subject: [PATCH 32/37] renamed "Ftrack" to "ftrack" --- pype/modules/base.py | 2 +- pype/modules/ftrack/ftrack_module.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../system_schema/module_settings/schema_ftrack.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index 6931f2cf32..b55949a43f 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -385,7 +385,7 @@ class TrayModulesManager(ModulesManager): # Define order of modules in menu modules_menu_order = ( "user", - "Ftrack", + "ftrack", "muster", "avalon", "Clockify", diff --git a/pype/modules/ftrack/ftrack_module.py b/pype/modules/ftrack/ftrack_module.py index 03ea4b96a2..2560f7bc0c 100644 --- a/pype/modules/ftrack/ftrack_module.py +++ b/pype/modules/ftrack/ftrack_module.py @@ -21,7 +21,7 @@ class IFtrackEventHandlerPaths: class FtrackModule( PypeModule, ITrayModule, IPluginPaths, ITimersManager, IUserModule ): - name = "Ftrack" + name = "ftrack" def initialize(self, settings): ftrack_settings = settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index 5cac15fa47..a33343f7d4 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -9,7 +9,7 @@ }, "AVALON_DB_DATA": "{PYPE_SETUP_PATH}/../mongo_db_data" }, - "Ftrack": { + "ftrack": { "enabled": true, "ftrack_server": "https://pype.ftrackapp.com", "ftrack_actions_path": [], diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/module_settings/schema_ftrack.json b/pype/tools/settings/settings/gui_schemas/system_schema/module_settings/schema_ftrack.json index 5459379bcb..1f501cfde3 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/module_settings/schema_ftrack.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/module_settings/schema_ftrack.json @@ -1,6 +1,6 @@ { "type": "dict", - "key": "Ftrack", + "key": "ftrack", "label": "Ftrack", "collapsable": true, "checkbox_key": "enabled", From 9a4fc3b977d9db2ebfc42f866b418312d62faa22 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:40:00 +0100 Subject: [PATCH 33/37] "Clockify" changed to "clockify" --- pype/modules/base.py | 2 +- pype/modules/clockify/clockify_module.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index b55949a43f..20bf1143a1 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -388,7 +388,7 @@ class TrayModulesManager(ModulesManager): "ftrack", "muster", "avalon", - "Clockify", + "clockify", "Standalone Publish", "Logging", "settings" diff --git a/pype/modules/clockify/clockify_module.py b/pype/modules/clockify/clockify_module.py index 61eaaa5747..a91addb971 100644 --- a/pype/modules/clockify/clockify_module.py +++ b/pype/modules/clockify/clockify_module.py @@ -23,7 +23,7 @@ class ClockifyModule( IFtrackEventHandlerPaths, ITimersManager ): - name = "Clockify" + name = "clockify" def initialize(self, modules_settings): clockify_settings = modules_settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index a33343f7d4..f9015cb279 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -113,7 +113,7 @@ "full_time": 15.0, "message_time": 0.5 }, - "Clockify": { + "clockify": { "enabled": false, "workspace_name": "studio name" }, diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index cf58dec1cd..59156fe0fe 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -86,7 +86,7 @@ ] }, { "type": "dict", - "key": "Clockify", + "key": "clockify", "label": "Clockify", "collapsable": true, "checkbox_key": "enabled", From 1996e6f96403ac0edb441a2d394cb50d40ce05e9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:41:40 +0100 Subject: [PATCH 34/37] renamed "Logging" to "log_viewer" --- pype/modules/base.py | 2 +- pype/modules/logging/logging_module.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index 20bf1143a1..35123599bd 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -390,7 +390,7 @@ class TrayModulesManager(ModulesManager): "avalon", "clockify", "Standalone Publish", - "Logging", + "log_viewer", "settings" ) diff --git a/pype/modules/logging/logging_module.py b/pype/modules/logging/logging_module.py index 2aa13cc118..06101b51a5 100644 --- a/pype/modules/logging/logging_module.py +++ b/pype/modules/logging/logging_module.py @@ -3,7 +3,7 @@ from .. import PypeModule, ITrayModule class LoggingModule(PypeModule, ITrayModule): - name = "Logging" + name = "log_viewer" def initialize(self, modules_settings): logging_settings = modules_settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index f9015cb279..ce74e1fbbd 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -138,7 +138,7 @@ "ffmpeg": 48 } }, - "Logging": { + "log_viewer": { "enabled": true }, "user": { diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 59156fe0fe..32e5f7aae5 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -144,7 +144,7 @@ }] }, { "type": "dict", - "key": "Logging", + "key": "log_viewer", "label": "Logging", "collapsable": true, "checkbox_key": "enabled", From 68d40ee3cf34378801ebe45c4c5928f5acee8033 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:43:09 +0100 Subject: [PATCH 35/37] changed "Standalone Publish" to "standalonepublish_tool" --- pype/modules/base.py | 2 +- pype/modules/standalonepublish/standalonepublish_module.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pype/modules/base.py b/pype/modules/base.py index 35123599bd..3c2c2e7e21 100644 --- a/pype/modules/base.py +++ b/pype/modules/base.py @@ -389,7 +389,7 @@ class TrayModulesManager(ModulesManager): "muster", "avalon", "clockify", - "Standalone Publish", + "standalonepublish_tool", "log_viewer", "settings" ) diff --git a/pype/modules/standalonepublish/standalonepublish_module.py b/pype/modules/standalonepublish/standalonepublish_module.py index abed6bddd9..5b0cfe14bf 100644 --- a/pype/modules/standalonepublish/standalonepublish_module.py +++ b/pype/modules/standalonepublish/standalonepublish_module.py @@ -7,7 +7,7 @@ from .. import PypeModule, ITrayModule class StandAlonePublishModule(PypeModule, ITrayModule): menu_label = "Publish" - name = "Standalone Publish" + name = "standalonepublish_tool" def initialize(self, modules_settings): self.enabled = modules_settings[self.name]["enabled"] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index ce74e1fbbd..348efa130d 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -144,7 +144,7 @@ "user": { "enabled": true }, - "Standalone Publish": { + "standalonepublish_tool": { "enabled": true }, "Idle Manager": { diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 32e5f7aae5..7dfe1acdbe 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -166,7 +166,7 @@ }] }, { "type": "dict", - "key": "Standalone Publish", + "key": "standalonepublish_tool", "label": "Standalone Publish", "collapsable": true, "checkbox_key": "enabled", From 47f4e2b8275fe2a84c5263e2f50c1afd6d05e5d0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:44:41 +0100 Subject: [PATCH 36/37] changed "Timers Manager" to "timers_manager" --- pype/modules/timers_manager/timers_manager.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/modules/timers_manager/timers_manager.py b/pype/modules/timers_manager/timers_manager.py index f4f5243f13..d5b65a7bd7 100644 --- a/pype/modules/timers_manager/timers_manager.py +++ b/pype/modules/timers_manager/timers_manager.py @@ -35,7 +35,7 @@ class TimersManager(PypeModule, ITrayService, IIdleManager): If IdleManager is imported then is able to handle about stop timers when user idles for a long time (set in presets). """ - name = "Timers Manager" + name = "timers_manager" label = "Timers Service" def initialize(self, modules_settings): diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index 348efa130d..193f320809 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -108,7 +108,7 @@ "default_port": 8021, "exclude_ports": [] }, - "Timers Manager": { + "timers_manager": { "enabled": true, "full_time": 15.0, "message_time": 0.5 diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 7dfe1acdbe..7594ac27e2 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -63,7 +63,7 @@ ] }, { "type": "dict", - "key": "Timers Manager", + "key": "timers_manager", "label": "Timers Manager", "collapsable": true, "checkbox_key": "enabled", From 15c2be6ffba192a95ee9b2a1523008404211e7d3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 14 Dec 2020 18:45:49 +0100 Subject: [PATCH 37/37] changed "Idle Manager" to "idle_manager" --- pype/modules/idle_manager/idle_manager.py | 2 +- pype/settings/defaults/system_settings/modules.json | 2 +- .../settings/gui_schemas/system_schema/schema_modules.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pype/modules/idle_manager/idle_manager.py b/pype/modules/idle_manager/idle_manager.py index 92592f6add..fa6d70d229 100644 --- a/pype/modules/idle_manager/idle_manager.py +++ b/pype/modules/idle_manager/idle_manager.py @@ -41,7 +41,7 @@ class IdleManager(PypeModule, ITrayService): Is able to emit signals at specific time idle. """ label = "Idle Service" - name = "Idle Manager" + name = "idle_manager" def initialize(self, module_settings): idle_man_settings = module_settings[self.name] diff --git a/pype/settings/defaults/system_settings/modules.json b/pype/settings/defaults/system_settings/modules.json index 193f320809..d123beee14 100644 --- a/pype/settings/defaults/system_settings/modules.json +++ b/pype/settings/defaults/system_settings/modules.json @@ -147,7 +147,7 @@ "standalonepublish_tool": { "enabled": true }, - "Idle Manager": { + "idle_manager": { "enabled": true } } \ No newline at end of file diff --git a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json index 7594ac27e2..0b22530caa 100644 --- a/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json +++ b/pype/tools/settings/settings/gui_schemas/system_schema/schema_modules.json @@ -177,7 +177,7 @@ }] }, { "type": "dict", - "key": "Idle Manager", + "key": "idle_manager", "label": "Idle Manager", "collapsable": true, "checkbox_key": "enabled",