Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

General: Store settings by OpenPype version #2570

Merged
merged 17 commits into from
Feb 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions openpype/resources/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@ def get_resource(*args):
return os.path.normpath(os.path.join(RESOURCES_DIR, *args))


def get_image_path(*args):
"""Helper function to get images.

Args:
*<str>: Filepath part items.
"""
return get_resource("images", *args)


def get_liberation_font_path(bold=False, italic=False):
font_name = "LiberationSans"
suffix = ""
Expand Down
Binary file added openpype/resources/images/warning.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions openpype/settings/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
PROJECT_ANATOMY_KEY,
LOCAL_SETTING_KEY,

LEGACY_SETTINGS_VERSION,

SCHEMA_KEY_SYSTEM_SETTINGS,
SCHEMA_KEY_PROJECT_SETTINGS,

Expand Down Expand Up @@ -37,6 +39,8 @@
"PROJECT_ANATOMY_KEY",
"LOCAL_SETTING_KEY",

"LEGACY_SETTINGS_VERSION",

"SCHEMA_KEY_SYSTEM_SETTINGS",
"SCHEMA_KEY_PROJECT_SETTINGS",

Expand Down
2 changes: 2 additions & 0 deletions openpype/settings/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
PROJECT_ANATOMY_KEY = "project_anatomy"
LOCAL_SETTING_KEY = "local_settings"

LEGACY_SETTINGS_VERSION = "legacy"

# Schema hub names
SCHEMA_KEY_SYSTEM_SETTINGS = "system_schema"
SCHEMA_KEY_PROJECT_SETTINGS = "projects_schema"
Expand Down
178 changes: 153 additions & 25 deletions openpype/settings/entities/root_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,24 @@
reset_default_settings,

get_studio_system_settings_overrides,
get_studio_system_settings_overrides_for_version,
save_studio_settings,
get_available_studio_system_settings_overrides_versions,

get_studio_project_settings_overrides,
get_studio_project_settings_overrides_for_version,
get_studio_project_anatomy_overrides,
get_studio_project_anatomy_overrides_for_version,
get_project_settings_overrides,
get_project_settings_overrides_for_version,
get_project_anatomy_overrides,
save_project_settings,
save_project_anatomy,

get_available_project_settings_overrides_versions,
get_available_studio_project_settings_overrides_versions,
get_available_studio_project_anatomy_overrides_versions,

find_environments,
apply_overrides
)
Expand Down Expand Up @@ -495,17 +504,27 @@ class SystemSettings(RootEntity):
root_key = SYSTEM_SETTINGS_KEY

def __init__(
self, set_studio_state=True, reset=True, schema_hub=None
self,
set_studio_state=True,
reset=True,
schema_hub=None,
source_version=None
):
if schema_hub is None:
# Load system schemas
schema_hub = SchemasHub(SCHEMA_KEY_SYSTEM_SETTINGS)

self._source_version = source_version

super(SystemSettings, self).__init__(schema_hub, reset)

if set_studio_state:
self.set_studio_state()

@property
def source_version(self):
return self._source_version

def get_entity_from_path(self, path):
"""Return system settings entity."""
path_parts = path.split("/")
Expand All @@ -524,12 +543,24 @@ def _reset_values(self):
value = default_value.get(key, NOT_SET)
child_obj.update_default_value(value)

studio_overrides = get_studio_system_settings_overrides()
if self._source_version is None:
studio_overrides, version = get_studio_system_settings_overrides(
return_version=True
)
self._source_version = version

else:
studio_overrides = (
get_studio_system_settings_overrides_for_version(
self._source_version
)
)

for key, child_obj in self.non_gui_children.items():
value = studio_overrides.get(key, NOT_SET)
child_obj.update_studio_value(value)

def reset(self, new_state=None):
def reset(self, new_state=None, source_version=None):
"""Discard changes and reset entit's values.

Reload default values and studio override values and update entities.
Expand All @@ -547,9 +578,22 @@ def reset(self, new_state=None):
if new_state is OverrideState.PROJECT:
raise ValueError("System settings can't store poject overrides.")

if source_version is not None:
self._source_version = source_version

self._reset_values()
self.set_override_state(new_state)

def get_available_source_versions(self, sorted=None):
if self.is_in_studio_state():
return self.get_available_studio_versions(sorted=sorted)
return []

def get_available_studio_versions(self, sorted=None):
return get_available_studio_system_settings_overrides_versions(
sorted=sorted
)

def defaults_dir(self):
"""Path to defaults directory.

Expand All @@ -566,6 +610,8 @@ def _save_studio_values(self):
json.dumps(settings_value, indent=4)
))
save_studio_settings(settings_value)
# Reset source version after restart
self._source_version = None

