From 55b86c9d2df32d35d32cec565ed89c5674aa76a8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 14:33:47 +0100 Subject: [PATCH 01/17] ignore missing defaults in 'dict-root' --- openpype/settings/entities/dict_immutable_keys_entity.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index d0cd41d11c..48c6d342b2 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -629,7 +629,7 @@ class RootsDictEntity(DictImmutableKeysEntity): self._add_children(schema_data) - self._set_children_values(state) + self._set_children_values(state, ignore_missing_defaults) super(RootsDictEntity, self).set_override_state( state, True @@ -652,11 +652,14 @@ class RootsDictEntity(DictImmutableKeysEntity): return super(RootsDictEntity, self).on_child_change(child_obj) - def _set_children_values(self, state): + def _set_children_values(self, state, ignore_missing_defaults): if state >= OverrideState.DEFAULTS: default_value = self._default_value if default_value is NOT_SET: - if state > OverrideState.DEFAULTS: + if ( + not ignore_missing_defaults + and state > OverrideState.DEFAULTS + ): raise DefaultsNotDefined(self) else: default_value = {} From 1644247ad4dedc9a4395960acb3275d4df4efa36 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 14:34:05 +0100 Subject: [PATCH 02/17] initial commit of SyncServerSites --- openpype/settings/entities/__init__.py | 4 +++- openpype/settings/entities/dict_immutable_keys_entity.py | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/openpype/settings/entities/__init__.py b/openpype/settings/entities/__init__.py index 775bf40ac4..ccf2a5993e 100644 --- a/openpype/settings/entities/__init__.py +++ b/openpype/settings/entities/__init__.py @@ -112,7 +112,8 @@ from .enum_entity import ( from .list_entity import ListEntity from .dict_immutable_keys_entity import ( DictImmutableKeysEntity, - RootsDictEntity + RootsDictEntity, + SyncServerSites ) from .dict_mutable_keys_entity import DictMutableKeysEntity from .dict_conditional import ( @@ -173,6 +174,7 @@ __all__ = ( "DictImmutableKeysEntity", "RootsDictEntity", + "SyncServerSites", "DictMutableKeysEntity", diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 48c6d342b2..5ee8305e66 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -727,3 +727,7 @@ class RootsDictEntity(DictImmutableKeysEntity): self._project_value = value self._project_override_metadata = {} self.had_project_override = value is not NOT_SET + + +class SyncServerSites(DictImmutableKeysEntity): + schema_types = ["sync-server-sites"] From 4685793f183649ea5fba39e7513fcbaed7112941 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 14:34:37 +0100 Subject: [PATCH 03/17] fix project settings configurations of providers --- .../default_modules/sync_server/providers/dropbox.py | 11 ++++++++--- .../default_modules/sync_server/providers/gdrive.py | 11 ++++++++--- .../default_modules/sync_server/providers/sftp.py | 11 ++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/openpype/modules/default_modules/sync_server/providers/dropbox.py b/openpype/modules/default_modules/sync_server/providers/dropbox.py index 0d735a0b59..83d97d822c 100644 --- a/openpype/modules/default_modules/sync_server/providers/dropbox.py +++ b/openpype/modules/default_modules/sync_server/providers/dropbox.py @@ -101,9 +101,14 @@ class DropboxHandler(AbstractProvider): }, # roots could be overriden only on Project level, User cannot { - 'key': "roots", - 'label': "Roots", - 'type': 'dict' + "key": "roots", + "label": "Roots", + "type": "dict-roots", + "object_type": { + "type": "path", + "multiplatform": False, + "multipath": False + } } ] diff --git a/openpype/modules/default_modules/sync_server/providers/gdrive.py b/openpype/modules/default_modules/sync_server/providers/gdrive.py index 0aabd9fbcd..a33a419475 100644 --- a/openpype/modules/default_modules/sync_server/providers/gdrive.py +++ b/openpype/modules/default_modules/sync_server/providers/gdrive.py @@ -131,9 +131,14 @@ class GDriveHandler(AbstractProvider): }, # roots could be overriden only on Project leve, User cannot { - 'key': "roots", - 'label': "Roots", - 'type': 'dict' + "key": "roots", + "label": "Roots", + "type": "dict-roots", + "object_type": { + "type": "path", + "multiplatform": False, + "multipath": False + } } ] return editable diff --git a/openpype/modules/default_modules/sync_server/providers/sftp.py b/openpype/modules/default_modules/sync_server/providers/sftp.py index 07450265e2..a643098413 100644 --- a/openpype/modules/default_modules/sync_server/providers/sftp.py +++ b/openpype/modules/default_modules/sync_server/providers/sftp.py @@ -139,9 +139,14 @@ class SFTPHandler(AbstractProvider): }, # roots could be overriden only on Project leve, User cannot { - 'key': "roots", - 'label': "Roots", - 'type': 'dict' + "key": "roots", + "label": "Roots", + "type": "dict-roots", + "object_type": { + "type": "path", + "multiplatform": False, + "multipath": False + } } ] return editable From 3ba64cfb6a720473c1f9585ae39914602a8193a6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 14:35:00 +0100 Subject: [PATCH 04/17] implemented SyncServerSites --- .../entities/dict_immutable_keys_entity.py | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 5ee8305e66..7fff50c744 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -731,3 +731,158 @@ class RootsDictEntity(DictImmutableKeysEntity): class SyncServerSites(DictImmutableKeysEntity): schema_types = ["sync-server-sites"] + + def _item_initialization(self): + if not self.is_group: + self.is_group = True + + self._studio_overrides_should_be_overriden = False + self.schema_data["children"] = [] + + super(SyncServerSites, self)._item_initialization() + + def set_override_state(self, state, ignore_missing_defaults): + self.children = [] + self.non_gui_children = {} + self.gui_layout = [] + + schema_data = copy.deepcopy(self.schema_data) + children = self._get_children() + schema_data["children"] = children + if state is OverrideState.STUDIO: + self._studio_overrides_should_be_overriden = bool(children) + + self._add_children(schema_data) + + self._set_children_values(state, ignore_missing_defaults) + + super(SyncServerSites, self).set_override_state(state, True) + + if state == OverrideState.STUDIO: + self.add_to_studio_default() + + def on_child_change(self, child_obj): + if ( + self._studio_overrides_should_be_overriden + and self._override_state is OverrideState.STUDIO + and not child_obj.has_studio_override + ): + self.add_to_studio_default() + + return super(SyncServerSites, self).on_child_change(child_obj) + + def _get_children(self): + from openpype_modules import sync_server + + from openpype_modules.sync_server.providers import lib as lib_providers + + # Load system settings to find out all created sites + modules_entity = self.get_entity_from_path("system_settings/modules") + sync_server_settings_entity = modules_entity.get("sync_server") + + # Get project settings configurations for all providers + project_settings_schema = ( + sync_server + .SyncServerModule + .get_project_settings_schema() + ) + + children = [] + checkbox_child = { + "type": "boolean", + "key": "enabled", + "default": False + } + if sync_server_settings_entity is not None: + sites_entity = sync_server_settings_entity["sites"] + for site_name, provider_entity in sites_entity.items(): + provider_name = provider_entity["provider"].value + provider_children = ( + project_settings_schema.get(provider_name) + ) or [] + provider_children.insert(0, copy.deepcopy(checkbox_child)) + children.append({ + "type": "dict", + "key": site_name, + "label": site_name, + "checkbox_key": "enabled", + "children": provider_children + }) + + return children + + def _set_children_values(self, state, ignore_missing_defaults): + if state >= OverrideState.DEFAULTS: + default_value = self._default_value + if default_value is NOT_SET: + if ( + not ignore_missing_defaults + and state > OverrideState.DEFAULTS + ): + raise DefaultsNotDefined(self) + else: + default_value = {} + + for key, child_obj in self.non_gui_children.items(): + child_value = default_value.get(key, NOT_SET) + child_obj.update_default_value(child_value) + + if state >= OverrideState.STUDIO: + value = self._studio_value + if value is NOT_SET: + value = {} + + for key, child_obj in self.non_gui_children.items(): + child_value = value.get(key, NOT_SET) + child_obj.update_studio_value(child_value) + + if state >= OverrideState.PROJECT: + value = self._project_value + if value is NOT_SET: + value = {} + + for key, child_obj in self.non_gui_children.items(): + child_value = value.get(key, NOT_SET) + child_obj.update_project_value(child_value) + + def _update_current_metadata(self): + """Override this method as this entity should not have metadata.""" + self._metadata_are_modified = False + self._current_metadata = {} + + def update_default_value(self, value): + """Update default values. + + Not an api method, should be called by parent. + """ + value = self._check_update_value(value, "default") + value, _ = self._prepare_value(value) + + self._default_value = value + self._default_metadata = {} + self.has_default_value = value is not NOT_SET + + def update_studio_value(self, value): + """Update studio override values. + + Not an api method, should be called by parent. + """ + value = self._check_update_value(value, "studio override") + value, _ = self._prepare_value(value) + + self._studio_value = value + self._studio_override_metadata = {} + self.had_studio_override = value is not NOT_SET + + def update_project_value(self, value): + """Update project override values. + + Not an api method, should be called by parent. + """ + + value = self._check_update_value(value, "project override") + value, _metadata = self._prepare_value(value) + + self._project_value = value + self._project_override_metadata = {} + self.had_project_override = value is not NOT_SET From d1a558cfdb1efc6657a6966bd4a8f6b9baabf9a6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 15:37:41 +0100 Subject: [PATCH 05/17] added multiplatform paths for providers --- .../modules/default_modules/sync_server/providers/dropbox.py | 2 +- .../modules/default_modules/sync_server/providers/gdrive.py | 2 +- openpype/modules/default_modules/sync_server/providers/sftp.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/modules/default_modules/sync_server/providers/dropbox.py b/openpype/modules/default_modules/sync_server/providers/dropbox.py index 83d97d822c..2bc7a83a5b 100644 --- a/openpype/modules/default_modules/sync_server/providers/dropbox.py +++ b/openpype/modules/default_modules/sync_server/providers/dropbox.py @@ -106,7 +106,7 @@ class DropboxHandler(AbstractProvider): "type": "dict-roots", "object_type": { "type": "path", - "multiplatform": False, + "multiplatform": True, "multipath": False } } diff --git a/openpype/modules/default_modules/sync_server/providers/gdrive.py b/openpype/modules/default_modules/sync_server/providers/gdrive.py index a33a419475..8c8447f8f0 100644 --- a/openpype/modules/default_modules/sync_server/providers/gdrive.py +++ b/openpype/modules/default_modules/sync_server/providers/gdrive.py @@ -136,7 +136,7 @@ class GDriveHandler(AbstractProvider): "type": "dict-roots", "object_type": { "type": "path", - "multiplatform": False, + "multiplatform": True, "multipath": False } } diff --git a/openpype/modules/default_modules/sync_server/providers/sftp.py b/openpype/modules/default_modules/sync_server/providers/sftp.py index a643098413..d737849cdc 100644 --- a/openpype/modules/default_modules/sync_server/providers/sftp.py +++ b/openpype/modules/default_modules/sync_server/providers/sftp.py @@ -144,7 +144,7 @@ class SFTPHandler(AbstractProvider): "type": "dict-roots", "object_type": { "type": "path", - "multiplatform": False, + "multiplatform": True, "multipath": False } } From bbf62c0f3c1dafe049f1084f83c114403423b215 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 15:38:09 +0100 Subject: [PATCH 06/17] replaced modifiable-dict with sync-server-sites entity --- .../schema_project_syncserver.json | 93 +------------------ 1 file changed, 2 insertions(+), 91 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json b/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json index 3211babd43..85121c471a 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json @@ -39,100 +39,11 @@ ] }, { - "type": "dict-modifiable", + "type": "sync-server-sites", "collapsible": true, "key": "sites", "label": "Sites", - "collapsible_key": false, - "object_type": { - "type": "dict", - "children": [ - { - "type": "dict", - "key": "gdrive", - "label": "Google Drive", - "collapsible": true, - "children": [ - { - "type": "path", - "key": "credentials_url", - "label": "Credentials url", - "multiplatform": true - } - ] - }, - { - "type": "dict", - "key": "dropbox", - "label": "Dropbox", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "token", - "label": "Access Token" - }, - { - "type": "text", - "key": "team_folder_name", - "label": "Team Folder Name" - }, - { - "type": "text", - "key": "acting_as_member", - "label": "Acting As Member" - } - ] - }, - { - "type": "dict", - "key": "sftp", - "label": "SFTP", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "sftp_host", - "label": "SFTP host" - }, - { - "type": "number", - "key": "sftp_port", - "label": "SFTP port" - }, - { - "type": "text", - "key": "sftp_user", - "label": "SFTP user" - }, - { - "type": "text", - "key": "sftp_pass", - "label": "SFTP pass" - }, - { - "type": "path", - "key": "sftp_key", - "label": "SFTP user ssh key", - "multiplatform": true - }, - { - "type": "text", - "key": "sftp_key_pass", - "label": "SFTP user ssh key password" - } - ] - }, - { - "type": "dict-modifiable", - "key": "root", - "label": "Roots", - "collapsable": false, - "collapsable_key": false, - "object_type": "text" - } - ] - } + "collapsible_key": false } ] } From 28881de61827d7746be38697eb66a6a4fc044e5b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:29:32 +0100 Subject: [PATCH 07/17] fix setting of group --- openpype/settings/entities/dict_immutable_keys_entity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 7fff50c744..5844ff203c 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -572,7 +572,7 @@ class RootsDictEntity(DictImmutableKeysEntity): object_type = {"type": object_type} self.object_type = object_type - if not self.is_group: + if self.group_item is None and not self.is_group: self.is_group = True schema_data = copy.deepcopy(self.schema_data) @@ -733,7 +733,7 @@ class SyncServerSites(DictImmutableKeysEntity): schema_types = ["sync-server-sites"] def _item_initialization(self): - if not self.is_group: + if self.group_item is None and not self.is_group: self.is_group = True self._studio_overrides_should_be_overriden = False From 0e3fddd65635482ad98d86d3a6d94f069eda39a3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:30:36 +0100 Subject: [PATCH 08/17] removed _studio_overrides_should_be_overriden --- .../entities/dict_immutable_keys_entity.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 5844ff203c..12a953346c 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -736,7 +736,6 @@ class SyncServerSites(DictImmutableKeysEntity): if self.group_item is None and not self.is_group: self.is_group = True - self._studio_overrides_should_be_overriden = False self.schema_data["children"] = [] super(SyncServerSites, self)._item_initialization() @@ -749,8 +748,10 @@ class SyncServerSites(DictImmutableKeysEntity): schema_data = copy.deepcopy(self.schema_data) children = self._get_children() schema_data["children"] = children + + studio_overrides_should_be_overriden = False if state is OverrideState.STUDIO: - self._studio_overrides_should_be_overriden = bool(children) + studio_overrides_should_be_overriden = bool(children) self._add_children(schema_data) @@ -758,18 +759,13 @@ class SyncServerSites(DictImmutableKeysEntity): super(SyncServerSites, self).set_override_state(state, True) - if state == OverrideState.STUDIO: + # Make sure studio overrides are set if should be + # - defaults does not contain any children + # project settings are based on studio settings + if studio_overrides_should_be_overriden: self.add_to_studio_default() - def on_child_change(self, child_obj): - if ( - self._studio_overrides_should_be_overriden - and self._override_state is OverrideState.STUDIO - and not child_obj.has_studio_override - ): - self.add_to_studio_default() - return super(SyncServerSites, self).on_child_change(child_obj) def _get_children(self): from openpype_modules import sync_server From 0e9abfef174bf691b0b005df5e1654a4a1302c56 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:30:47 +0100 Subject: [PATCH 09/17] make a deepcopy of children definitions --- openpype/settings/entities/dict_immutable_keys_entity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 12a953346c..2a7c2ed229 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -793,7 +793,7 @@ class SyncServerSites(DictImmutableKeysEntity): sites_entity = sync_server_settings_entity["sites"] for site_name, provider_entity in sites_entity.items(): provider_name = provider_entity["provider"].value - provider_children = ( + provider_children = copy.deepcopy( project_settings_schema.get(provider_name) ) or [] provider_children.insert(0, copy.deepcopy(checkbox_child)) From 884321f982ff661af916272df83cd8f3008545da Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:31:31 +0100 Subject: [PATCH 10/17] store information if site names have changed --- .../settings/entities/dict_immutable_keys_entity.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 2a7c2ed229..cecba7ab1f 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -737,6 +737,7 @@ class SyncServerSites(DictImmutableKeysEntity): self.is_group = True self.schema_data["children"] = [] + self._sites_changed = False super(SyncServerSites, self)._item_initialization() @@ -755,6 +756,7 @@ class SyncServerSites(DictImmutableKeysEntity): self._add_children(schema_data) + self._sites_changed = False self._set_children_values(state, ignore_missing_defaults) super(SyncServerSites, self).set_override_state(state, True) @@ -808,6 +810,8 @@ class SyncServerSites(DictImmutableKeysEntity): return children def _set_children_values(self, state, ignore_missing_defaults): + current_site_names = set(self.non_gui_children.keys()) + if state >= OverrideState.DEFAULTS: default_value = self._default_value if default_value is NOT_SET: @@ -832,6 +836,10 @@ class SyncServerSites(DictImmutableKeysEntity): child_value = value.get(key, NOT_SET) child_obj.update_studio_value(child_value) + if state is OverrideState.STUDIO: + value_keys = set(value.keys()) + self._sites_changed = value_keys != current_site_names + if state >= OverrideState.PROJECT: value = self._project_value if value is NOT_SET: @@ -841,6 +849,10 @@ class SyncServerSites(DictImmutableKeysEntity): child_value = value.get(key, NOT_SET) child_obj.update_project_value(child_value) + if state is OverrideState.PROJECT: + value_keys = set(value.keys()) + self._sites_changed = value_keys != current_site_names + def _update_current_metadata(self): """Override this method as this entity should not have metadata.""" self._metadata_are_modified = False From e7028086a0486a8905a88c347c66dbc7abb2af96 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:31:51 +0100 Subject: [PATCH 11/17] changed changes/overrides/project attributes --- .../entities/dict_immutable_keys_entity.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index cecba7ab1f..9c693e0e16 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -767,7 +767,23 @@ class SyncServerSites(DictImmutableKeysEntity): if studio_overrides_should_be_overriden: self.add_to_studio_default() + @property + def has_unsaved_changes(self): + if self._sites_changed: + return True + return super(SyncServerSites, self).has_unsaved_changes + @property + def has_studio_override(self): + if self._sites_changed: + return True + return super(SyncServerSites, self).has_studio_override + + @property + def has_project_override(self): + if self._sites_changed: + return True + return super(SyncServerSites, self).has_project_override def _get_children(self): from openpype_modules import sync_server From 8f2a9c94edd2b3a758e3866e52f1eeb9b9de647d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:32:02 +0100 Subject: [PATCH 12/17] added few docstrings --- openpype/settings/entities/dict_immutable_keys_entity.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 9c693e0e16..b04e56fefb 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -730,6 +730,7 @@ class RootsDictEntity(DictImmutableKeysEntity): class SyncServerSites(DictImmutableKeysEntity): + """Dictionary enity for sync sites.""" schema_types = ["sync-server-sites"] def _item_initialization(self): @@ -737,6 +738,9 @@ class SyncServerSites(DictImmutableKeysEntity): self.is_group = True self.schema_data["children"] = [] + # Site names changed or were removed + # - to find out that site names was removed so project values + # contain more data than should self._sites_changed = False super(SyncServerSites, self)._item_initialization() @@ -802,6 +806,8 @@ class SyncServerSites(DictImmutableKeysEntity): ) children = [] + # Add 'enabled' for each site to be able know if should be used for + # the project checkbox_child = { "type": "boolean", "key": "enabled", From 621246f9d9e415a79e1e936add5f92a81c36ff2b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 17:34:48 +0100 Subject: [PATCH 13/17] added back "dict-modifiable" to keep backwards compatibility --- .../schema_project_syncserver.json | 93 ++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json b/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json index 85121c471a..3211babd43 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_syncserver.json @@ -39,11 +39,100 @@ ] }, { - "type": "sync-server-sites", + "type": "dict-modifiable", "collapsible": true, "key": "sites", "label": "Sites", - "collapsible_key": false + "collapsible_key": false, + "object_type": { + "type": "dict", + "children": [ + { + "type": "dict", + "key": "gdrive", + "label": "Google Drive", + "collapsible": true, + "children": [ + { + "type": "path", + "key": "credentials_url", + "label": "Credentials url", + "multiplatform": true + } + ] + }, + { + "type": "dict", + "key": "dropbox", + "label": "Dropbox", + "collapsible": true, + "children": [ + { + "type": "text", + "key": "token", + "label": "Access Token" + }, + { + "type": "text", + "key": "team_folder_name", + "label": "Team Folder Name" + }, + { + "type": "text", + "key": "acting_as_member", + "label": "Acting As Member" + } + ] + }, + { + "type": "dict", + "key": "sftp", + "label": "SFTP", + "collapsible": true, + "children": [ + { + "type": "text", + "key": "sftp_host", + "label": "SFTP host" + }, + { + "type": "number", + "key": "sftp_port", + "label": "SFTP port" + }, + { + "type": "text", + "key": "sftp_user", + "label": "SFTP user" + }, + { + "type": "text", + "key": "sftp_pass", + "label": "SFTP pass" + }, + { + "type": "path", + "key": "sftp_key", + "label": "SFTP user ssh key", + "multiplatform": true + }, + { + "type": "text", + "key": "sftp_key_pass", + "label": "SFTP user ssh key password" + } + ] + }, + { + "type": "dict-modifiable", + "key": "root", + "label": "Roots", + "collapsable": false, + "collapsable_key": false, + "object_type": "text" + } + ] + } } ] } From 28eefeffaee0d800e0a3d19002bf1a0b08c39dde Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 18:02:21 +0100 Subject: [PATCH 14/17] removed adding studio override as it's already done with setting `_sites_changed` --- .../settings/entities/dict_immutable_keys_entity.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index b04e56fefb..8ee96563e4 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -754,10 +754,6 @@ class SyncServerSites(DictImmutableKeysEntity): children = self._get_children() schema_data["children"] = children - studio_overrides_should_be_overriden = False - if state is OverrideState.STUDIO: - studio_overrides_should_be_overriden = bool(children) - self._add_children(schema_data) self._sites_changed = False @@ -765,12 +761,6 @@ class SyncServerSites(DictImmutableKeysEntity): super(SyncServerSites, self).set_override_state(state, True) - # Make sure studio overrides are set if should be - # - defaults does not contain any children - # project settings are based on studio settings - if studio_overrides_should_be_overriden: - self.add_to_studio_default() - @property def has_unsaved_changes(self): if self._sites_changed: From 896bc6b35e98bd9941260d11f36b0effb9096c65 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 18:02:29 +0100 Subject: [PATCH 15/17] removed unused import --- openpype/settings/entities/dict_immutable_keys_entity.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 8ee96563e4..80e424ae76 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -782,8 +782,6 @@ class SyncServerSites(DictImmutableKeysEntity): def _get_children(self): from openpype_modules import sync_server - from openpype_modules.sync_server.providers import lib as lib_providers - # Load system settings to find out all created sites modules_entity = self.get_entity_from_path("system_settings/modules") sync_server_settings_entity = modules_entity.get("sync_server") From bf7bf87fb65c059734c3060ea54edd4d525bd9ae Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 1 Nov 2021 18:03:11 +0100 Subject: [PATCH 16/17] adde few more docstrings --- .../entities/dict_immutable_keys_entity.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 80e424ae76..6131fa2ac7 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -730,13 +730,25 @@ class RootsDictEntity(DictImmutableKeysEntity): class SyncServerSites(DictImmutableKeysEntity): - """Dictionary enity for sync sites.""" + """Dictionary enity for sync sites. + + Can be used only in project settings. + + Is loading sites from system settings. Uses site name as key and by site's + provider loads project settings schemas calling method + `get_project_settings_schema` on provider. + + Each provider have `enabled` boolean entity to be able know if site should + be enabled for the project. Enabled is by default set to False. + """ schema_types = ["sync-server-sites"] def _item_initialization(self): + # Make sure this is a group if self.group_item is None and not self.is_group: self.is_group = True + # Fake children for `dict` validations self.schema_data["children"] = [] # Site names changed or were removed # - to find out that site names was removed so project values @@ -746,11 +758,14 @@ class SyncServerSites(DictImmutableKeysEntity): super(SyncServerSites, self)._item_initialization() def set_override_state(self, state, ignore_missing_defaults): + # Cleanup children related attributes self.children = [] self.non_gui_children = {} self.gui_layout = [] + # Create copy of schema schema_data = copy.deepcopy(self.schema_data) + # Collect children children = self._get_children() schema_data["children"] = children From cbf40d36296f9f3b82f18c881234af612c7e714a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 3 Nov 2021 17:34:33 +0100 Subject: [PATCH 17/17] fix local drive provider schemas --- .../sync_server/providers/local_drive.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openpype/modules/default_modules/sync_server/providers/local_drive.py b/openpype/modules/default_modules/sync_server/providers/local_drive.py index 8e5f170bc9..e6c62f2daa 100644 --- a/openpype/modules/default_modules/sync_server/providers/local_drive.py +++ b/openpype/modules/default_modules/sync_server/providers/local_drive.py @@ -50,9 +50,14 @@ class LocalDriveHandler(AbstractProvider): # for non 'studio' sites, 'studio' is configured in Anatomy editable = [ { - 'key': "roots", - 'label': "Roots", - 'type': 'dict' + "key": "roots", + "label": "Roots", + "type": "dict-roots", + "object_type": { + "type": "path", + "multiplatform": True, + "multipath": False + } } ] return editable