diff --git a/pype/modules/sync_server/sync_server.py b/pype/modules/sync_server/sync_server.py index b763215314..73292b8886 100644 --- a/pype/modules/sync_server/sync_server.py +++ b/pype/modules/sync_server/sync_server.py @@ -339,10 +339,10 @@ class SyncServer(PypeModule, ITrayModule): Returns: (list) of strings """ - return self.get_active_sites_from_setting( + return self.get_active_sites_from_settings( get_project_settings(project_name)) - def get_active_sites_from_setting(self, settings): + def get_active_sites_from_settings(self, settings): """ List available active sites from incoming 'settings'. Used for returning 'default' values for Local Settings @@ -391,10 +391,10 @@ class SyncServer(PypeModule, ITrayModule): Returns: (list) of strings """ - return self.get_remote_sites_from_setting( + return self.get_remote_sites_from_settings( get_project_settings(project_name)) - def get_remote_sites_from_setting(self, settings): + def get_remote_sites_from_settings(self, settings): """ Get remote sites for returning 'default' values for Local Settings """ diff --git a/pype/settings/lib.py b/pype/settings/lib.py index feeeaf3813..59fa6a951c 100644 --- a/pype/settings/lib.py +++ b/pype/settings/lib.py @@ -398,36 +398,35 @@ def apply_local_settings_on_anatomy_settings( if not local_settings: return - local_project_settings = local_settings.get("projects") - if not local_project_settings: - return + local_project_settings = local_settings.get("projects") or {} + # Get local settings fro default project and project specified in argument project_locals = local_project_settings.get(project_name) or {} default_locals = local_project_settings.get(DEFAULT_PROJECT_KEY) or {} - active_site = project_locals.get("active_site") - if not active_site: - active_site = default_locals.get("active_site") - if not active_site: - project_settings = get_project_settings(project_name) - active_site = ( - project_settings - ["global"] - ["sync_server"] - ["config"] - ["active_site"] - ) + # Check for roots existence in local settings first + roots_project_locals = project_locals.get("roots") or {} + roots_default_locals = default_locals.get("roots") or {} + + # Skip rest of processing if roots are not set + if not roots_project_locals and not roots_default_locals: + return + + # Get active site from settings + project_settings = get_project_settings(project_name) + active_site = ( + project_settings["global"]["sync_server"]["config"]["active_site"] + ) # QUESTION should raise an exception? if not active_site: return - roots_locals = default_locals.get("roots", {}).get(active_site, {}) - if project_name != DEFAULT_PROJECT_KEY: - roots_locals.update( - project_locals.get("roots", {}).get(active_site, {}) - ) - + # Combine roots from local settings + roots_locals = roots_default_locals.get(active_site) or {} + roots_locals.update(roots_project_locals.get(active_site) or {}) + # Skip processing if roots for current active site are not available in + # local settings if not roots_locals: return @@ -442,6 +441,47 @@ def apply_local_settings_on_anatomy_settings( ) +def apply_local_settings_on_project_settings( + project_settings, local_settings, project_name +): + """Apply local settings on project settings. + + Currently is modifying active site and remote site in sync server. + + Args: + project_settings (dict): Data for project settings. + local_settings (dict): Data of local settings. + project_name (str): Name of project for which settings data are. + """ + if not local_settings: + return + + local_project_settings = local_settings.get("projects") + if not local_project_settings: + return + + project_locals = local_project_settings.get(project_name) or {} + default_locals = local_project_settings.get(DEFAULT_PROJECT_KEY) or {} + active_site = ( + project_locals.get("active_site") + or default_locals.get("active_site") + ) + remote_site = ( + project_locals.get("remote_site") + or default_locals.get("remote_site") + ) + + if active_site or remote_site: + sync_server_config = ( + project_settings["global"]["sync_server"]["config"] + ) + if active_site: + sync_server_config["active_site"] = active_site + + if remote_site: + sync_server_config["remote_site"] = active_site + + def get_system_settings(clear_metadata=True): """System settings with applied studio overrides.""" default_values = get_default_settings()[SYSTEM_SETTINGS_KEY] @@ -463,6 +503,8 @@ def get_default_project_settings(clear_metadata=True): result = apply_overrides(default_values, studio_values) if clear_metadata: clear_metadata_from_settings(result) + local_settings = get_local_settings() + apply_local_settings_on_project_settings(result, local_settings, None) return result @@ -485,7 +527,7 @@ def get_default_anatomy_settings(clear_metadata=True): return result -def get_anatomy_settings(project_name, clear_metadata=True): +def get_applied_anatomy_settings(project_name): """Project anatomy data with applied studio and project overrides.""" if not project_name: raise ValueError( @@ -498,23 +540,24 @@ def get_anatomy_settings(project_name, clear_metadata=True): project_name ) - # TODO uncomment and remove hotfix result when overrides of anatomy - # are stored correctly. - # result = apply_overrides(studio_overrides, project_overrides) - result = copy.deepcopy(studio_overrides) - if project_overrides: - for key, value in project_overrides.items(): - result[key] = value - if clear_metadata: - clear_metadata_from_settings(result) - local_settings = get_local_settings() - apply_local_settings_on_anatomy_settings( - result, local_settings, project_name - ) + result = apply_overrides(studio_overrides, project_overrides) + + clear_metadata_from_settings(result) + return result -def get_project_settings(project_name, clear_metadata=True): +def get_anatomy_settings(project_name): + result = get_applied_anatomy_settings(project_name) + + local_settings = get_local_settings() + apply_local_settings_on_anatomy_settings( + result, local_settings, project_name + ) + return result + + +def get_applied_project_settings(project_name): """Project settings with applied studio and project overrides.""" if not project_name: raise ValueError( @@ -528,8 +571,18 @@ def get_project_settings(project_name, clear_metadata=True): ) result = apply_overrides(studio_overrides, project_overrides) - if clear_metadata: - clear_metadata_from_settings(result) + clear_metadata_from_settings(result) + return result + + +def get_project_settings(project_name): + result = get_applied_project_settings(project_name) + + local_settings = get_local_settings() + apply_local_settings_on_project_settings( + result, local_settings, project_name + ) + return result diff --git a/pype/tools/settings/local_settings/projects_widget.py b/pype/tools/settings/local_settings/projects_widget.py index 28765155c2..4ad964fcf7 100644 --- a/pype/tools/settings/local_settings/projects_widget.py +++ b/pype/tools/settings/local_settings/projects_widget.py @@ -22,12 +22,6 @@ from .constants import ( NOT_SET = type("NOT_SET", (), {})() -def get_active_sites(project_settings): - global_entity = project_settings["project_settings"]["global"] - sites_entity = global_entity["sync_server"]["sites"] - return tuple(sites_entity.keys()) - - class _ProjectListWidget(ProjectListWidget): def on_item_clicked(self, new_index): new_project_name = new_index.data(QtCore.Qt.DisplayRole) @@ -223,9 +217,10 @@ class RootInputWidget(QtWidgets.QWidget): class RootsWidget(QtWidgets.QWidget): - def __init__(self, project_settings, parent): + def __init__(self, modules_manager, project_settings, parent): super(RootsWidget, self).__init__(parent) + self.modules_manager = modules_manager self.project_settings = project_settings self.site_widgets = [] self.local_project_settings = None @@ -241,6 +236,16 @@ class RootsWidget(QtWidgets.QWidget): self.content_layout.removeItem(item) self.site_widgets = [] + def _get_active_sites(self): + sync_server_module = ( + self.modules_manager.modules_by_name["sync_server"] + ) + if self._project_name is None: + return sync_server_module.get_active_sites_from_setting( + self.project_settings["project_settings"].value + ) + return sync_server_module.get_active_sites(self._project_name) + def refresh(self): self._clear_widgets() @@ -251,7 +256,7 @@ class RootsWidget(QtWidgets.QWidget): self.project_settings[PROJECT_ANATOMY_KEY][LOCAL_ROOTS_KEY] ) # Site label - for site_name in get_active_sites(self.project_settings): + for site_name in self._get_active_sites(): site_widget = QtWidgets.QWidget(self) site_layout = QtWidgets.QVBoxLayout(site_widget) @@ -294,10 +299,12 @@ class RootsWidget(QtWidgets.QWidget): class _SiteCombobox(QtWidgets.QWidget): input_label = None - def __init__(self, project_settings, parent): + def __init__(self, modules_manager, project_settings, parent): super(_SiteCombobox, self).__init__(parent) self.project_settings = project_settings + self.modules_manager = modules_manager + self.local_project_settings = None self.local_project_settings_orig = None self.project_name = None @@ -547,7 +554,14 @@ class AciveSiteCombo(_SiteCombobox): input_label = "Active site" def _get_project_sites(self): - return get_active_sites(self.project_settings) + sync_server_module = ( + self.modules_manager.modules_by_name["sync_server"] + ) + if self.project_name is None: + return sync_server_module.get_active_sites_from_setting( + self.project_settings["project_settings"].value + ) + return sync_server_module.get_active_sites(self.project_name) def _get_local_settings_item(self, project_name=None, data=None): if project_name is None: @@ -575,9 +589,14 @@ class RemoteSiteCombo(_SiteCombobox): input_label = "Remote site" def _get_project_sites(self): - global_entity = self.project_settings["project_settings"]["global"] - sites_entity = global_entity["sync_server"]["sites"] - return tuple(sites_entity.keys()) + sync_server_module = ( + self.modules_manager.modules_by_name["sync_server"] + ) + if self.project_name is None: + return sync_server_module.get_remote_sites_from_setting( + self.project_settings["project_settings"].value + ) + return sync_server_module.get_remote_sites(self.project_name) def _get_local_settings_item(self, project_name=None, data=None): if project_name is None: @@ -601,17 +620,22 @@ class RemoteSiteCombo(_SiteCombobox): class RootSiteWidget(QtWidgets.QWidget): - def __init__(self, project_settings, parent): + def __init__(self, modules_manager, project_settings, parent): self._parent_widget = parent super(RootSiteWidget, self).__init__(parent) + self.modules_manager = modules_manager self.project_settings = project_settings self._project_name = None sites_widget = QtWidgets.QWidget(self) - active_site_widget = AciveSiteCombo(project_settings, sites_widget) - remote_site_widget = RemoteSiteCombo(project_settings, sites_widget) + active_site_widget = AciveSiteCombo( + modules_manager, project_settings, sites_widget + ) + remote_site_widget = RemoteSiteCombo( + modules_manager, project_settings, sites_widget + ) sites_layout = QtWidgets.QHBoxLayout(sites_widget) sites_layout.setContentsMargins(0, 0, 0, 0) @@ -619,7 +643,7 @@ class RootSiteWidget(QtWidgets.QWidget): sites_layout.addWidget(remote_site_widget) sites_layout.addWidget(SpacerWidget(self), 1) - roots_widget = RootsWidget(project_settings, self) + roots_widget = RootsWidget(modules_manager, project_settings, self) main_layout = QtWidgets.QVBoxLayout(self) main_layout.addWidget(sites_widget) @@ -669,13 +693,17 @@ class ProjectValue(dict): class ProjectSettingsWidget(QtWidgets.QWidget): - def __init__(self, project_settings, parent): + def __init__(self, modules_manager, project_settings, parent): super(ProjectSettingsWidget, self).__init__(parent) self.local_project_settings = {} + self.modules_manager = modules_manager + projects_widget = _ProjectListWidget(self) - roos_site_widget = RootSiteWidget(project_settings, self) + roos_site_widget = RootSiteWidget( + modules_manager, project_settings, self + ) main_layout = QtWidgets.QHBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) diff --git a/pype/tools/settings/local_settings/window.py b/pype/tools/settings/local_settings/window.py index 87a276c78c..c5f5d15831 100644 --- a/pype/tools/settings/local_settings/window.py +++ b/pype/tools/settings/local_settings/window.py @@ -11,6 +11,7 @@ from pype.api import ( SystemSettings, ProjectSettings ) +from pype.modules import ModulesManager from .widgets import ( SpacerWidget, @@ -37,6 +38,7 @@ class LocalSettingsWidget(QtWidgets.QWidget): self.system_settings = SystemSettings() self.project_settings = ProjectSettings() + self.modules_manager = ModulesManager() self.main_layout = QtWidgets.QVBoxLayout(self) @@ -108,7 +110,9 @@ class LocalSettingsWidget(QtWidgets.QWidget): project_layout.setContentsMargins(CHILD_OFFSET, 5, 0, 0) project_expand_widget.set_content_widget(project_content) - projects_widget = ProjectSettingsWidget(self.project_settings, self) + projects_widget = ProjectSettingsWidget( + self.modules_manager, self.project_settings, self + ) project_layout.addWidget(projects_widget) self.main_layout.addWidget(project_expand_widget)