def _validate_defaults_to_save(self, value):
"""Valiations of default values before save."""
Expand Down Expand Up @@ -622,11 +668,15 @@ def __init__(
project_name=None,
change_state=True,
reset=True,
schema_hub=None
schema_hub=None,
source_version=None,
anatomy_source_version=None
):
self._project_name = project_name

self._system_settings_entity = None
self._source_version = source_version
self._anatomy_source_version = anatomy_source_version

if schema_hub is None:
# Load system schemas
Expand All @@ -640,6 +690,14 @@ def __init__(
else:
self.set_project_state()

@property
def source_version(self):
return self._source_version

@property
def anatomy_source_version(self):
return self._anatomy_source_version

@property
def project_name(self):
return self._project_name
Expand Down Expand Up @@ -682,23 +740,20 @@ def get_entity_from_path(self, path):
output = output[path_part]
return output

def change_project(self, project_name):
def change_project(self, project_name, source_version=None):
if project_name == self._project_name:
return

self._project_name = project_name
if project_name is None:
self.set_studio_state()
return

project_override_value = {
PROJECT_SETTINGS_KEY: get_project_settings_overrides(project_name),
PROJECT_ANATOMY_KEY: get_project_anatomy_overrides(project_name)
}
for key, child_obj in self.non_gui_children.items():
value = project_override_value.get(key, NOT_SET)
child_obj.update_project_value(value)

if (
source_version is None
or source_version == self._source_version
):
if not self.is_in_project_state():
self.set_project_state()
return

self._source_version = source_version
self._anatomy_source_version = None

self._set_values_for_project(project_name)
self.set_project_state()

def _reset_values(self):
Expand All @@ -710,27 +765,97 @@ def _reset_values(self):
value = default_values.get(key, NOT_SET)
child_obj.update_default_value(value)

self._set_values_for_project(self.project_name)

def _set_values_for_project(self, project_name):
self._project_name = project_name
if project_name:
project_settings_overrides = (
get_studio_project_settings_overrides()
)
project_anatomy_overrides = (
get_studio_project_anatomy_overrides()
)
else:
if self._source_version is None:
project_settings_overrides, version = (
get_studio_project_settings_overrides(return_version=True)
)
self._source_version = version
else:
project_settings_overrides = (
get_studio_project_settings_overrides_for_version(
self._source_version
)
)

if self._anatomy_source_version is None:
project_anatomy_overrides, anatomy_version = (
get_studio_project_anatomy_overrides(return_version=True)
)
self._anatomy_source_version = anatomy_version
else:
project_anatomy_overrides = (
get_studio_project_anatomy_overrides_for_version(
self._anatomy_source_version
)
)

studio_overrides = {
PROJECT_SETTINGS_KEY: get_studio_project_settings_overrides(),
PROJECT_ANATOMY_KEY: get_studio_project_anatomy_overrides()
PROJECT_SETTINGS_KEY: project_settings_overrides,
PROJECT_ANATOMY_KEY: project_anatomy_overrides
}

for key, child_obj in self.non_gui_children.items():
value = studio_overrides.get(key, NOT_SET)
child_obj.update_studio_value(value)

if not self.project_name:
if not project_name:
return

project_name = self.project_name
if self._source_version is None:
project_settings_overrides, version = (
get_project_settings_overrides(
project_name, return_version=True
)
)
self._source_version = version
else:
project_settings_overrides = (
get_project_settings_overrides_for_version(
project_name, self._source_version
)
)

project_override_value = {
PROJECT_SETTINGS_KEY: get_project_settings_overrides(project_name),
PROJECT_SETTINGS_KEY: project_settings_overrides,
PROJECT_ANATOMY_KEY: get_project_anatomy_overrides(project_name)
}
for key, child_obj in self.non_gui_children.items():
value = project_override_value.get(key, NOT_SET)
child_obj.update_project_value(value)

def get_available_source_versions(self, sorted=None):
if self.is_in_studio_state():
return self.get_available_studio_versions(sorted=sorted)
elif self.is_in_project_state():
return get_available_project_settings_overrides_versions(
self.project_name, sorted=sorted
)
return []

def get_available_studio_versions(self, sorted=None):
return get_available_studio_project_settings_overrides_versions(
sorted=sorted
)

def get_available_anatomy_source_versions(self, sorted=None):
if self.is_in_studio_state():
return get_available_studio_project_anatomy_overrides_versions(
sorted=sorted
)
return []

def reset(self, new_state=None):
"""Discard changes and reset entit's values.

Expand Down Expand Up @@ -763,6 +888,9 @@ def _save_studio_values(self):

self._validate_values_to_save(settings_value)

self._source_version = None
self._anatomy_source_version = None

self.log.debug("Saving project settings: {}".format(
json.dumps(settings_value, indent=4)
))
Expand Down
Loading