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

Commit

Permalink
Merge pull request #2570 from pypeclub/feature/OP-2361_Store-settings…
Browse files Browse the repository at this point in the history
…-by-OpenPype-version

General: Store settings by OpenPype version
  • Loading branch information
iLLiCiTiT authored Feb 10, 2022
2 parents f2547c2 + e7fef1e commit f1c2acd
Show file tree
Hide file tree
Showing 20 changed files with 1,723 additions and 294 deletions.
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

0 comments on commit f1c2acd

Please sign in to comment.