Merge pull request #2193 from pypeclub/feature/OP-1939_Site-sync-project-settings-improvement

Settings: Site sync project settings improvement
This commit is contained in:
Jakub Trllo 2021-11-05 11:12:26 +01:00 committed by GitHub
commit 4456cae79f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 234 additions and 17 deletions

View file

@ -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",

View file

@ -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)
@ -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 = {}
@ -724,3 +727,195 @@ class RootsDictEntity(DictImmutableKeysEntity):
self._project_value = value
self._project_override_metadata = {}
self.had_project_override = value is not NOT_SET
class SyncServerSites(DictImmutableKeysEntity):
"""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
# contain more data than should
self._sites_changed = False
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
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)
@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
# 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 = []
# Add 'enabled' for each site to be able know if should be used for
# the project
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 = copy.deepcopy(
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):
current_site_names = set(self.non_gui_children.keys())
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 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:
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)
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
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