diff --git a/client/ayon_core/modules/README.md b/client/ayon_core/modules/README.md index ce3f99b338..8b0bccf0d5 100644 --- a/client/ayon_core/modules/README.md +++ b/client/ayon_core/modules/README.md @@ -42,9 +42,6 @@ OpenPype modules should contain separated logic of specific kind of implementati - they can't be added to any schema hierarchy - item must not be in settings group (under overrides) or in dynamic item (e.g. `list` of `dict-modifiable`) - addons may define it's dynamic schema items -- they can be defined with class which inherits from `BaseModuleSettingsDef` - - it is recommended to use pre implemented `JsonFilesSettingsDef` which defined structure and use json files to define dynamic schemas, schemas and default values - - check it's docstring and check for `example_addon` in example addons - settings definition returns schemas by dynamic schemas names # Interfaces diff --git a/client/ayon_core/modules/__init__.py b/client/ayon_core/modules/__init__.py index 87f3233afc..78da98ba85 100644 --- a/client/ayon_core/modules/__init__.py +++ b/client/ayon_core/modules/__init__.py @@ -19,12 +19,6 @@ from .base import ( ModulesManager, TrayModulesManager, - - BaseModuleSettingsDef, - ModuleSettingsDef, - JsonFilesSettingsDef, - - get_module_settings_defs ) @@ -47,10 +41,4 @@ __all__ = ( "ModulesManager", "TrayModulesManager", - - "BaseModuleSettingsDef", - "ModuleSettingsDef", - "JsonFilesSettingsDef", - - "get_module_settings_defs" ) diff --git a/client/ayon_core/modules/base.py b/client/ayon_core/modules/base.py index 7eb7b8e676..27f1b871d1 100644 --- a/client/ayon_core/modules/base.py +++ b/client/ayon_core/modules/base.py @@ -3,11 +3,9 @@ import copy import os import sys -import json import time import inspect import logging -import platform import threading import collections import traceback @@ -18,20 +16,9 @@ from abc import ABCMeta, abstractmethod import six import appdirs -from ayon_core import AYON_SERVER_ENABLED from ayon_core.client import get_ayon_server_api_connection -from ayon_core.settings import ( - get_system_settings, - SYSTEM_SETTINGS_KEY, - PROJECT_SETTINGS_KEY, - SCHEMA_KEY_SYSTEM_SETTINGS, - SCHEMA_KEY_PROJECT_SETTINGS -) +from ayon_core.settings import get_system_settings -from ayon_core.settings.lib import ( - get_studio_system_settings_overrides, - load_json_file, -) from ayon_core.settings.ayon_settings import ( is_dev_mode_enabled, get_ayon_settings, @@ -196,47 +183,10 @@ def get_default_modules_dir(): return output -def get_dynamic_modules_dirs(): - """Possible paths to OpenPype Addons of Modules. - - Paths are loaded from studio settings under: - `modules -> addon_paths -> {platform name}` - - Path may contain environment variable as a formatting string. - - They are not validated or checked their existence. - - Returns: - list: Paths loaded from studio overrides. - """ - - output = [] - if AYON_SERVER_ENABLED: - return output - - value = get_studio_system_settings_overrides() - for key in ("modules", "addon_paths", platform.system().lower()): - if key not in value: - return output - value = value[key] - - for path in value: - if not path: - continue - - try: - path = path.format(**os.environ) - except Exception: - pass - output.append(path) - return output - - def get_module_dirs(): """List of paths where OpenPype modules can be found.""" _dirpaths = [] _dirpaths.extend(get_default_modules_dir()) - _dirpaths.extend(get_dynamic_modules_dirs()) dirpaths = [] for path in _dirpaths: @@ -524,11 +474,9 @@ def _load_modules(): log = Logger.get_logger("ModulesLoader") - ignore_addon_names = [] - if AYON_SERVER_ENABLED: - ignore_addon_names = _load_ayon_addons( - openpype_modules, modules_key, log - ) + ignore_addon_names = _load_ayon_addons( + openpype_modules, modules_key, log + ) # Look for OpenPype modules in paths defined with `get_module_dirs` # - dynamically imported OpenPype modules and addons @@ -547,8 +495,8 @@ def _load_modules(): ignored_host_names = set(IGNORED_HOSTS_IN_AYON) ignored_current_dir_filenames = set(IGNORED_DEFAULT_FILENAMES) - if AYON_SERVER_ENABLED: - ignored_current_dir_filenames |= IGNORED_FILENAMES_IN_AYON + + ignored_current_dir_filenames |= IGNORED_FILENAMES_IN_AYON processed_paths = set() for dirpath in frozenset(module_dirs): @@ -879,18 +827,14 @@ class ModulesManager: import openpype_modules - self.log.debug("*** {} initialization.".format( - "AYON addons" - if AYON_SERVER_ENABLED - else "OpenPype modules" - )) + self.log.debug("*** AYON addons initialization.") # Prepare settings for modules system_settings = self._system_settings if system_settings is None: system_settings = get_system_settings() ayon_settings = self._ayon_settings - if AYON_SERVER_ENABLED and ayon_settings is None: + if ayon_settings is None: ayon_settings = get_ayon_settings() modules_settings = system_settings["modules"] @@ -1506,424 +1450,3 @@ class TrayModulesManager(ModulesManager): ), exc_info=True ) - - -def get_module_settings_defs(): - """Check loaded addons/modules for existence of their settings definition. - - Check if OpenPype addon/module as python module has class that inherit - from `ModuleSettingsDef` in python module variables (imported - in `__init__py`). - - Returns: - list: All valid and not abstract settings definitions from imported - openpype addons and modules. - """ - # Make sure modules are loaded - load_modules() - - import openpype_modules - - settings_defs = [] - - log = Logger.get_logger("ModuleSettingsLoad") - - for raw_module in openpype_modules: - for attr_name in dir(raw_module): - attr = getattr(raw_module, attr_name) - if ( - not inspect.isclass(attr) - or attr is ModuleSettingsDef - or not issubclass(attr, ModuleSettingsDef) - ): - continue - - if inspect.isabstract(attr): - # Find missing implementations by convention on `abc` module - not_implemented = [] - for attr_name in dir(attr): - attr = getattr(attr, attr_name, None) - abs_method = getattr( - attr, "__isabstractmethod__", None - ) - if attr and abs_method: - not_implemented.append(attr_name) - - # Log missing implementations - log.warning(( - "Skipping abstract Class: {} in module {}." - " Missing implementations: {}" - ).format( - attr_name, raw_module.__name__, ", ".join(not_implemented) - )) - continue - - settings_defs.append(attr) - - return settings_defs - - -@six.add_metaclass(ABCMeta) -class BaseModuleSettingsDef: - """Definition of settings for OpenPype module or AddOn.""" - _id = None - - @property - def id(self): - """ID created on initialization. - - ID should be per created object. Helps to store objects. - """ - if self._id is None: - self._id = uuid4() - return self._id - - @abstractmethod - def get_settings_schemas(self, schema_type): - """Setting schemas for passed schema type. - - These are main schemas by dynamic schema keys. If they're using - sub schemas or templates they should be loaded with - `get_dynamic_schemas`. - - Returns: - dict: Schema by `dynamic_schema` keys. - """ - pass - - @abstractmethod - def get_dynamic_schemas(self, schema_type): - """Settings schemas and templates that can be used anywhere. - - It is recommended to add prefix specific for addon/module to keys - (e.g. "my_addon/real_schema_name"). - - Returns: - dict: Schemas and templates by their keys. - """ - pass - - @abstractmethod - def get_defaults(self, top_key): - """Default values for passed top key. - - Top keys are (currently) "system_settings" or "project_settings". - - Should return exactly what was passed with `save_defaults`. - - Returns: - dict: Default values by path to first key in OpenPype defaults. - """ - pass - - @abstractmethod - def save_defaults(self, top_key, data): - """Save default values for passed top key. - - Top keys are (currently) "system_settings" or "project_settings". - - Passed data are by path to first key defined in main schemas. - """ - pass - - -class ModuleSettingsDef(BaseModuleSettingsDef): - """Settings definition with separated system and procect settings parts. - - Reduce conditions that must be checked and adds predefined methods for - each case. - """ - def get_defaults(self, top_key): - """Split method into 2 methods by top key.""" - if top_key == SYSTEM_SETTINGS_KEY: - return self.get_default_system_settings() or {} - elif top_key == PROJECT_SETTINGS_KEY: - return self.get_default_project_settings() or {} - return {} - - def save_defaults(self, top_key, data): - """Split method into 2 methods by top key.""" - if top_key == SYSTEM_SETTINGS_KEY: - self.save_system_defaults(data) - elif top_key == PROJECT_SETTINGS_KEY: - self.save_project_defaults(data) - - def get_settings_schemas(self, schema_type): - """Split method into 2 methods by schema type.""" - if schema_type == SCHEMA_KEY_SYSTEM_SETTINGS: - return self.get_system_settings_schemas() or {} - elif schema_type == SCHEMA_KEY_PROJECT_SETTINGS: - return self.get_project_settings_schemas() or {} - return {} - - def get_dynamic_schemas(self, schema_type): - """Split method into 2 methods by schema type.""" - if schema_type == SCHEMA_KEY_SYSTEM_SETTINGS: - return self.get_system_dynamic_schemas() or {} - elif schema_type == SCHEMA_KEY_PROJECT_SETTINGS: - return self.get_project_dynamic_schemas() or {} - return {} - - @abstractmethod - def get_system_settings_schemas(self): - """Schemas and templates usable in system settings schemas. - - Returns: - dict: Schemas and templates by it's names. Names must be unique - across whole OpenPype. - """ - pass - - @abstractmethod - def get_project_settings_schemas(self): - """Schemas and templates usable in project settings schemas. - - Returns: - dict: Schemas and templates by it's names. Names must be unique - across whole OpenPype. - """ - pass - - @abstractmethod - def get_system_dynamic_schemas(self): - """System schemas by dynamic schema name. - - If dynamic schema name is not available in then schema will not used. - - Returns: - dict: Schemas or list of schemas by dynamic schema name. - """ - pass - - @abstractmethod - def get_project_dynamic_schemas(self): - """Project schemas by dynamic schema name. - - If dynamic schema name is not available in then schema will not used. - - Returns: - dict: Schemas or list of schemas by dynamic schema name. - """ - pass - - @abstractmethod - def get_default_system_settings(self): - """Default system settings values. - - Returns: - dict: Default values by path to first key. - """ - pass - - @abstractmethod - def get_default_project_settings(self): - """Default project settings values. - - Returns: - dict: Default values by path to first key. - """ - pass - - @abstractmethod - def save_system_defaults(self, data): - """Save default system settings values. - - Passed data are by path to first key defined in main schemas. - """ - pass - - @abstractmethod - def save_project_defaults(self, data): - """Save default project settings values. - - Passed data are by path to first key defined in main schemas. - """ - pass - - -class JsonFilesSettingsDef(ModuleSettingsDef): - """Preimplemented settings definition using json files and file structure. - - Expected file structure: - ┕ root - │ - │ # Default values - ┝ defaults - │ ┝ system_settings.json - │ ┕ project_settings.json - │ - │ # Schemas for `dynamic_template` type - ┝ dynamic_schemas - │ ┝ system_dynamic_schemas.json - │ ┕ project_dynamic_schemas.json - │ - │ # Schemas that can be used anywhere (enhancement for `dynamic_schemas`) - ┕ schemas - ┝ system_schemas - │ ┝ # Any schema or template files - │ ┕ ... - ┕ project_schemas - ┝ # Any schema or template files - ┕ ... - - Schemas can be loaded with prefix to avoid duplicated schema/template names - across all OpenPype addons/modules. Prefix can be defined with class - attribute `schema_prefix`. - - Only think which must be implemented in `get_settings_root_path` which - should return directory path to `root` (in structure graph above). - """ - # Possible way how to define `schemas` prefix - schema_prefix = "" - - @abstractmethod - def get_settings_root_path(self): - """Directory path where settings and it's schemas are located.""" - pass - - def __init__(self): - settings_root_dir = self.get_settings_root_path() - defaults_dir = os.path.join( - settings_root_dir, "defaults" - ) - dynamic_schemas_dir = os.path.join( - settings_root_dir, "dynamic_schemas" - ) - schemas_dir = os.path.join( - settings_root_dir, "schemas" - ) - - self.system_defaults_filepath = os.path.join( - defaults_dir, "system_settings.json" - ) - self.project_defaults_filepath = os.path.join( - defaults_dir, "project_settings.json" - ) - - self.system_dynamic_schemas_filepath = os.path.join( - dynamic_schemas_dir, "system_dynamic_schemas.json" - ) - self.project_dynamic_schemas_filepath = os.path.join( - dynamic_schemas_dir, "project_dynamic_schemas.json" - ) - - self.system_schemas_dir = os.path.join( - schemas_dir, "system_schemas" - ) - self.project_schemas_dir = os.path.join( - schemas_dir, "project_schemas" - ) - - def _load_json_file_data(self, path): - if os.path.exists(path): - return load_json_file(path) - return {} - - def get_default_system_settings(self): - """Default system settings values. - - Returns: - dict: Default values by path to first key. - """ - return self._load_json_file_data(self.system_defaults_filepath) - - def get_default_project_settings(self): - """Default project settings values. - - Returns: - dict: Default values by path to first key. - """ - return self._load_json_file_data(self.project_defaults_filepath) - - def _save_data_to_filepath(self, path, data): - dirpath = os.path.dirname(path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - with open(path, "w") as file_stream: - json.dump(data, file_stream, indent=4) - - def save_system_defaults(self, data): - """Save default system settings values. - - Passed data are by path to first key defined in main schemas. - """ - self._save_data_to_filepath(self.system_defaults_filepath, data) - - def save_project_defaults(self, data): - """Save default project settings values. - - Passed data are by path to first key defined in main schemas. - """ - self._save_data_to_filepath(self.project_defaults_filepath, data) - - def get_system_dynamic_schemas(self): - """System schemas by dynamic schema name. - - If dynamic schema name is not available in then schema will not used. - - Returns: - dict: Schemas or list of schemas by dynamic schema name. - """ - return self._load_json_file_data(self.system_dynamic_schemas_filepath) - - def get_project_dynamic_schemas(self): - """Project schemas by dynamic schema name. - - If dynamic schema name is not available in then schema will not used. - - Returns: - dict: Schemas or list of schemas by dynamic schema name. - """ - return self._load_json_file_data(self.project_dynamic_schemas_filepath) - - def _load_files_from_path(self, path): - output = {} - if not path or not os.path.exists(path): - return output - - if os.path.isfile(path): - filename = os.path.basename(path) - basename, ext = os.path.splitext(filename) - if ext == ".json": - if self.schema_prefix: - key = "{}/{}".format(self.schema_prefix, basename) - else: - key = basename - output[key] = self._load_json_file_data(path) - return output - - path = os.path.normpath(path) - for root, _, files in os.walk(path, topdown=False): - for filename in files: - basename, ext = os.path.splitext(filename) - if ext != ".json": - continue - - json_path = os.path.join(root, filename) - store_key = os.path.join( - root.replace(path, ""), basename - ).replace("\\", "/") - if self.schema_prefix: - store_key = "{}/{}".format(self.schema_prefix, store_key) - output[store_key] = self._load_json_file_data(json_path) - - return output - - def get_system_settings_schemas(self): - """Schemas and templates usable in system settings schemas. - - Returns: - dict: Schemas and templates by it's names. Names must be unique - across whole OpenPype. - """ - return self._load_files_from_path(self.system_schemas_dir) - - def get_project_settings_schemas(self): - """Schemas and templates usable in project settings schemas. - - Returns: - dict: Schemas and templates by it's names. Names must be unique - across whole OpenPype. - """ - return self._load_files_from_path(self.project_schemas_dir) diff --git a/client/ayon_core/settings/__init__.py b/client/ayon_core/settings/__init__.py index 22d734ae58..51019ca570 100644 --- a/client/ayon_core/settings/__init__.py +++ b/client/ayon_core/settings/__init__.py @@ -1,20 +1,6 @@ from .constants import ( - GLOBAL_SETTINGS_KEY, SYSTEM_SETTINGS_KEY, PROJECT_SETTINGS_KEY, - PROJECT_ANATOMY_KEY, - LOCAL_SETTING_KEY, - - LEGACY_SETTINGS_VERSION, - - SCHEMA_KEY_SYSTEM_SETTINGS, - SCHEMA_KEY_PROJECT_SETTINGS, - - KEY_ALLOWED_SYMBOLS, - KEY_REGEX -) -from .exceptions import ( - SaveWarningExc ) from .lib import ( get_general_environments, @@ -22,42 +8,18 @@ from .lib import ( get_system_settings, get_project_settings, get_current_project_settings, - get_anatomy_settings, get_local_settings, ) -from .entities import ( - SystemSettings, - ProjectSettings, - DefaultsNotDefined -) __all__ = ( - "GLOBAL_SETTINGS_KEY", "SYSTEM_SETTINGS_KEY", "PROJECT_SETTINGS_KEY", - "PROJECT_ANATOMY_KEY", - "LOCAL_SETTING_KEY", - - "LEGACY_SETTINGS_VERSION", - - "SCHEMA_KEY_SYSTEM_SETTINGS", - "SCHEMA_KEY_PROJECT_SETTINGS", - - "KEY_ALLOWED_SYMBOLS", - "KEY_REGEX", - - "SaveWarningExc", "get_general_environments", "get_global_settings", "get_system_settings", "get_project_settings", "get_current_project_settings", - "get_anatomy_settings", "get_local_settings", - - "SystemSettings", - "ProjectSettings", - "DefaultsNotDefined" ) diff --git a/client/ayon_core/settings/constants.py b/client/ayon_core/settings/constants.py index cd84d4db1c..0db3948b64 100644 --- a/client/ayon_core/settings/constants.py +++ b/client/ayon_core/settings/constants.py @@ -1,6 +1,3 @@ -import re - - # Metadata keys for work with studio and project overrides M_OVERRIDDEN_KEY = "__overriden_keys__" # Metadata key for storing dynamic created labels @@ -12,23 +9,11 @@ METADATA_KEYS = frozenset([ ]) # Keys where studio's system overrides are stored -GLOBAL_SETTINGS_KEY = "global_settings" SYSTEM_SETTINGS_KEY = "system_settings" PROJECT_SETTINGS_KEY = "project_settings" -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" DEFAULT_PROJECT_KEY = "__default_project__" -KEY_ALLOWED_SYMBOLS = "a-zA-Z0-9-_ " -KEY_REGEX = re.compile(r"^[{}]+$".format(KEY_ALLOWED_SYMBOLS)) - __all__ = ( "M_OVERRIDDEN_KEY", @@ -38,14 +23,6 @@ __all__ = ( "SYSTEM_SETTINGS_KEY", "PROJECT_SETTINGS_KEY", - "PROJECT_ANATOMY_KEY", - "LOCAL_SETTING_KEY", - - "SCHEMA_KEY_SYSTEM_SETTINGS", - "SCHEMA_KEY_PROJECT_SETTINGS", "DEFAULT_PROJECT_KEY", - - "KEY_ALLOWED_SYMBOLS", - "KEY_REGEX" ) diff --git a/client/ayon_core/settings/entities/__init__.py b/client/ayon_core/settings/entities/__init__.py deleted file mode 100644 index 00db2b33a7..0000000000 --- a/client/ayon_core/settings/entities/__init__.py +++ /dev/null @@ -1,191 +0,0 @@ -"""OpenPype Settings - -Settings define how openpype and it's modules behave. They became main -component of dynamism. - -OpenPype settings (ATM) have 3 layers: -1.) Defaults - defined in code -2.) Studio overrides - values that are applied on default that may modify only - some values or None, result can be called "studio settings" -3.) Project overrides - values that are applied on studio settings, may modify - some values or None and may modify values that are not modified in studio - overrides - -To be able do these overrides it is required to store metadata defying which -data are applied and how. Because of that it is not possible to modify -overrides manually and expect it would work right. - -Structure of settings is defined with schemas. Schemas have defined structure -and possible types with possible attributes (Schemas and their description -can be found in "./schemas/README.md"). - -To modify settings it's recommended to use UI settings tool which can easily -visuallise how values are applied. - -With help of setting entities it is possible to modify settings from code. - -OpenPype has (ATM) 2 types of settings: -1.) System settings - global system settings, don't have project overrides -2.) Project settings - project specific settings - -Startpoint is root entity that cares about access to other setting entities -in their scope. To be able work with entities it is required to understand -setting schemas and their structure. It is possible to work with dictionary -and list entities as with standard python objects. - -```python -# Create an object of system settings. -system_settings = SystemSettings() - -# How to get value of entity -print(system_settings["general"]["studio_name"].value) - ->>> TestStudio Name - -# How to set value -# Variant 1 -system_settings["general"]["studio_name"] = "StudioidutS" -# Variant 2 -system_settings["general"]["studio_name"].set("StudioidutS") - -print(system_settings["general"]["studio_name"].value) ->>> StudioidutS -``` -""" - -from .exceptions import ( - SchemaError, - DefaultsNotDefined, - StudioDefaultsNotDefined, - BaseInvalidValue, - InvalidValueType, - InvalidKeySymbols, - SchemaMissingFileInfo, - SchemeGroupHierarchyBug, - SchemaDuplicatedKeys, - SchemaDuplicatedEnvGroupKeys, - SchemaTemplateMissingKeys -) -from .lib import ( - NOT_SET, - OverrideState -) -from .base_entity import ( - BaseEntity, - GUIEntity, - BaseItemEntity, - ItemEntity -) - -from .root_entities import ( - SystemSettings, - ProjectSettings -) - -from .item_entities import ( - PathEntity, - ListStrictEntity -) - -from .input_entities import ( - EndpointEntity, - InputEntity, - - NumberEntity, - BoolEntity, - TextEntity, - PathInput, - RawJsonEntity -) -from .color_entity import ColorEntity -from .enum_entity import ( - BaseEnumEntity, - EnumEntity, - HostsEnumEntity, - AppsEnumEntity, - ToolsEnumEntity, - TaskTypeEnumEntity, - DeadlineUrlEnumEntity, - AnatomyTemplatesEnumEntity, - ShotgridUrlEnumEntity, - RoyalRenderRootEnumEntity -) - -from .list_entity import ListEntity -from .dict_immutable_keys_entity import ( - DictImmutableKeysEntity, - RootsDictEntity, - SyncServerSites -) -from .dict_mutable_keys_entity import DictMutableKeysEntity -from .dict_conditional import ( - DictConditionalEntity, - SyncServerProviders -) - -from .anatomy_entities import AnatomyEntity -from .op_version_entity import VersionsInputEntity - -__all__ = ( - "DefaultsNotDefined", - "StudioDefaultsNotDefined", - "BaseInvalidValue", - "InvalidValueType", - "InvalidKeySymbols", - "SchemaMissingFileInfo", - "SchemeGroupHierarchyBug", - "SchemaDuplicatedKeys", - "SchemaDuplicatedEnvGroupKeys", - "SchemaTemplateMissingKeys", - - "NOT_SET", - "OverrideState", - - "BaseEntity", - "GUIEntity", - "BaseItemEntity", - "ItemEntity", - - "SystemSettings", - "ProjectSettings", - - "PathEntity", - "ListStrictEntity", - - "EndpointEntity", - "InputEntity", - - "NumberEntity", - "BoolEntity", - "TextEntity", - "PathInput", - "RawJsonEntity", - - "ColorEntity", - - "BaseEnumEntity", - "EnumEntity", - "HostsEnumEntity", - "AppsEnumEntity", - "ToolsEnumEntity", - "TaskTypeEnumEntity", - "DeadlineUrlEnumEntity", - "ShotgridUrlEnumEntity", - "RoyalRenderRootEnumEntity", - "AnatomyTemplatesEnumEntity", - - "ListEntity", - - "DictImmutableKeysEntity", - "RootsDictEntity", - "SyncServerSites", - - "DictMutableKeysEntity", - - "DictConditionalEntity", - "SyncServerProviders", - - "AnatomyEntity", - - "VersionsInputEntity", -) diff --git a/client/ayon_core/settings/entities/anatomy_entities.py b/client/ayon_core/settings/entities/anatomy_entities.py deleted file mode 100644 index 489e1f8294..0000000000 --- a/client/ayon_core/settings/entities/anatomy_entities.py +++ /dev/null @@ -1,48 +0,0 @@ -from .dict_immutable_keys_entity import DictImmutableKeysEntity -from .lib import OverrideState -from .exceptions import EntitySchemaError - - -class AnatomyEntity(DictImmutableKeysEntity): - schema_types = ["anatomy"] - - def _update_current_metadata(self): - if self._override_state is OverrideState.PROJECT: - return {} - return super(AnatomyEntity, self)._update_current_metadata() - - def set_override_state(self, *args, **kwargs): - super(AnatomyEntity, self).set_override_state(*args, **kwargs) - if self._override_state is OverrideState.PROJECT: - for child_obj in self.non_gui_children.values(): - if not child_obj.has_project_override: - self.add_to_project_override() - break - - def on_child_change(self, child_obj): - if self._override_state is OverrideState.PROJECT: - if not child_obj.has_project_override: - child_obj.add_to_project_override() - return super(AnatomyEntity, self).on_child_change(child_obj) - - def schema_validations(self): - non_group_children = [] - for key, child_obj in self.non_gui_children.items(): - if not child_obj.is_group: - non_group_children.append(key) - - if non_group_children: - _non_group_children = [ - "project_anatomy/{}".format(key) - for key in non_group_children - ] - reason = ( - "Anatomy must have all children as groups." - " Set 'is_group' to `true` on > {}" - ).format(", ".join([ - '"{}"'.format(item) - for item in _non_group_children - ])) - raise EntitySchemaError(self, reason) - - return super(AnatomyEntity, self).schema_validations() diff --git a/client/ayon_core/settings/entities/base_entity.py b/client/ayon_core/settings/entities/base_entity.py deleted file mode 100644 index ec59b97505..0000000000 --- a/client/ayon_core/settings/entities/base_entity.py +++ /dev/null @@ -1,1015 +0,0 @@ -from uuid import uuid4 -from abc import ABCMeta, abstractmethod, abstractproperty - -import six - -from .lib import ( - NOT_SET, - OverrideState -) - -from .exceptions import ( - BaseInvalidValue, - InvalidValueType, - SchemeGroupHierarchyBug, - EntitySchemaError -) - -from ayon_core.lib import Logger - - -@six.add_metaclass(ABCMeta) -class BaseEntity: - """Base entity class for Setting's item type workflow. - - Args: - schema_data (dict): Schema data that defines entity behavior. - """ - - def __init__(self, schema_data, *args, **kwargs): - self.schema_data = schema_data - tooltip = None - if schema_data: - tooltip = schema_data.get("tooltip") - self.tooltip = tooltip - - # Entity id - self._id = uuid4() - - def __hash__(self): - """Make entity hashable by it's id. - - Helps to store entities as keys in dictionary. - """ - return self.id - - @property - def id(self): - """Unified identifier of an entity.""" - return self._id - - @abstractproperty - def gui_type(self): - """Is entity GUI type entity.""" - pass - - @abstractmethod - def schema_validations(self): - """Validation of schema.""" - pass - - -class GUIEntity(BaseEntity): - """Entity without any specific logic that should be handled only in GUI.""" - gui_type = True - - schema_types = ["separator", "splitter", "label"] - - def __getitem__(self, key): - return self.schema_data[key] - - def schema_validations(self): - """TODO validate GUI schemas.""" - pass - - -class BaseItemEntity(BaseEntity): - """Base of item entity that is not only for GUI but can modify values. - - Defines minimum attributes of all entities that are not `gui_type`. - - Args: - schema_data (dict): Schema data that defines entity behavior. - """ - gui_type = False - - def __init__(self, schema_data): - super(BaseItemEntity, self).__init__(schema_data) - - # Parent entity - self.parent = None - - # Entity is dynamically created (in list or dict with mutable keys) - # - can be also dynamically removed - self.is_dynamic_item = False - - # Log object created on demand with `log` attribute - self._log = None - - # Item path attribute (may be filled or be dynamic) - self._path = None - - # These should be set on initialization and not change then - self.valid_value_types = getattr(self, "valid_value_types", NOT_SET) - self.value_on_not_set = getattr(self, "value_on_not_set", NOT_SET) - - # Entity represents group entity - # - all children entities will be saved on modification of overrides - self.is_group = False - # Entity's value will be stored into file with name of it's key - self.is_file = False - # Default values are not stored to an openpype file - # - these must not be set through schemas directly - self.dynamic_schema_id = None - self.is_dynamic_schema_node = False - self.is_in_dynamic_schema_node = False - - # Reference to parent entity which has `is_group` == True - # - stays as None if none of parents is group - self.group_item = None - # Reference to parent entity which has `is_file` == True - self.file_item = None - # Reference to `RootEntity` - self.root_item = None - # Change of value requires restart of OpenPype - self._require_restart_on_change = False - - # Entity is in hierarchy of dynamically created entity - self.is_in_dynamic_item = False - - # Roles of an entity - self.roles = None - - # Key must be specified in schema data otherwise won't work as expected - self.require_key = True - - # Key and label of an entity - self.key = None - self.label = None - - # Override state defines which values are used, saved and how. - # TODO convert to private attribute - self._override_state = OverrideState.NOT_DEFINED - self._ignore_missing_defaults = None - - # These attributes may change values during existence of an object - # Default value, studio override values and project override values - # - these should be set only with `update_default_value` etc. - # TODO convert to private attributes - self._default_value = NOT_SET - self._studio_override_value = NOT_SET - self._project_override_value = NOT_SET - - # Entity has set `_default_value` (is not NOT_SET) - self.has_default_value = False - - # Entity is marked as it contain studio override data so it's value - # will be stored to studio overrides. This is relevant attribute - # only if current override state is set to STUDIO. - self._has_studio_override = False - # Entity has set `_studio_override_value` (is not NOT_SET) - self.had_studio_override = False - - # Entity is marked as it contain project override data so it's value - # will be stored to project overrides. This is relevant attribute - # only if current override state is set to PROJECT. - self._has_project_override = False - # Entity has set `_project_override_value` (is not NOT_SET) - self.had_project_override = False - - self._default_log_invalid_types = True - self._studio_log_invalid_types = True - self._project_log_invalid_types = True - - # Callbacks that are called on change. - # - main current purspose is to register GUI callbacks - self.on_change_callbacks = [] - - roles = schema_data.get("roles") - if roles is None: - roles = [] - elif not isinstance(roles, list): - roles = [roles] - self.roles = roles - - @abstractmethod - def collect_static_entities_by_path(self): - """Collect all paths of all static path entities. - - Static path is entity which is not dynamic or under dynamic entity. - """ - pass - - @property - def require_restart_on_change(self): - return self._require_restart_on_change - - @property - def require_restart(self): - return False - - @property - def has_studio_override(self): - """Says if entity or it's children has studio overrides.""" - if self._override_state >= OverrideState.STUDIO: - return self._has_studio_override - return False - - @property - def has_project_override(self): - """Says if entity or it's children has project overrides.""" - if self._override_state >= OverrideState.PROJECT: - return self._has_project_override - return False - - @property - def path(self): - """Full path of an entity in settings hierarchy. - - It is not possible to use this attribute during initialization because - initialization happens before entity is added to parent's children. - """ - if self._path is not None: - return self._path - - path = self.parent.get_child_path(self) - if not self.is_in_dynamic_item and not self.is_dynamic_item: - self._path = path - return path - - @abstractmethod - def get_child_path(self, child_entity): - """Return path for a direct child entity.""" - pass - - @abstractmethod - def get_entity_from_path(self, path): - """Return system settings entity.""" - pass - - @abstractmethod - def has_child_with_key(self, key): - """Entity contains key as children.""" - pass - - def schema_validations(self): - """Validate schema of entity and it's hierachy. - - Contain default validations same for all entities. - """ - # Entity must have defined valid value types. - if self.valid_value_types is NOT_SET: - raise EntitySchemaError( - self, "Attribute `valid_value_types` is not filled." - ) - - # Check if entity has defined key when is required. - if self.require_key and not self.key: - error_msg = "Missing \"key\" in schema data. {}".format( - str(self.schema_data).replace("'", '"') - ) - raise EntitySchemaError(self, error_msg) - - # Group entity must have defined label. (UI specific) - # QUESTION this should not be required? - if not self.label and self.is_group: - raise EntitySchemaError( - self, "Item is set as `is_group` but has empty `label`." - ) - - # Group item can be only once in on hierarchy branch. - if self.is_group and self.group_item is not None: - raise SchemeGroupHierarchyBug(self) - - # Group item can be only once in on hierarchy branch. - if self.group_item is not None and self.is_dynamic_schema_node: - reason = ( - "Dynamic schema is inside grouped item {}." - " Change group hierarchy or remove dynamic" - " schema to be able work properly." - ).format(self.group_item.path) - raise EntitySchemaError(self, reason) - - # Dynamic items must not have defined labels. (UI specific) - if self.label and self.is_dynamic_item: - raise EntitySchemaError( - self, "Item has set label but is used as dynamic item." - ) - - # Dynamic items or items in dynamic item must not have set `is_group` - if self.is_group and (self.is_dynamic_item or self.is_in_dynamic_item): - raise EntitySchemaError( - self, "Dynamic entity has set `is_group` to true." - ) - - if ( - self.require_restart_on_change - and (self.is_dynamic_item or self.is_in_dynamic_item) - ): - raise EntitySchemaError( - self, "Dynamic entity can't require restart." - ) - - @abstractproperty - def root_key(self): - """Root is represented as this dictionary key.""" - pass - - @abstractmethod - def set_override_state(self, state, ignore_missing_defaults): - """Set override state and trigger it on children. - - Method discard all changes in hierarchy and use values, metadata - and all kind of values for defined override state. May be used to - apply updated values (default, studio overrides, project overrides). - - Should start on root entity and when triggered then must be called on - all entities in hierarchy. - - Argument `ignore_missing_defaults` should be used when entity has - children that are not saved or used all the time but override statu - must be changed and children must have any default value. - - Args: - state (OverrideState): State to which should be data changed. - ignore_missing_defaults (bool): Ignore missing default values. - Entity won't raise `DefaultsNotDefined` and - `StudioDefaultsNotDefined`. - """ - pass - - @abstractmethod - def on_change(self): - """Trigger change callbacks and tell parent that has changed. - - Can be any kind of change. Value has changed, has studio overrides - changed from True to False, etc. - """ - pass - - @abstractmethod - def on_child_change(self, child_entity): - """Triggered by children when they've changed. - - Args: - child_entity (BaseItemEntity): Direct child entity that has - changed. - """ - pass - - @abstractmethod - def set(self, value): - """Set value of entity. - - Args: - value (Any): Setter of value for this entity. - """ - pass - - def is_value_valid_type(self, value): - """Validate passed value type by entity's defined valid types. - - Returns: - bool: True if value is in entity's defined types. - """ - return isinstance(value, self.valid_value_types) - - def _validate_value_type(self, value): - """Validate entered value. - - Raises: - InvalidValueType: If value's type is not valid by entity's - definition. - """ - if self.is_value_valid_type(value): - return - - raise InvalidValueType(self.valid_value_types, type(value), self.path) - - def _convert_to_valid_type(self, value): - """Private method of entity to convert value. - - NOTE: Method is not abstract as more entities won't have implemented - logic inside. - - Must return NOT_SET if can't convert the value. - """ - return NOT_SET - - def convert_to_valid_type(self, value): - """Check value type with possibility of conversion to valid. - - If entered value has right type than is returned as it is. otherwise - is used privete method of entity to try convert. - - Raises: - InvalidValueType: If value's type is not valid by entity's - definition and can't be converted by entity logic. - """ - # - if self.is_value_valid_type(value): - return value - - new_value = self._convert_to_valid_type(value) - if new_value is not NOT_SET and self.is_value_valid_type(new_value): - return new_value - - raise InvalidValueType(self.valid_value_types, type(value), self.path) - - # TODO convert to private method - def _check_update_value(self, value, value_source, log_invalid_types=True): - """Validation of value on update methods. - - Update methods update data from currently saved settings so it is - possible to have invalid type mainly during development. - - Args: - value (Any): Value that got to update method. - value_source (str): Source update method. Is used for logging and - is not used as part of logic ("default", "studio override", - "project override"). - - Returns: - Any: Return value itself if has valid type. - NOT_SET: If value has invalid type. - """ - # Nothing to validate if is NOT_SET - if value is NOT_SET: - return value - - try: - new_value = self.convert_to_valid_type(value) - except BaseInvalidValue: - new_value = NOT_SET - - if new_value is not NOT_SET: - return new_value - - if log_invalid_types: - # Warning log about invalid value type. - self.log.warning( - ( - "{} Got invalid value type for {} values." - " Expected types: {} | Got Type: {} | Value: \"{}\"" - ).format( - self.path, value_source, - self.valid_value_types, type(value), str(value) - ) - ) - return NOT_SET - - def available_for_role(self, role_name=None): - """Is entity valid for role. - - Args: - role_name (str): Name of role that will be validated. Entity's - `user_role` attribute is used if not defined. - - Returns: - bool: True if is available for role. - """ - if not self.roles: - return True - if role_name is None: - role_name = self.user_role - return role_name in self.roles - - @property - def user_role(self): - """Entity is using user role. - - Returns: - str: user role as string. - - """ - return self.parent.user_role - - @property - def log(self): - """Auto created logger for debugging or warnings.""" - if self._log is None: - self._log = Logger.get_logger(self.__class__.__name__) - return self._log - - @abstractproperty - def schema_types(self): - pass - - @abstractproperty - def has_unsaved_changes(self): - pass - - @abstractmethod - def settings_value(self): - """Value of an item without key without dynamic items.""" - pass - - @abstractmethod - def collect_dynamic_schema_entities(self): - """Collect entities that are on top of dynamically added schemas. - - This method make sence only when defaults are saved. - """ - pass - - @abstractmethod - def save(self): - """Save data for current state.""" - pass - - @abstractmethod - def _item_initialization(self): - """Entity specific initialization process.""" - pass - - @abstractproperty - def value(self): - """Value of entity without metadata.""" - pass - - @property - def _can_discard_changes(self): - """Defines if `discard_changes` will be processed.""" - return self.has_unsaved_changes - - @property - def _can_add_to_studio_default(self): - """Defines if `add_to_studio_default` will be processed.""" - if self._override_state is not OverrideState.STUDIO: - return False - - # Skip if entity is under group - if self.group_item is not None: - return False - - # Skip if is group and any children is already marked with studio - # overrides - if self.is_group and self.has_studio_override: - return False - return True - - @property - def _can_remove_from_studio_default(self): - """Defines if `remove_from_studio_default` can be processed.""" - if self._override_state is not OverrideState.STUDIO: - return False - - if not self.has_studio_override: - return False - return True - - @property - def _can_add_to_project_override(self): - """Defines if `add_to_project_override` can be processed.""" - # Show only when project overrides are set - if self._override_state is not OverrideState.PROJECT: - return False - - # Do not show on items under group item - if self.group_item is not None: - return False - - # Skip if already is marked to save project overrides - if self.is_group and self.has_project_override: - return False - return True - - @property - def _can_remove_from_project_override(self): - """Defines if `remove_from_project_override` can be processed.""" - if self._override_state is not OverrideState.PROJECT: - return False - - # Dynamic items can't have these actions - if self.is_dynamic_item or self.is_in_dynamic_item: - return False - - if not self.has_project_override: - return False - return True - - @property - def can_trigger_discard_changes(self): - """Defines if can trigger `discard_changes`. - - Also can be used as validation before the method is called. - """ - return self._can_discard_changes - - @property - def can_trigger_add_to_studio_default(self): - """Defines if can trigger `add_to_studio_default`. - - Also can be used as validation before the method is called. - """ - if self.is_dynamic_item or self.is_in_dynamic_item: - return False - return self._can_add_to_studio_default - - @property - def can_trigger_remove_from_studio_default(self): - """Defines if can trigger `remove_from_studio_default`. - - Also can be used as validation before the method is called. - """ - if self.is_dynamic_item or self.is_in_dynamic_item: - return False - return self._can_remove_from_studio_default - - @property - def can_trigger_add_to_project_override(self): - """Defines if can trigger `add_to_project_override`. - - Also can be used as validation before the method is called. - """ - if self.is_dynamic_item or self.is_in_dynamic_item: - return False - return self._can_add_to_project_override - - @property - def can_trigger_remove_from_project_override(self): - """Defines if can trigger `remove_from_project_override`. - - Also can be used as validation before the method is called. - """ - if self.is_dynamic_item or self.is_in_dynamic_item: - return False - return self._can_remove_from_project_override - - def discard_changes(self, on_change_trigger=None): - """Discard changes on entity and it's children. - - Reset all values to same values as had when `set_override_state` was - called last time. - - Must not affect `had_studio_override` value or `had_project_override` - value. It must be marked that there are keys/values which are not in - defaults or overrides. - - Won't affect if will be stored as overrides if entity is under - group entity in hierarchy. - - This is wrapper method that handles on_change callbacks only when all - `_discard_changes` on all children happened. That is important as - value changes may trigger change callbacks that must be ignored. - Callbacks are triggered by entity where method was called. - - Args: - on_change_trigger (list): Callbacks of `on_change` should be stored - to trigger them afterwards. - """ - initialized = False - if on_change_trigger is None: - if not self.can_trigger_discard_changes: - return - - initialized = True - on_change_trigger = [] - - self._discard_changes(on_change_trigger) - - if initialized: - for callback in on_change_trigger: - callback() - - @abstractmethod - def _discard_changes(self, on_change_trigger): - """Entity's implementation to discard all changes made by user.""" - pass - - def add_to_studio_default(self, on_change_trigger=None): - initialized = False - if on_change_trigger is None: - if not self.can_trigger_add_to_studio_default: - return - - initialized = True - on_change_trigger = [] - - self._add_to_studio_default(on_change_trigger) - - if initialized: - for callback in on_change_trigger: - callback() - - @abstractmethod - def _add_to_studio_default(self, on_change_trigger): - """Item's implementation to set current values as studio's overrides. - - Mark item and it's children as they have studio overrides. - """ - pass - - def remove_from_studio_default(self, on_change_trigger=None): - """Remove studio overrides from entity and it's children. - - Reset values to openpype's default and mark entity to not store values - as studio overrides if entity is not under group. - - This is wrapper method that handles on_change callbacks only when all - `_remove_from_studio_default` on all children happened. That is - important as value changes may trigger change callbacks that must be - ignored. Callbacks are triggered by entity where method was called. - - Args: - on_change_trigger (list): Callbacks of `on_change` should be stored - to trigger them afterwards. - """ - initialized = False - if on_change_trigger is None: - if not self.can_trigger_remove_from_studio_default: - return - - initialized = True - on_change_trigger = [] - - self._remove_from_studio_default(on_change_trigger) - - if initialized: - for callback in on_change_trigger: - callback() - - @abstractmethod - def _remove_from_studio_default(self, on_change_trigger): - """Item's implementation to remove studio overrides. - - Mark item as it does not have studio overrides unset studio - override values. - """ - pass - - def add_to_project_override(self, on_change_trigger=None): - initialized = False - if on_change_trigger is None: - if not self.can_trigger_add_to_project_override: - return - - initialized = True - on_change_trigger = [] - - self._add_to_project_override(on_change_trigger) - - if initialized: - for callback in on_change_trigger: - callback() - - @abstractmethod - def _add_to_project_override(self, on_change_trigger): - """Item's implementation to set values as overridden for project. - - Mark item and all it's children to be stored as project overrides. - """ - pass - - def remove_from_project_override(self, on_change_trigger=None): - """Remove project overrides from entity and it's children. - - Reset values to studio overrides or openpype's default and mark entity - to not store values as project overrides if entity is not under group. - - This is wrapper method that handles on_change callbacks only when all - `_remove_from_project_override` on all children happened. That is - important as value changes may trigger change callbacks that must be - ignored. Callbacks are triggered by entity where method was called. - - Args: - on_change_trigger (list): Callbacks of `on_change` should be stored - to trigger them afterwards. - """ - if self._override_state is not OverrideState.PROJECT: - return - - initialized = False - if on_change_trigger is None: - if not self.can_trigger_remove_from_project_override: - return - initialized = True - on_change_trigger = [] - - self._remove_from_project_override(on_change_trigger) - - if initialized: - for callback in on_change_trigger: - callback() - - @abstractmethod - def _remove_from_project_override(self, on_change_trigger): - """Item's implementation to remove project overrides. - - Mark item as does not have project overrides. Must not change - `was_overridden` attribute value. - - Args: - on_change_trigger (list): Callbacks of `on_change` should be stored - to trigger them afterwards. - """ - pass - - def reset_callbacks(self): - """Clear any registered callbacks on entity and all children.""" - self.on_change_callbacks = [] - - -class ItemEntity(BaseItemEntity): - """Item that is used as hierarchical entity. - - Entity must have defined parent and can't be created outside it's parent. - - Dynamically created entity is entity that can be removed from settings - hierarchy and it's key or existence is not defined in schemas. Are - created by `ListEntity` or `DictMutableKeysEntity`. Their information about - default value or modification is not relevant. - - Args: - schema_data (dict): Schema data that defines entity behavior. - parent (BaseItemEntity): Parent entity that created this entity. - is_dynamic_item (bool): Entity should behave like dynamically created - entity. - """ - _default_label_wrap = { - "use_label_wrap": False, - "collapsible": True, - "collapsed": False - } - - def __init__(self, schema_data, parent, is_dynamic_item=False): - super(ItemEntity, self).__init__(schema_data) - - self.parent = parent - self.is_dynamic_item = is_dynamic_item - - self.is_file = self.schema_data.get("is_file", False) - # These keys have underscore as they must not be set in schemas - self.dynamic_schema_id = self.schema_data.get( - "_dynamic_schema_id", None - ) - self.is_dynamic_schema_node = self.dynamic_schema_id is not None - - self.is_group = self.schema_data.get("is_group", False) - self.is_in_dynamic_item = bool( - not self.is_dynamic_item - and (self.parent.is_dynamic_item or self.parent.is_in_dynamic_item) - ) - - # Dynamic item can't have key defined in it-self - # - key is defined by it's parent - if self.is_dynamic_item: - self.require_key = False - - # Root item reference - self.root_item = self.parent.root_item - - # Item require restart on value change - require_restart_on_change = self.schema_data.get("require_restart") - if ( - require_restart_on_change is None - and not (self.is_dynamic_item or self.is_in_dynamic_item) - ): - require_restart_on_change = self.parent.require_restart_on_change - self._require_restart_on_change = require_restart_on_change - - # File item reference - if not self.is_dynamic_schema_node: - self.is_in_dynamic_schema_node = ( - self.parent.is_dynamic_schema_node - or self.parent.is_in_dynamic_schema_node - ) - - if ( - not self.is_dynamic_schema_node - and not self.is_in_dynamic_schema_node - ): - if self.parent.is_file: - self.file_item = self.parent - elif self.parent.file_item: - self.file_item = self.parent.file_item - - # Group item reference - if self.parent.is_group: - self.group_item = self.parent - - elif self.parent.group_item is not None: - self.group_item = self.parent.group_item - - self.key = self.schema_data.get("key") - self.label = self.schema_data.get("label") - - # GUI attributes - _default_label_wrap = self.__class__._default_label_wrap - for key, value in ItemEntity._default_label_wrap.items(): - if key not in _default_label_wrap: - self.log.warning( - "Class {} miss default label wrap key \"{}\"".format( - self.__class__.__name__, key - ) - ) - _default_label_wrap[key] = value - - use_label_wrap = self.schema_data.get("use_label_wrap") - if use_label_wrap is None: - if not self.label: - use_label_wrap = False - else: - use_label_wrap = _default_label_wrap["use_label_wrap"] - self.use_label_wrap = use_label_wrap - - # Used only if `use_label_wrap` is set to True - self.collapsible = self.schema_data.get( - "collapsible", - _default_label_wrap["collapsible"] - ) - self.collapsed = self.schema_data.get( - "collapsed", - _default_label_wrap["collapsed"] - ) - - self._item_initialization() - - def save(self): - """Call save on root item.""" - self.root_item.save() - - @property - def root_key(self): - return self.root_item.root_key - - @abstractmethod - def collect_dynamic_schema_entities(self, collector): - """Collect entities that are on top of dynamically added schemas. - - This method make sence only when defaults are saved. - - Args: - collector(DynamicSchemaValueCollector): Object where dynamic - entities are stored. - """ - pass - - def schema_validations(self): - if not self.label and self.use_label_wrap: - reason = ( - "Entity has set `use_label_wrap` to true but" - " does not have set `label`." - ) - raise EntitySchemaError(self, reason) - - if ( - not self.is_dynamic_schema_node - and not self.is_in_dynamic_schema_node - and self.is_file - and self.file_item is not None - ): - reason = ( - "Entity has set `is_file` to true but" - " it's parent is already marked as file item." - ) - raise EntitySchemaError(self, reason) - - super(ItemEntity, self).schema_validations() - - def create_schema_object(self, *args, **kwargs): - """Reference method for creation of entities defined in RootEntity.""" - return self.schema_hub.create_schema_object(*args, **kwargs) - - @property - def schema_hub(self): - return self.root_item.schema_hub - - def get_entity_from_path(self, path): - return self.root_item.get_entity_from_path(path) - - @abstractmethod - def update_default_value(self, parent_values, log_invalid_types=True): - """Fill default values on startup or on refresh. - - Default values stored in `openpype` repository should update all items - in schema. Each item should take values for his key and set it's value - or pass values down to children items. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - log_invalid_types (bool): Log invalid type of value. Used when - entity can have children with same keys and different types. - """ - pass - - @abstractmethod - def update_studio_value(self, parent_values, log_invalid_types=True): - """Fill studio override values on startup or on refresh. - - Set studio value if is not set to NOT_SET, in that case studio - overrides are not set yet. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - log_invalid_types (bool): Log invalid type of value. Used when - entity can have children with same keys and different types. - """ - pass - - @abstractmethod - def update_project_value(self, parent_values, log_invalid_types=True): - """Fill project override values on startup, refresh or project change. - - Set project value if is not set to NOT_SET, in that case project - overrides are not set yet. - - Args: - parent_values (dict): Values of parent's item. But in case item is - used as widget, `parent_values` contain value for item. - log_invalid_types (bool): Log invalid type of value. Used when - entity can have children with same keys and different types. - """ - pass diff --git a/client/ayon_core/settings/entities/color_entity.py b/client/ayon_core/settings/entities/color_entity.py deleted file mode 100644 index f838a6b0ad..0000000000 --- a/client/ayon_core/settings/entities/color_entity.py +++ /dev/null @@ -1,71 +0,0 @@ -from .lib import STRING_TYPE -from .input_entities import InputEntity -from .exceptions import ( - BaseInvalidValue, - InvalidValueType -) - - -class ColorEntity(InputEntity): - schema_types = ["color"] - - def _item_initialization(self): - self.valid_value_types = (list, ) - self.use_alpha = self.schema_data.get("use_alpha", True) - self.value_on_not_set = self.convert_to_valid_type( - self.schema_data.get("default", [0, 0, 0, 255]) - ) - - def set_override_state(self, *args, **kwargs): - super(ColorEntity, self).set_override_state(*args, **kwargs) - value = self._current_value - if ( - not self.use_alpha - and isinstance(value, list) - and len(value) == 4 - ): - value[3] = 255 - - def convert_to_valid_type(self, value): - """Conversion to valid type. - - Complexity of entity requires to override BaseEntity implementation. - """ - # Convertion to valid value type `list` - if isinstance(value, (set, tuple)): - value = list(value) - - # Skip other validations if is not `list` - if not isinstance(value, list): - raise InvalidValueType( - self.valid_value_types, type(value), self.path - ) - - # Allow list of len 3 (last aplha is set to max) - if len(value) == 3: - value.append(255) - - if len(value) != 4: - reason = "Color entity expect 4 items in list got {}".format( - len(value) - ) - raise BaseInvalidValue(reason, self.path) - - new_value = [] - for item in value: - if not isinstance(item, int): - if isinstance(item, (STRING_TYPE, float)): - item = int(item) - - is_valid = isinstance(item, int) and -1 < item < 256 - if not is_valid: - reason = ( - "Color entity expect 4 integers in range 0-255 got {}" - ).format(value) - raise BaseInvalidValue(reason, self.path) - new_value.append(item) - - # Make sure - if not self.use_alpha: - new_value[3] = 255 - return new_value diff --git a/client/ayon_core/settings/entities/dict_conditional.py b/client/ayon_core/settings/entities/dict_conditional.py deleted file mode 100644 index 5891056559..0000000000 --- a/client/ayon_core/settings/entities/dict_conditional.py +++ /dev/null @@ -1,819 +0,0 @@ -import copy - -from .lib import ( - OverrideState, - NOT_SET -) -from ayon_core.settings.constants import ( - METADATA_KEYS, - M_OVERRIDDEN_KEY, - KEY_REGEX -) -from . import ( - BaseItemEntity, - ItemEntity, - GUIEntity -) -from .exceptions import ( - SchemaDuplicatedKeys, - EntitySchemaError, - InvalidKeySymbols -) - - -class DictConditionalEntity(ItemEntity): - """Entity represents dictionay with only one persistent key definition. - - The persistent key is enumerator which define rest of children under - dictionary. There is not possibility of shared children. - - Entity's keys can't be removed or added. But they may change based on - the persistent key. If you're change value manually (key by key) make sure - you'll change value of the persistent key as first. It is recommended to - use `set` method which handle this for you. - - It is possible to use entity similar way as `dict` object. Returned values - are not real settings values but entities representing the value. - """ - schema_types = ["dict-conditional"] - _default_label_wrap = { - "use_label_wrap": False, - "collapsible": False, - "collapsed": True - } - - def __getitem__(self, key): - """Return entity inder key.""" - if key == self.enum_key: - return self.enum_entity - return self.non_gui_children[self.current_enum][key] - - def __setitem__(self, key, value): - """Set value of item under key.""" - if key == self.enum_key: - child_obj = self.enum_entity - else: - child_obj = self.non_gui_children[self.current_enum][key] - child_obj.set(value) - - def __iter__(self): - """Iter through keys.""" - for key in self.keys(): - yield key - - def __contains__(self, key): - """Check if key is available.""" - if key == self.enum_key: - return True - return key in self.non_gui_children[self.current_enum] - - def get(self, key, default=None): - """Safe entity getter by key.""" - if key == self.enum_key: - return self.enum_entity - return self.non_gui_children[self.current_enum].get(key, default) - - def keys(self): - """Entity's keys.""" - keys = list(self.non_gui_children[self.current_enum].keys()) - keys.insert(0, [self.enum_key]) - return keys - - def values(self): - """Children entities.""" - values = [ - self.enum_entity - ] - for child_entiy in self.non_gui_children[self.current_enum].values(): - values.append(child_entiy) - return values - - def items(self): - """Children entities paired with their key (key, value).""" - items = [ - (self.enum_key, self.enum_entity) - ] - for key, value in self.non_gui_children[self.current_enum].items(): - items.append((key, value)) - return items - - def set(self, value): - """Set value.""" - new_value = self.convert_to_valid_type(value) - # First change value of enum key if available - if self.enum_key in new_value: - self.enum_entity.set(new_value.pop(self.enum_key)) - - for _key, _value in new_value.items(): - self.non_gui_children[self.current_enum][_key].set(_value) - - def has_child_with_key(self, key): - return key in self.keys() - - def _item_initialization(self): - self._default_metadata = NOT_SET - self._studio_override_metadata = NOT_SET - self._project_override_metadata = NOT_SET - - self._ignore_child_changes = False - - # `current_metadata` are still when schema is loaded - # - only metadata stored with dict item are gorup overrides in - # M_OVERRIDDEN_KEY - self._current_metadata = {} - self._metadata_are_modified = False - - # Entity must be group or in group - if ( - self.group_item is None - and not self.is_dynamic_item - and not self.is_in_dynamic_item - ): - self.is_group = True - - # Children are stored by key as keys are immutable and are defined by - # schema - self.valid_value_types = (dict, ) - self.children = {} - self.non_gui_children = {} - self.gui_layout = {} - - if self.is_dynamic_item: - self.require_key = False - - self.enum_key = self.schema_data.get("enum_key") - self.enum_label = self.schema_data.get("enum_label") - self.enum_children = self.schema_data.get("enum_children") - self.enum_default = self.schema_data.get("enum_default") - - self.enum_entity = None - - # GUI attributes - self.enum_is_horizontal = self.schema_data.get( - "enum_is_horizontal", False - ) - # `enum_on_right` can be used only if - self.enum_on_right = self.schema_data.get("enum_on_right", False) - - self.highlight_content = self.schema_data.get( - "highlight_content", False - ) - self.show_borders = self.schema_data.get("show_borders", True) - - self._add_children() - - @property - def current_enum(self): - """Current value of enum entity. - - This value define what children are used. - """ - if self.enum_entity is None: - return None - return self.enum_entity.value - - def schema_validations(self): - """Validation of schema data.""" - # Enum key must be defined - if self.enum_key is None: - raise EntitySchemaError(self, "Key 'enum_key' is not set.") - - # Validate type of enum children - if not isinstance(self.enum_children, list): - raise EntitySchemaError( - self, "Key 'enum_children' must be a list. Got: {}".format( - str(type(self.enum_children)) - ) - ) - - # Without defined enum children entity has nothing to do - if not self.enum_children: - raise EntitySchemaError(self, ( - "Key 'enum_children' have empty value. Entity can't work" - " without children definitions." - )) - - children_def_keys = [] - for children_def in self.enum_children: - if not isinstance(children_def, dict): - raise EntitySchemaError(self, ( - "Children definition under key 'enum_children' must" - " be a dictionary." - )) - - if "key" not in children_def: - raise EntitySchemaError(self, ( - "Children definition under key 'enum_children' miss" - " 'key' definition." - )) - # We don't validate regex of these keys because they will be stored - # as value at the end. - key = children_def["key"] - if key in children_def_keys: - # TODO this hould probably be different exception? - raise SchemaDuplicatedKeys(self, key) - children_def_keys.append(key) - - # Validate key duplications per each enum item - for children in self.children.values(): - children_keys = set() - children_keys.add(self.enum_key) - for child_entity in children: - if not isinstance(child_entity, BaseItemEntity): - continue - elif child_entity.key not in children_keys: - children_keys.add(child_entity.key) - else: - raise SchemaDuplicatedKeys(self, child_entity.key) - - # Enum key must match key regex - if not KEY_REGEX.match(self.enum_key): - raise InvalidKeySymbols(self.path, self.enum_key) - - # Validate all remaining keys with key regex - for children_by_key in self.non_gui_children.values(): - for key in children_by_key.keys(): - if not KEY_REGEX.match(key): - raise InvalidKeySymbols(self.path, key) - - super(DictConditionalEntity, self).schema_validations() - # Trigger schema validation on children entities - for children in self.children.values(): - for child_obj in children: - child_obj.schema_validations() - - def on_change(self): - """Update metadata on change and pass change to parent.""" - self._update_current_metadata() - - for callback in self.on_change_callbacks: - callback() - self.parent.on_child_change(self) - - def on_child_change(self, child_obj): - """Trigger on change callback if child changes are not ignored.""" - if self._ignore_child_changes: - return - - if ( - child_obj is self.enum_entity - or child_obj in self.children[self.current_enum] - ): - self.on_change() - - def _add_children(self): - """Add children from schema data and repare enum items. - - Each enum item must have defined it's children. None are shared across - all enum items. - - Nice to have: Have ability to have shared keys across all enum items. - - All children are stored by their enum item. - """ - # Skip if are not defined - # - schema validations should raise and exception - if not self.enum_children or not self.enum_key: - return - - valid_enum_items = [] - for item in self.enum_children: - if isinstance(item, dict) and "key" in item: - valid_enum_items.append(item) - - enum_keys = [] - enum_items = [] - for item in valid_enum_items: - item_key = item["key"] - enum_keys.append(item_key) - item_label = item.get("label") or item_key - enum_items.append({item_key: item_label}) - - if not enum_items: - return - - if self.enum_default in enum_keys: - default_key = self.enum_default - else: - default_key = enum_keys[0] - - # Create Enum child first - enum_key = self.enum_key or "invalid" - enum_schema = { - "type": "enum", - "multiselection": False, - "enum_items": enum_items, - "key": enum_key, - "label": self.enum_label, - "default": default_key - } - - enum_entity = self.create_schema_object(enum_schema, self) - self.enum_entity = enum_entity - - # Create children per each enum item - for item in valid_enum_items: - item_key = item["key"] - # Make sure all keys have set value in these variables - # - key 'children' is optional - self.non_gui_children[item_key] = {} - self.children[item_key] = [] - self.gui_layout[item_key] = [] - - children = item.get("children") or [] - for children_schema in children: - child_obj = self.create_schema_object(children_schema, self) - self.children[item_key].append(child_obj) - self.gui_layout[item_key].append(child_obj) - if isinstance(child_obj, GUIEntity): - continue - - self.non_gui_children[item_key][child_obj.key] = child_obj - - def collect_static_entities_by_path(self): - if self.is_dynamic_item or self.is_in_dynamic_item: - return {} - return {self.path: self} - - def get_child_path(self, child_obj): - """Get hierarchical path of child entity. - - Child must be entity's direct children. This must be possible to get - for any children even if not from current enum value. - """ - if child_obj is self.enum_entity: - return "/".join([self.path, self.enum_key]) - - result_key = None - for children in self.non_gui_children.values(): - for key, _child_obj in children.items(): - if _child_obj is child_obj: - result_key = key - break - - if result_key is None: - raise ValueError("Didn't find child {}".format(child_obj)) - - return "/".join([self.path, result_key]) - - def _update_current_metadata(self): - current_metadata = {} - for key, child_obj in self.non_gui_children[self.current_enum].items(): - if self._override_state is OverrideState.DEFAULTS: - break - - if not child_obj.is_group: - continue - - if ( - self._override_state is OverrideState.STUDIO - and not child_obj.has_studio_override - ): - continue - - if ( - self._override_state is OverrideState.PROJECT - and not child_obj.has_project_override - ): - continue - - if M_OVERRIDDEN_KEY not in current_metadata: - current_metadata[M_OVERRIDDEN_KEY] = [] - current_metadata[M_OVERRIDDEN_KEY].append(key) - - # Define if current metadata are avaialble for current override state - metadata = NOT_SET - if self._override_state is OverrideState.STUDIO: - metadata = self._studio_override_metadata - - elif self._override_state is OverrideState.PROJECT: - metadata = self._project_override_metadata - - if metadata is NOT_SET: - metadata = {} - - self._metadata_are_modified = current_metadata != metadata - self._current_metadata = current_metadata - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - # Change has/had override states - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - - # Set override state on enum entity first - self.enum_entity.set_override_state(state, ignore_missing_defaults) - - # Set override state on other enum children - # - these must not raise exception about missing defaults - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.set_override_state(state, True) - - self._update_current_metadata() - - @property - def value(self): - output = { - self.enum_key: self.enum_entity.value - } - for key, child_obj in self.non_gui_children[self.current_enum].items(): - output[key] = child_obj.value - return output - - @property - def has_unsaved_changes(self): - if self._metadata_are_modified: - return True - - return self._child_has_unsaved_changes - - @property - def _child_has_unsaved_changes(self): - if self.enum_entity.has_unsaved_changes: - return True - - for child_obj in self.non_gui_children[self.current_enum].values(): - if child_obj.has_unsaved_changes: - return True - return False - - @property - def has_studio_override(self): - return self._child_has_studio_override - - @property - def _child_has_studio_override(self): - if self._override_state >= OverrideState.STUDIO: - if self.enum_entity.has_studio_override: - return True - - for child_obj in self.non_gui_children[self.current_enum].values(): - if child_obj.has_studio_override: - return True - return False - - @property - def has_project_override(self): - return self._child_has_project_override - - @property - def _child_has_project_override(self): - if self._override_state >= OverrideState.PROJECT: - if self.enum_entity.has_project_override: - return True - - for child_obj in self.non_gui_children[self.current_enum].values(): - if child_obj.has_project_override: - return True - return False - - def collect_dynamic_schema_entities(self, collector): - if self.is_dynamic_schema_node: - collector.add_entity(self) - - def settings_value(self): - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if self._override_state is OverrideState.DEFAULTS: - children_items = [ - (self.enum_key, self.enum_entity) - ] - for item in self.non_gui_children[self.current_enum].items(): - children_items.append(item) - - output = {} - for key, child_obj in children_items: - output[key] = child_obj.settings_value() - return output - - if self.is_group: - if self._override_state is OverrideState.STUDIO: - if not self.has_studio_override: - return NOT_SET - elif self._override_state is OverrideState.PROJECT: - if not self.has_project_override: - return NOT_SET - - output = {} - children_items = [ - (self.enum_key, self.enum_entity) - ] - for item in self.non_gui_children[self.current_enum].items(): - children_items.append(item) - - for key, child_obj in children_items: - value = child_obj.settings_value() - if value is not NOT_SET: - output[key] = value - - if not output: - return NOT_SET - - output.update(self._current_metadata) - return output - - def _prepare_value(self, value, log_invalid_types): - if value is NOT_SET or self.enum_key not in value: - return NOT_SET, NOT_SET - - enum_value = value.get(self.enum_key) - if enum_value not in self.non_gui_children: - if log_invalid_types: - self.log.warning( - "{} Unknown enum key in default values: {}".format( - self.path, enum_value - ) - ) - return NOT_SET, NOT_SET - - # Create copy of value before poping values - value = copy.deepcopy(value) - metadata = {} - for key in METADATA_KEYS: - if key in value: - metadata[key] = value.pop(key) - - enum_value = value.get(self.enum_key) - - old_metadata = metadata.get(M_OVERRIDDEN_KEY) - if old_metadata: - old_metadata_set = set(old_metadata) - new_metadata = [] - non_gui_children = self.non_gui_children[enum_value] - for key in non_gui_children.keys(): - if key in old_metadata: - new_metadata.append(key) - old_metadata_set.remove(key) - - for key in old_metadata_set: - new_metadata.append(key) - metadata[M_OVERRIDDEN_KEY] = new_metadata - - return value, metadata - - def update_default_value(self, value, log_invalid_types=True): - """Update default values. - - Not an api method, should be called by parent. - """ - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - self.has_default_value = value is not NOT_SET - # TODO add value validation - value, metadata = self._prepare_value(value, log_invalid_types) - self._default_metadata = metadata - - if value is NOT_SET: - self.enum_entity.update_default_value(value, log_invalid_types) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.update_default_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - enum_value = value[self.enum_key] - expected_keys = set(self.non_gui_children[enum_value].keys()) - expected_keys.add(self.enum_key) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in default values: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - - self.enum_entity.update_default_value(enum_value, log_invalid_types) - - for enum_key, children_by_key in self.non_gui_children.items(): - _log_invalid_types = log_invalid_types - if _log_invalid_types: - _log_invalid_types = enum_key == enum_value - - value_copy = copy.deepcopy(value) - for key, child_obj in children_by_key.items(): - child_value = value_copy.get(key, NOT_SET) - child_obj.update_default_value(child_value, _log_invalid_types) - - def update_studio_value(self, value, log_invalid_types=True): - """Update studio override values. - - Not an api method, should be called by parent. - """ - - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - value, metadata = self._prepare_value(value, log_invalid_types) - self._studio_override_metadata = metadata - self.had_studio_override = metadata is not NOT_SET - - if value is NOT_SET: - self.enum_entity.update_studio_value(value, log_invalid_types) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.update_studio_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - enum_value = value[self.enum_key] - expected_keys = set(self.non_gui_children[enum_value]) - expected_keys.add(self.enum_key) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in studio overrides: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - - self.enum_entity.update_studio_value(enum_value, log_invalid_types) - for enum_key, children_by_key in self.non_gui_children.items(): - _log_invalid_types = log_invalid_types - if _log_invalid_types: - _log_invalid_types = enum_key == enum_value - - value_copy = copy.deepcopy(value) - for key, child_obj in children_by_key.items(): - child_value = value_copy.get(key, NOT_SET) - child_obj.update_studio_value(child_value, _log_invalid_types) - - def update_project_value(self, value, log_invalid_types=True): - """Update project override values. - - Not an api method, should be called by parent. - """ - - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - value, metadata = self._prepare_value(value, log_invalid_types) - self._project_override_metadata = metadata - self.had_project_override = metadata is not NOT_SET - - if value is NOT_SET: - self.enum_entity.update_project_value(value, log_invalid_types) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.update_project_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - enum_value = value[self.enum_key] - expected_keys = set(self.non_gui_children[enum_value]) - expected_keys.add(self.enum_key) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in project overrides: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - - self.enum_entity.update_project_value(enum_value, log_invalid_types) - for enum_key, children_by_key in self.non_gui_children.items(): - _log_invalid_types = log_invalid_types - if _log_invalid_types: - _log_invalid_types = enum_key == enum_value - - value_copy = copy.deepcopy(value) - for key, child_obj in children_by_key.items(): - child_value = value_copy.get(key, NOT_SET) - child_obj.update_project_value(child_value, _log_invalid_types) - - def _discard_changes(self, on_change_trigger): - self._ignore_child_changes = True - - self.enum_entity.discard_changes(on_change_trigger) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.discard_changes(on_change_trigger) - - self._ignore_child_changes = False - - def _add_to_studio_default(self, on_change_trigger): - self._ignore_child_changes = True - - self.enum_entity.add_to_studio_default(on_change_trigger) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.add_to_studio_default(on_change_trigger) - - self._ignore_child_changes = False - - self._update_current_metadata() - - self.parent.on_child_change(self) - - def _remove_from_studio_default(self, on_change_trigger): - self._ignore_child_changes = True - - self.enum_entity.remove_from_studio_default(on_change_trigger) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.remove_from_studio_default(on_change_trigger) - - self._ignore_child_changes = False - - def _add_to_project_override(self, on_change_trigger): - self._ignore_child_changes = True - - self.enum_entity.add_to_project_override(on_change_trigger) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.add_to_project_override(on_change_trigger) - - self._ignore_child_changes = False - - self._update_current_metadata() - - self.parent.on_child_change(self) - - def _remove_from_project_override(self, on_change_trigger): - if self._override_state is not OverrideState.PROJECT: - return - - self._ignore_child_changes = True - - self.enum_entity.remove_from_project_override(on_change_trigger) - for children_by_key in self.non_gui_children.values(): - for child_obj in children_by_key.values(): - child_obj.remove_from_project_override(on_change_trigger) - - self._ignore_child_changes = False - - def reset_callbacks(self): - """Reset registered callbacks on entity and children.""" - super(DictConditionalEntity, self).reset_callbacks() - for children in self.children.values(): - for child_entity in children: - child_entity.reset_callbacks() - - -class SyncServerProviders(DictConditionalEntity): - schema_types = ["sync-server-providers"] - - def _add_children(self): - self.enum_key = "provider" - self.enum_label = "Provider" - - enum_children = self._get_enum_children() - if not enum_children: - enum_children.append({ - "key": None, - "label": "< Nothing >" - }) - self.enum_children = enum_children - - super(SyncServerProviders, self)._add_children() - - def _get_enum_children(self): - from openpype_modules import sync_server - - from openpype_modules.sync_server.providers import lib as lib_providers - - provider_code_to_label = {} - providers = lib_providers.factory.providers - for provider_code, provider_info in providers.items(): - provider, _ = provider_info - provider_code_to_label[provider_code] = provider.LABEL - - system_settings_schema = ( - sync_server - .SyncServerModule - .get_system_settings_schema() - ) - - enum_children = [] - for provider_code, configurables in system_settings_schema.items(): - # any site could be exposed or vendorized by different site - # eg studio site content could be mapped on sftp site, single file - # accessible via 2 different protocols (sites) - configurables.append( - { - "type": "list", - "key": "alternative_sites", - "label": "Alternative sites", - "object_type": "text" - } - ) - label = provider_code_to_label.get(provider_code) or provider_code - - enum_children.append({ - "key": provider_code, - "label": label, - "children": configurables - }) - return enum_children diff --git a/client/ayon_core/settings/entities/dict_immutable_keys_entity.py b/client/ayon_core/settings/entities/dict_immutable_keys_entity.py deleted file mode 100644 index b81c239ed4..0000000000 --- a/client/ayon_core/settings/entities/dict_immutable_keys_entity.py +++ /dev/null @@ -1,958 +0,0 @@ -import copy -import collections - -from .lib import ( - WRAPPER_TYPES, - OverrideState, - NOT_SET, - STRING_TYPE -) -from ayon_core.settings.constants import ( - METADATA_KEYS, - M_OVERRIDDEN_KEY, - KEY_REGEX -) -from . import ( - BaseItemEntity, - ItemEntity, - BoolEntity, - GUIEntity -) -from .exceptions import ( - DefaultsNotDefined, - SchemaDuplicatedKeys, - EntitySchemaError, - InvalidKeySymbols -) - - -class DictImmutableKeysEntity(ItemEntity): - """Entity that represents dictionary with predefined keys. - - Entity's keys can't be removed or added and children type is defined in - schema data. - - It is possible to use entity similar way as `dict` object. Returned values - are not real settings values but entities representing the value. - """ - schema_types = ["dict"] - _default_label_wrap = { - "use_label_wrap": True, - "collapsible": True, - "collapsed": True - } - - def __getitem__(self, key): - """Return entity inder key.""" - return self.non_gui_children[key] - - def __setitem__(self, key, value): - """Set value of item under key.""" - child_obj = self.non_gui_children[key] - child_obj.set(value) - - def __iter__(self): - """Iter through keys.""" - for key in self.keys(): - yield key - - def __contains__(self, key): - """Check if key is available.""" - return key in self.non_gui_children - - def get(self, key, default=None): - """Safe entity getter by key.""" - return self.non_gui_children.get(key, default) - - def keys(self): - """Entity's keys.""" - return self.non_gui_children.keys() - - def values(self): - """Children entities.""" - return self.non_gui_children.values() - - def items(self): - """Children entities paired with their key (key, value).""" - return self.non_gui_children.items() - - def set(self, value): - """Set value.""" - new_value = self.convert_to_valid_type(value) - for _key, _value in new_value.items(): - self.non_gui_children[_key].set(_value) - - def schema_validations(self): - """Validation of schema data.""" - children_keys = set() - for child_entity in self.children: - if not isinstance(child_entity, BaseItemEntity): - continue - elif child_entity.key not in children_keys: - children_keys.add(child_entity.key) - else: - raise SchemaDuplicatedKeys(self, child_entity.key) - - for key in self.keys(): - if not KEY_REGEX.match(key): - raise InvalidKeySymbols(self.path, key) - - if self.checkbox_key: - checkbox_child = self.non_gui_children.get(self.checkbox_key) - if not checkbox_child: - reason = "Checkbox children \"{}\" was not found.".format( - self.checkbox_key - ) - raise EntitySchemaError(self, reason) - - if not isinstance(checkbox_child, BoolEntity): - reason = ( - "Checkbox children \"{}\" is not `boolean` type." - ).format(self.checkbox_key) - raise EntitySchemaError(self, reason) - - super(DictImmutableKeysEntity, self).schema_validations() - # Trigger schema validation on children entities - for child_obj in self.children: - child_obj.schema_validations() - - def on_change(self): - """Update metadata on change and pass change to parent.""" - self._update_current_metadata() - - for callback in self.on_change_callbacks: - callback() - self.parent.on_child_change(self) - - def on_child_change(self, _child_obj): - """Trigger on change callback if child changes are not ignored.""" - if not self._ignore_child_changes: - self.on_change() - - def _add_children(self, schema_data, first=True): - """Add children from schema data and separate gui wrappers. - - Wrappers are stored in way so tool can create them and keep relation - to entities. - - Args: - schema_data (dict): Schema data of an entity. - first (bool): Helper to know if was method called from inside of - method when handling gui wrappers. - """ - added_children = [] - children_deque = collections.deque() - for _children_schema in schema_data["children"]: - children_schemas = self.schema_hub.resolve_schema_data( - _children_schema - ) - for children_schema in children_schemas: - children_deque.append(children_schema) - - while children_deque: - children_schema = children_deque.popleft() - if children_schema["type"] in WRAPPER_TYPES: - _children_schema = copy.deepcopy(children_schema) - wrapper_children = self._add_children( - children_schema, False - ) - _children_schema["children"] = wrapper_children - added_children.append(_children_schema) - continue - - child_obj = self.create_schema_object(children_schema, self) - self.children.append(child_obj) - added_children.append(child_obj) - if isinstance(child_obj, GUIEntity): - continue - - self.non_gui_children[child_obj.key] = child_obj - - if not first: - return added_children - - for child_obj in added_children: - self.gui_layout.append(child_obj) - - def _item_initialization(self): - self._default_metadata = NOT_SET - self._studio_override_metadata = NOT_SET - self._project_override_metadata = NOT_SET - - self._ignore_child_changes = False - - # `current_metadata` are still when schema is loaded - # - only metadata stored with dict item are gorup overrides in - # M_OVERRIDDEN_KEY - self._current_metadata = {} - self._metadata_are_modified = False - - # Children are stored by key as keys are immutable and are defined by - # schema - self.valid_value_types = (dict, ) - self.children = [] - self.non_gui_children = {} - self.gui_layout = [] - self._add_children(self.schema_data) - - if self.is_dynamic_item: - self.require_key = False - - # GUI attributes - self.checkbox_key = self.schema_data.get("checkbox_key") - self.highlight_content = self.schema_data.get( - "highlight_content", False - ) - self.show_borders = self.schema_data.get("show_borders", True) - - def has_child_with_key(self, key): - return key in self.non_gui_children - - def collect_static_entities_by_path(self): - output = {} - if self.is_dynamic_item or self.is_in_dynamic_item: - return output - - output[self.path] = self - for children in self.non_gui_children.values(): - result = children.collect_static_entities_by_path() - if result: - output.update(result) - return output - - def get_child_path(self, child_obj): - """Get hierarchical path of child entity. - - Child must be entity's direct children. - """ - result_key = None - for key, _child_obj in self.non_gui_children.items(): - if _child_obj is child_obj: - result_key = key - break - - if result_key is None: - raise ValueError("Didn't find child {}".format(child_obj)) - - return "/".join([self.path, result_key]) - - def _update_current_metadata(self): - current_metadata = {} - for key, child_obj in self.non_gui_children.items(): - if self._override_state is OverrideState.DEFAULTS: - break - - if not child_obj.is_group: - continue - - if ( - self._override_state is OverrideState.STUDIO - and not child_obj.has_studio_override - ): - continue - - if ( - self._override_state is OverrideState.PROJECT - and not child_obj.has_project_override - ): - continue - - if M_OVERRIDDEN_KEY not in current_metadata: - current_metadata[M_OVERRIDDEN_KEY] = [] - current_metadata[M_OVERRIDDEN_KEY].append(key) - - # Define if current metadata are avaialble for current override state - metadata = NOT_SET - if self._override_state is OverrideState.STUDIO: - metadata = self._studio_override_metadata - - elif self._override_state is OverrideState.PROJECT: - metadata = self._project_override_metadata - - if metadata is NOT_SET: - metadata = {} - - self._metadata_are_modified = current_metadata != metadata - self._current_metadata = current_metadata - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - # Change has/had override states - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - - for child_obj in self.non_gui_children.values(): - child_obj.set_override_state(state, ignore_missing_defaults) - - self._update_current_metadata() - - @property - def value(self): - output = {} - for key, child_obj in self.non_gui_children.items(): - output[key] = child_obj.value - return output - - @property - def has_unsaved_changes(self): - if self._metadata_are_modified: - return True - - return self._child_has_unsaved_changes - - @property - def _child_has_unsaved_changes(self): - for child_obj in self.non_gui_children.values(): - if child_obj.has_unsaved_changes: - return True - return False - - @property - def has_studio_override(self): - return self._child_has_studio_override - - @property - def _child_has_studio_override(self): - if self._override_state >= OverrideState.STUDIO: - for child_obj in self.non_gui_children.values(): - if child_obj.has_studio_override: - return True - return False - - @property - def has_project_override(self): - return self._child_has_project_override - - @property - def _child_has_project_override(self): - if self._override_state >= OverrideState.PROJECT: - for child_obj in self.non_gui_children.values(): - if child_obj.has_project_override: - return True - return False - - def collect_dynamic_schema_entities(self, collector): - for child_obj in self.non_gui_children.values(): - child_obj.collect_dynamic_schema_entities(collector) - - if self.is_dynamic_schema_node: - collector.add_entity(self) - - def settings_value(self): - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if self._override_state is OverrideState.DEFAULTS: - is_dynamic_schema_node = ( - self.is_dynamic_schema_node or self.is_in_dynamic_schema_node - ) - output = {} - for key, child_obj in self.non_gui_children.items(): - if child_obj.is_dynamic_schema_node: - continue - - child_value = child_obj.settings_value() - if ( - not is_dynamic_schema_node - and not child_obj.is_file - and not child_obj.file_item - ): - for _key, _value in child_value.items(): - new_key = "/".join([key, _key]) - output[new_key] = _value - else: - output[key] = child_value - return output - - if self.is_group: - if self._override_state is OverrideState.STUDIO: - if not self.has_studio_override: - return NOT_SET - elif self._override_state is OverrideState.PROJECT: - if not self.has_project_override: - return NOT_SET - - output = {} - for key, child_obj in self.non_gui_children.items(): - value = child_obj.settings_value() - if value is not NOT_SET: - output[key] = value - - if not output: - return NOT_SET - - output.update(self._current_metadata) - return output - - def _prepare_value(self, value): - if value is NOT_SET: - return NOT_SET, NOT_SET - - # Create copy of value before poping values - value = copy.deepcopy(value) - metadata = {} - for key in METADATA_KEYS: - if key in value: - metadata[key] = value.pop(key) - - old_metadata = metadata.get(M_OVERRIDDEN_KEY) - if old_metadata: - old_metadata_set = set(old_metadata) - new_metadata = [] - for key in self.non_gui_children.keys(): - if key in old_metadata: - new_metadata.append(key) - old_metadata_set.remove(key) - - for key in old_metadata_set: - new_metadata.append(key) - metadata[M_OVERRIDDEN_KEY] = new_metadata - - return value, metadata - - def update_default_value(self, value, log_invalid_types=True): - """Update default values. - - Not an api method, should be called by parent. - """ - - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - self.has_default_value = value is not NOT_SET - # TODO add value validation - value, metadata = self._prepare_value(value) - self._default_metadata = metadata - - if value is NOT_SET: - for child_obj in self.non_gui_children.values(): - child_obj.update_default_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - expected_keys = set(self.non_gui_children) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in default values: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - - for key, child_obj in self.non_gui_children.items(): - child_value = value.get(key, NOT_SET) - child_obj.update_default_value(child_value, log_invalid_types) - - def update_studio_value(self, value, log_invalid_types=True): - """Update studio override values. - - Not an api method, should be called by parent. - """ - - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - value, metadata = self._prepare_value(value) - self._studio_override_metadata = metadata - self.had_studio_override = metadata is not NOT_SET - - if value is NOT_SET: - for child_obj in self.non_gui_children.values(): - child_obj.update_studio_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - expected_keys = set(self.non_gui_children) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in studio overrides: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - for key, child_obj in self.non_gui_children.items(): - child_value = value.get(key, NOT_SET) - child_obj.update_studio_value(child_value, log_invalid_types) - - def update_project_value(self, value, log_invalid_types=True): - """Update project override values. - - Not an api method, should be called by parent. - """ - - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - value, metadata = self._prepare_value(value) - self._project_override_metadata = metadata - self.had_project_override = metadata is not NOT_SET - - if value is NOT_SET: - for child_obj in self.non_gui_children.values(): - child_obj.update_project_value(value, log_invalid_types) - return - - value_keys = set(value.keys()) - expected_keys = set(self.non_gui_children) - unknown_keys = value_keys - expected_keys - if unknown_keys and log_invalid_types: - self.log.warning( - "{} Unknown keys in project overrides: {}".format( - self.path, - ", ".join("\"{}\"".format(key) for key in unknown_keys) - ) - ) - - for key, child_obj in self.non_gui_children.items(): - child_value = value.get(key, NOT_SET) - child_obj.update_project_value(child_value, log_invalid_types) - - def _discard_changes(self, on_change_trigger): - self._ignore_child_changes = True - - for child_obj in self.non_gui_children.values(): - child_obj.discard_changes(on_change_trigger) - - self._ignore_child_changes = False - - def _add_to_studio_default(self, on_change_trigger): - self._ignore_child_changes = True - for child_obj in self.non_gui_children.values(): - child_obj.add_to_studio_default(on_change_trigger) - self._ignore_child_changes = False - - self._update_current_metadata() - - self.parent.on_child_change(self) - - def _remove_from_studio_default(self, on_change_trigger): - self._ignore_child_changes = True - for child_obj in self.non_gui_children.values(): - child_obj.remove_from_studio_default(on_change_trigger) - self._ignore_child_changes = False - - def _add_to_project_override(self, _on_change_trigger): - self._ignore_child_changes = True - for child_obj in self.non_gui_children.values(): - child_obj.add_to_project_override(_on_change_trigger) - self._ignore_child_changes = False - - self._update_current_metadata() - - self.parent.on_child_change(self) - - def _remove_from_project_override(self, on_change_trigger): - if self._override_state is not OverrideState.PROJECT: - return - - self._ignore_child_changes = True - for child_obj in self.non_gui_children.values(): - child_obj.remove_from_project_override(on_change_trigger) - self._ignore_child_changes = False - - def reset_callbacks(self): - """Reset registered callbacks on entity and children.""" - super(DictImmutableKeysEntity, self).reset_callbacks() - for child_entity in self.children: - child_entity.reset_callbacks() - - -class RootsDictEntity(DictImmutableKeysEntity): - """Entity that adds ability to fill value for roots of current project. - - Value schema is defined by `object_type`. - - It is not possible to change override state (Studio values will always - contain studio overrides and same for project). That is because roots can - be totally different for each project. - """ - _origin_schema_data = None - schema_types = ["dict-roots"] - - def _item_initialization(self): - origin_schema_data = self.schema_data - - self.separate_items = origin_schema_data.get("separate_items", True) - object_type = origin_schema_data.get("object_type") - if isinstance(object_type, STRING_TYPE): - object_type = {"type": object_type} - self.object_type = object_type - - if self.group_item is None and not self.is_group: - self.is_group = True - - schema_data = copy.deepcopy(self.schema_data) - schema_data["children"] = [] - - self.schema_data = schema_data - self._origin_schema_data = origin_schema_data - - self._default_value = NOT_SET - self._studio_value = NOT_SET - self._project_value = NOT_SET - - super(RootsDictEntity, self)._item_initialization() - - def schema_validations(self): - if self.object_type is None: - reason = ( - "Missing children definitions for root values" - " ('object_type' not filled)." - ) - raise EntitySchemaError(self, reason) - - if not isinstance(self.object_type, dict): - reason = ( - "Children definitions for root values must be dictionary" - " ('object_type' is \"{}\")." - ).format(str(type(self.object_type))) - raise EntitySchemaError(self, reason) - - super(RootsDictEntity, self).schema_validations() - - def set_override_state(self, state, ignore_missing_defaults): - self.children = [] - self.non_gui_children = {} - self.gui_layout = [] - - roots_entity = self.get_entity_from_path( - "project_anatomy/roots" - ) - children = [] - first = True - for key in roots_entity.keys(): - if first: - first = False - elif self.separate_items: - children.append({"type": "separator"}) - child = copy.deepcopy(self.object_type) - child["key"] = key - child["label"] = key - children.append(child) - - schema_data = copy.deepcopy(self.schema_data) - schema_data["children"] = children - - self._add_children(schema_data) - - self._set_children_values(state, ignore_missing_defaults) - - super(RootsDictEntity, self).set_override_state( - state, True - ) - - if state == OverrideState.STUDIO: - self.add_to_studio_default() - - elif state == OverrideState.PROJECT: - self.add_to_project_override() - - def on_child_change(self, child_obj): - if self._override_state is OverrideState.STUDIO: - if not child_obj.has_studio_override: - self.add_to_studio_default() - - elif self._override_state is OverrideState.PROJECT: - if not child_obj.has_project_override: - self.add_to_project_override() - - return super(RootsDictEntity, self).on_child_change(child_obj) - - 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, log_invalid_types=True): - """Update default values. - - Not an api method, should be called by parent. - """ - - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - 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, log_invalid_types=True): - """Update studio override values. - - Not an api method, should be called by parent. - """ - - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - 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, log_invalid_types=True): - """Update project override values. - - Not an api method, should be called by parent. - """ - - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - value, _metadata = self._prepare_value(value) - - 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, log_invalid_types=True): - """Update default values. - - Not an api method, should be called by parent. - """ - - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - 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, log_invalid_types=True): - """Update studio override values. - - Not an api method, should be called by parent. - """ - - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - 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, log_invalid_types=True): - """Update project override values. - - Not an api method, should be called by parent. - """ - - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - value, _metadata = self._prepare_value(value) - - self._project_value = value - self._project_override_metadata = {} - self.had_project_override = value is not NOT_SET diff --git a/client/ayon_core/settings/entities/dict_mutable_keys_entity.py b/client/ayon_core/settings/entities/dict_mutable_keys_entity.py deleted file mode 100644 index d98497c92f..0000000000 --- a/client/ayon_core/settings/entities/dict_mutable_keys_entity.py +++ /dev/null @@ -1,729 +0,0 @@ -import re -import copy -from .lib import ( - NOT_SET, - OverrideState -) -from . import EndpointEntity -from .exceptions import ( - DefaultsNotDefined, - InvalidKeySymbols, - StudioDefaultsNotDefined, - RequiredKeyModified, - EntitySchemaError -) -from ayon_core.settings.constants import ( - METADATA_KEYS, - M_DYNAMIC_KEY_LABEL, - KEY_REGEX, - KEY_ALLOWED_SYMBOLS -) - - -class DictMutableKeysEntity(EndpointEntity): - """Dictionary entity that has mutable keys. - - Keys of entity's children can be modified, removed or added. Children have - defined entity type so it is not possible to have 2 different entity types - as children. - - TODOs: - - cleanup children on pop - - remove child's reference to parent - - clear callbacks - """ - schema_types = ["dict-modifiable"] - _default_label_wrap = { - "use_label_wrap": True, - "collapsible": True, - "collapsed": True - } - - _miss_arg = object() - - def __getitem__(self, key): - if key not in self.children_by_key: - self.add_key(key) - return self.children_by_key[key] - - def __setitem__(self, key, value): - self.set_key_value(key, value) - - def __iter__(self): - for key in self.keys(): - yield key - - def __contains__(self, key): - return key in self.children_by_key - - def pop(self, key, *args, **kwargs): - if key in self.required_keys: - raise RequiredKeyModified(self.path, key) - - if self._override_state is OverrideState.STUDIO: - self._has_studio_override = True - elif self._override_state is OverrideState.PROJECT: - self._has_project_override = True - - result = self.children_by_key.pop(key, *args, **kwargs) - self.on_change() - return result - - def get(self, key, default=None): - return self.children_by_key.get(key, default) - - def keys(self): - return self.children_by_key.keys() - - def values(self): - return self.children_by_key.values() - - def items(self): - return self.children_by_key.items() - - def clear(self): - for key in tuple(self.children_by_key.keys()): - self.pop(key) - - def set(self, value): - new_value = self.convert_to_valid_type(value) - - prev_keys = set(self.keys()) - - for _key, _value in new_value.items(): - self.set_key_value(_key, _value) - if _key in prev_keys: - prev_keys.remove(_key) - - for key in prev_keys: - self.pop(key) - - def _convert_to_valid_type(self, value): - try: - return dict(value) - except Exception: - pass - return super(DictMutableKeysEntity, self)._convert_to_valid_type(value) - - def set_key_value(self, key, value): - # TODO Check for value type if is Settings entity? - child_obj = self.children_by_key.get(key) - if not child_obj: - if not self.store_as_list and not KEY_REGEX.match(key): - raise InvalidKeySymbols(self.path, key) - - child_obj = self.add_key(key) - - child_obj.set(value) - - def change_key(self, old_key, new_key): - if old_key in self.required_keys: - raise RequiredKeyModified(self.path, old_key) - - if new_key == old_key: - return - - if not self.store_as_list and not KEY_REGEX.match(new_key): - raise InvalidKeySymbols(self.path, new_key) - - self.children_by_key[new_key] = self.children_by_key.pop(old_key) - self._on_key_label_change() - - def _on_key_label_change(self): - if self._override_state is OverrideState.STUDIO: - self._has_studio_override = True - elif self._override_state is OverrideState.PROJECT: - self._has_project_override = True - self.on_change() - - def _add_key(self, key, _ingore_key_validation=False): - if key in self.children_by_key: - self.pop(key) - - if ( - not _ingore_key_validation - and not self.store_as_list - and not KEY_REGEX.match(key) - ): - raise InvalidKeySymbols(self.path, key) - - item_schema = self.item_schema - - new_child = self.create_schema_object(item_schema, self, True) - self.children_by_key[key] = new_child - return new_child - - def add_key(self, key): - new_child = self._add_key(key) - new_child.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - self.on_change() - return new_child - - def change_child_key(self, child_entity, new_key): - old_key = None - for key, child in self.children_by_key.items(): - if child is child_entity: - old_key = key - break - - self.change_key(old_key, new_key) - - def get_child_key(self, child_entity): - for key, child in self.children_by_key.items(): - if child is child_entity: - return key - return None - - # Label methods - def get_child_label(self, child_entity): - return self.children_label_by_id.get(child_entity.id) - - def set_child_label(self, child_entity, label): - self.children_label_by_id[child_entity.id] = label - self._on_key_label_change() - - def get_key_label(self, key): - child_entity = self.children_by_key[key] - return self.get_child_label(child_entity) - - def set_key_label(self, key, label): - child_entity = self.children_by_key[key] - self.set_child_label(child_entity, label) - - def has_child_with_key(self, key): - return key in self.children_by_key - - def _item_initialization(self): - self._default_metadata = {} - self._studio_override_metadata = {} - self._project_override_metadata = {} - - self.initial_value = None - - self._ignore_child_changes = False - - self.valid_value_types = (dict, ) - self.value_on_not_set = {} - - self.children_by_key = {} - self.children_label_by_id = {} - - self.store_as_list = self.schema_data.get("store_as_list") or False - - self.required_keys = self.schema_data.get("required_keys") or [] - self.collapsible_key = self.schema_data.get("collapsible_key") or False - # GUI attributes - self.highlight_content = ( - self.schema_data.get("highlight_content") or False - ) - - object_type = self.schema_data.get("object_type") or {} - if not isinstance(object_type, dict): - # Backwards compatibility - object_type = { - "type": object_type - } - input_modifiers = self.schema_data.get("input_modifiers") or {} - if input_modifiers: - self.log.warning(( - "Used deprecated key `input_modifiers` to define item." - " Rather use `object_type` as dictionary with modifiers." - )) - object_type.update(input_modifiers) - self.item_schema = object_type - - if self.group_item is None: - self.is_group = True - - def schema_validations(self): - # Allow to have not set label if keys are collapsible - # - this it to bypass label validation - used_temp_label = False - if self.is_group and not self.label and self.collapsible_key: - used_temp_label = True - self.label = "LABEL" - - super(DictMutableKeysEntity, self).schema_validations() - if used_temp_label: - self.label = None - - if not self.schema_data.get("object_type"): - reason = ( - "Modifiable dictionary must have specified `object_type`." - ) - raise EntitySchemaError(self, reason) - - # TODO Ability to store labels should be defined with different key - if self.collapsible_key and self.file_item is None: - reason = ( - "Modifiable dictionary with collapsible keys is not under" - " file item so can't store metadata." - ) - raise EntitySchemaError(self, reason) - - # Validate object type schema - child_validated = False - for child_entity in self.children_by_key.values(): - child_entity.schema_validations() - child_validated = True - break - - if not child_validated: - key = "__tmp__" - tmp_child = self._add_key(key) - tmp_child.schema_validations() - self.children_by_key.pop(key) - - def get_child_path(self, child_obj): - result_key = None - for key, _child_obj in self.children_by_key.items(): - if _child_obj is child_obj: - result_key = key - break - - if result_key is None: - raise ValueError("Didn't find child {}".format(child_obj)) - - return "/".join([self.path, result_key]) - - def on_child_change(self, _child_entity): - if self._ignore_child_changes: - return - - if self._override_state is OverrideState.STUDIO: - self._has_studio_override = True - elif self._override_state is OverrideState.PROJECT: - self._has_project_override = True - - self.on_change() - - def _get_metadata_for_state(self, state): - if ( - state is OverrideState.PROJECT - and self._project_override_value is not NOT_SET - ): - return self._project_override_metadata - - if ( - state >= OverrideState.STUDIO - and self._studio_override_value is not NOT_SET - ): - return self._studio_override_metadata - - return self._default_metadata - - def _metadata_for_current_state(self): - return self._get_metadata_for_state(self._override_state) - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - # TODO change metadata - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - - # Ignore if is dynamic item and use default in that case - if not self.is_dynamic_item and not self.is_in_dynamic_item: - if state > OverrideState.DEFAULTS: - if ( - not self.has_default_value - and not ignore_missing_defaults - ): - raise DefaultsNotDefined(self) - - elif state > OverrideState.STUDIO: - if ( - not self.had_studio_override - and not ignore_missing_defaults - ): - raise StudioDefaultsNotDefined(self) - - if state is OverrideState.STUDIO: - self._has_studio_override = self.had_studio_override - - elif state is OverrideState.PROJECT: - self._has_project_override = self.had_project_override - self._has_studio_override = self.had_studio_override - - using_project_overrides = False - using_studio_overrides = False - using_default_values = False - if ( - state is OverrideState.PROJECT - and self.had_project_override - ): - using_project_overrides = True - value = self._project_override_value - metadata = self._project_override_metadata - - elif ( - state >= OverrideState.STUDIO - and self.had_studio_override - ): - using_studio_overrides = True - value = self._studio_override_value - metadata = self._studio_override_metadata - - else: - using_default_values = True - value = self._default_value - metadata = self._default_metadata - - if value is NOT_SET: - using_default_values = False - value = self.value_on_not_set - - using_values_from_state = False - log_invalid_types = True - if state is OverrideState.PROJECT: - log_invalid_types = self._project_log_invalid_types - using_values_from_state = using_project_overrides - elif state is OverrideState.STUDIO: - log_invalid_types = self._studio_log_invalid_types - using_values_from_state = using_studio_overrides - elif state is OverrideState.DEFAULTS: - log_invalid_types = self._default_log_invalid_types - using_values_from_state = using_default_values - - new_value = copy.deepcopy(value) - - if using_values_from_state: - initial_value = copy.deepcopy(value) - initial_value.update(metadata) - - # Simulate `clear` method without triggering value change - for key in tuple(self.children_by_key.keys()): - self.children_by_key.pop(key) - - for required_key in self.required_keys: - if required_key not in new_value: - new_value[required_key] = NOT_SET - - # Create new children - children_label_by_id = {} - metadata_labels = metadata.get(M_DYNAMIC_KEY_LABEL) or {} - for _key, _value in new_value.items(): - label = metadata_labels.get(_key) - if self.store_as_list or KEY_REGEX.match(_key): - child_entity = self._add_key(_key) - else: - # Replace invalid characters with underscore - # - this is safety to not break already existing settings - new_key = self._convert_to_regex_valid_key(_key) - if not using_values_from_state: - child_entity = self._add_key(new_key) - else: - child_entity = self._add_key( - _key, _ingore_key_validation=True - ) - self.change_key(_key, new_key) - _key = new_key - - if not label: - label = metadata_labels.get(new_key) - - child_entity.update_default_value(_value, log_invalid_types) - if using_project_overrides: - child_entity.update_project_value(_value, log_invalid_types) - elif using_studio_overrides: - child_entity.update_studio_value(_value, log_invalid_types) - - if label: - children_label_by_id[child_entity.id] = label - child_entity.set_override_state(state, ignore_missing_defaults) - - self.children_label_by_id = children_label_by_id - - _settings_value = self.settings_value() - if using_values_from_state: - if _settings_value is NOT_SET: - initial_value = NOT_SET - - elif self.store_as_list: - new_initial_value = [] - for key, value in _settings_value: - if key in initial_value: - new_initial_value.append([key, initial_value.pop(key)]) - - for key, value in initial_value.items(): - new_initial_value.append([key, value]) - initial_value = new_initial_value - else: - initial_value = _settings_value - - self.initial_value = initial_value - - def _convert_to_regex_valid_key(self, key): - return re.sub( - r"[^{}]+".format(KEY_ALLOWED_SYMBOLS), - "_", - key - ) - - def children_key_by_id(self): - return { - child_entity.id: key - for key, child_entity in self.children_by_key.items() - } - - @property - def value(self): - if self.store_as_list: - output = [] - for key, child_entity in self.children_by_key.items(): - output.append([key, child_entity.value]) - return output - - output = {} - for key, child_entity in self.children_by_key.items(): - output[key] = child_entity.value - return output - - @property - def metadata(self): - output = {} - if not self.children_label_by_id: - return output - - children_key_by_id = self.children_key_by_id() - label_metadata = {} - for child_id, label in self.children_label_by_id.items(): - key = children_key_by_id.get(child_id) - if key: - label_metadata[key] = label - - output[M_DYNAMIC_KEY_LABEL] = label_metadata - - return output - - @property - def has_unsaved_changes(self): - if ( - self._override_state is OverrideState.PROJECT - and self._has_project_override != self.had_project_override - ): - return True - - elif ( - self._override_state is OverrideState.STUDIO - and self._has_studio_override != self.had_studio_override - ): - return True - - if self._child_has_unsaved_changes: - return True - - if self.metadata != self._metadata_for_current_state(): - return True - - if self.settings_value() != self.initial_value: - return True - - return False - - @property - def _child_has_unsaved_changes(self): - for child_obj in self.children_by_key.values(): - if child_obj.has_unsaved_changes: - return True - return False - - @property - def has_studio_override(self): - return self._has_studio_override or self._child_has_studio_override - - @property - def _child_has_studio_override(self): - if self._override_state >= OverrideState.STUDIO: - for child_obj in self.children_by_key.values(): - if child_obj.has_studio_override: - return True - return False - - @property - def has_project_override(self): - return self._has_project_override or self._child_has_project_override - - @property - def _child_has_project_override(self): - if self._override_state >= OverrideState.PROJECT: - for child_obj in self.children_by_key.values(): - if child_obj.has_project_override: - return True - return False - - def _settings_value(self): - if self.store_as_list: - output = [] - for key, child_entity in self.children_by_key.items(): - child_value = child_entity.settings_value() - output.append([key, child_value]) - return output - - output = { - key: child_entity.settings_value() - for key, child_entity in self.children_by_key.items() - } - output.update(self.metadata) - return output - - def _prepare_value(self, value): - metadata = {} - if isinstance(value, dict): - for key in METADATA_KEYS: - if key in value: - metadata[key] = value.pop(key) - return value, metadata - - def update_default_value(self, value, log_invalid_types=True): - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - has_default_value = value is not NOT_SET - if has_default_value: - for required_key in self.required_keys: - if required_key not in value: - has_default_value = False - break - self.has_default_value = has_default_value - value, metadata = self._prepare_value(value) - self._default_value = value - self._default_metadata = metadata - - def update_studio_value(self, value, log_invalid_types=True): - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - value, metadata = self._prepare_value(value) - self._studio_override_value = value - self._studio_override_metadata = metadata - self.had_studio_override = value is not NOT_SET - - def update_project_value(self, value, log_invalid_types=True): - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - value, metadata = self._prepare_value(value) - self._project_override_value = value - self._project_override_metadata = metadata - self.had_project_override = value is not NOT_SET - - def _discard_changes(self, on_change_trigger): - if not self._can_discard_changes: - return - - self.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - on_change_trigger.append(self.on_change) - - def _add_to_studio_default(self, _on_change_trigger): - self._has_studio_override = True - self.on_change() - - def _remove_from_studio_default(self, on_change_trigger): - if not self._can_remove_from_studio_default: - return - - value = self._default_value - if value is NOT_SET: - value = self.value_on_not_set - - new_value = copy.deepcopy(value) - self._ignore_child_changes = True - - # Simulate `clear` method without triggering value change - for key in tuple(self.children_by_key.keys()): - self.children_by_key.pop(key) - - metadata = self._get_metadata_for_state(OverrideState.DEFAULTS) - metadata_labels = metadata.get(M_DYNAMIC_KEY_LABEL) or {} - children_label_by_id = {} - - # Create new children - for _key, _value in new_value.items(): - new_key = self._convert_to_regex_valid_key(_key) - child_entity = self._add_key(new_key) - child_entity.update_default_value(_value) - label = metadata_labels.get(_key) - if label: - children_label_by_id[child_entity.id] = label - - child_entity.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - - self.children_label_by_id = children_label_by_id - - self._ignore_child_changes = False - - self._has_studio_override = False - - on_change_trigger.append(self.on_change) - - def _add_to_project_override(self, _on_change_trigger): - self._has_project_override = True - self.on_change() - - def _remove_from_project_override(self, on_change_trigger): - if not self._can_remove_from_project_override: - return - - log_invalid_types = True - if self._has_studio_override: - log_invalid_types = self._studio_log_invalid_types - value = self._studio_override_value - elif self.has_default_value: - log_invalid_types = self._default_log_invalid_types - value = self._default_value - else: - value = self.value_on_not_set - - new_value = copy.deepcopy(value) - - self._ignore_child_changes = True - - # Simulate `clear` method without triggering value change - for key in tuple(self.children_by_key.keys()): - self.children_by_key.pop(key) - - metadata = self._get_metadata_for_state(OverrideState.STUDIO) - metadata_labels = metadata.get(M_DYNAMIC_KEY_LABEL) or {} - children_label_by_id = {} - - # Create new children - for _key, _value in new_value.items(): - new_key = self._convert_to_regex_valid_key(_key) - child_entity = self._add_key(new_key) - child_entity.update_default_value(_value, log_invalid_types) - if self._has_studio_override: - child_entity.update_studio_value(_value, log_invalid_types) - - label = metadata_labels.get(_key) - if label: - children_label_by_id[child_entity.id] = label - - child_entity.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - - self.children_label_by_id = children_label_by_id - - self._ignore_child_changes = False - - self._has_project_override = False - - on_change_trigger.append(self.on_change) - - def reset_callbacks(self): - super(DictMutableKeysEntity, self).reset_callbacks() - for child_entity in self.children_by_key.values(): - child_entity.reset_callbacks() diff --git a/client/ayon_core/settings/entities/enum_entity.py b/client/ayon_core/settings/entities/enum_entity.py deleted file mode 100644 index fa5d652ba5..0000000000 --- a/client/ayon_core/settings/entities/enum_entity.py +++ /dev/null @@ -1,644 +0,0 @@ -import abc -import six -import copy -from .input_entities import InputEntity -from .exceptions import EntitySchemaError -from .lib import NOT_SET, STRING_TYPE - - -class BaseEnumEntity(InputEntity): - def _item_initialization(self): - self.multiselection = True - self.value_on_not_set = None - self.enum_items = None - self.valid_keys = None - self.valid_value_types = None - self.placeholder = None - - def schema_validations(self): - if not isinstance(self.enum_items, list): - raise EntitySchemaError( - self, "Enum item must have defined `enum_items` as list." - ) - - enum_keys = set() - for item in self.enum_items: - key = tuple(item.keys())[0] - if key in enum_keys: - reason = 'Key "{}" is more than once in enum items.'.format( - key - ) - raise EntitySchemaError(self, reason) - - enum_keys.add(key) - - if not isinstance(key, STRING_TYPE): - reason = 'Key "{}" has invalid type {}, expected {}.'.format( - key, type(key), STRING_TYPE - ) - raise EntitySchemaError(self, reason) - - super(BaseEnumEntity, self).schema_validations() - - def _convert_to_valid_type(self, value): - if self.multiselection: - if isinstance(value, (set, tuple)): - return list(value) - elif isinstance(value, (int, float)): - return str(value) - return NOT_SET - - def set(self, value): - new_value = self.convert_to_valid_type(value) - if self.multiselection: - check_values = new_value - else: - check_values = [new_value] - - for item in check_values: - if item not in self.valid_keys: - raise ValueError( - '{} Invalid value "{}". Expected one of: {}'.format( - self.path, item, self.valid_keys - ) - ) - self._current_value = new_value - self._on_value_change() - - -class EnumEntity(BaseEnumEntity): - schema_types = ["enum"] - - def _item_initialization(self): - self.multiselection = self.schema_data.get("multiselection", False) - self.enum_items = self.schema_data.get("enum_items") - # Default is optional and non breaking attribute - enum_default = self.schema_data.get("default") - - all_keys = [] - for item in self.enum_items or []: - key = tuple(item.keys())[0] - all_keys.append(key) - - self.valid_keys = set(all_keys) - - if self.multiselection: - self.valid_value_types = (list,) - value_on_not_set = [] - if enum_default: - if not isinstance(enum_default, list): - enum_default = [enum_default] - - for item in enum_default: - if item in all_keys: - value_on_not_set.append(item) - - self.value_on_not_set = value_on_not_set - - else: - if isinstance(enum_default, list) and enum_default: - enum_default = enum_default[0] - - if enum_default in self.valid_keys: - self.value_on_not_set = enum_default - - else: - for key in all_keys: - if self.value_on_not_set is NOT_SET: - self.value_on_not_set = key - break - - self.valid_value_types = (STRING_TYPE,) - - # GUI attribute - self.placeholder = self.schema_data.get("placeholder") - - def schema_validations(self): - if not self.enum_items and "enum_items" not in self.schema_data: - raise EntitySchemaError( - self, "Enum item must have defined `enum_items`" - ) - super(EnumEntity, self).schema_validations() - - def set_override_state(self, *args, **kwargs): - super(EnumEntity, self).set_override_state(*args, **kwargs) - - # Make sure current value is valid - if self.multiselection: - new_value = [] - for key in self._current_value: - if key in self.valid_keys: - new_value.append(key) - self._current_value = new_value - - elif self._current_value not in self.valid_keys: - self._current_value = self.value_on_not_set - - -class HostsEnumEntity(BaseEnumEntity): - """Enumeration of host names. - - Enum items are hardcoded in definition of the entity. - - Hosts enum can have defined empty value as valid option which is - represented by empty string. Schema key to set this option is - `use_empty_value` (true/false). And to set label of empty value set - `empty_label` (string). - - Enum can have single and multiselection. - - NOTE: - Host name is not the same as application name. Host name defines - implementation instead of application name. - """ - - schema_types = ["hosts-enum"] - all_host_names = [ - "max", - "aftereffects", - "blender", - "celaction", - "flame", - "fusion", - "harmony", - "hiero", - "houdini", - "maya", - "nuke", - "photoshop", - "resolve", - "tvpaint", - "unreal", - "substancepainter", - "traypublisher", - "webpublisher" - ] - - def _item_initialization(self): - self.multiselection = self.schema_data.get("multiselection", True) - use_empty_value = False - if not self.multiselection: - use_empty_value = self.schema_data.get( - "use_empty_value", use_empty_value - ) - self.use_empty_value = use_empty_value - - hosts_filter = self.schema_data.get("hosts_filter") or [] - self.hosts_filter = hosts_filter - - custom_labels = self.schema_data.get("custom_labels") or {} - - host_names = copy.deepcopy(self.all_host_names) - if hosts_filter: - for host_name in tuple(host_names): - if host_name not in hosts_filter: - host_names.remove(host_name) - - if self.use_empty_value: - host_names.insert(0, "") - # Add default label for empty value if not available - if "" not in custom_labels: - custom_labels[""] = "< without host >" - - # These are hardcoded there is not list of available host in OpenPype - enum_items = [] - valid_keys = set() - for key in host_names: - label = custom_labels.get(key, key) - valid_keys.add(key) - enum_items.append({key: label}) - - self.enum_items = enum_items - self.valid_keys = valid_keys - - if self.multiselection: - self.valid_value_types = (list,) - self.value_on_not_set = [] - else: - for key in valid_keys: - if self.value_on_not_set is NOT_SET: - self.value_on_not_set = key - break - - self.valid_value_types = (STRING_TYPE,) - - # GUI attribute - self.placeholder = self.schema_data.get("placeholder") - - def schema_validations(self): - if self.hosts_filter: - enum_len = len(self.enum_items) - if enum_len == 0 or (enum_len == 1 and self.use_empty_value): - joined_filters = ", ".join( - ['"{}"'.format(item) for item in self.hosts_filter] - ) - reason = ( - "All host names were removed after applying" - " host filters. {}" - ).format(joined_filters) - raise EntitySchemaError(self, reason) - - invalid_filters = set() - for item in self.hosts_filter: - if item not in self.all_host_names: - invalid_filters.add(item) - - if invalid_filters: - joined_filters = ", ".join( - ['"{}"'.format(item) for item in self.hosts_filter] - ) - expected_hosts = ", ".join( - ['"{}"'.format(item) for item in self.all_host_names] - ) - self.log.warning( - ( - "Host filters containt invalid host names:" - ' "{}" Expected values are {}' - ).format(joined_filters, expected_hosts) - ) - - super(HostsEnumEntity, self).schema_validations() - - -class AppsEnumEntity(BaseEnumEntity): - """Enum of applications for project anatomy attributes.""" - - schema_types = ["apps-enum"] - - def _item_initialization(self): - self.multiselection = True - self.value_on_not_set = [] - self.enum_items = [] - self.valid_keys = set() - self.valid_value_types = (list,) - self.placeholder = None - - def _get_enum_values(self): - system_settings_entity = self.get_entity_from_path("system_settings") - - valid_keys = set() - enum_items_list = [] - applications_entity = system_settings_entity["applications"] - app_entities = {} - additional_app_names = set() - additional_apps_entity = None - for group_name, app_group in applications_entity.items(): - if group_name != "additional_apps": - app_entities[group_name] = app_group - continue - - additional_apps_entity = app_group - for _group_name, _group in app_group.items(): - additional_app_names.add(_group_name) - app_entities[_group_name] = _group - - for group_name, app_group in app_entities.items(): - enabled_entity = app_group.get("enabled") - if enabled_entity and not enabled_entity.value: - continue - - if group_name in additional_app_names: - group_label = additional_apps_entity.get_key_label(group_name) - if not group_label: - group_label = group_name - else: - group_label = app_group["label"].value - variants_entity = app_group["variants"] - for variant_name, variant_entity in variants_entity.items(): - enabled_entity = variant_entity.get("enabled") - if enabled_entity and not enabled_entity.value: - continue - - variant_label = None - if "variant_label" in variant_entity: - variant_label = variant_entity["variant_label"].value - elif hasattr(variants_entity, "get_key_label"): - variant_label = variants_entity.get_key_label(variant_name) - - if not variant_label: - variant_label = variant_name - - if group_label: - full_label = "{} {}".format(group_label, variant_label) - else: - full_label = variant_label - - full_name = "/".join((group_name, variant_name)) - enum_items_list.append((full_name, full_label)) - valid_keys.add(full_name) - - enum_items = [] - for key, value in sorted(enum_items_list, key=lambda item: item[1]): - enum_items.append({key: value}) - return enum_items, valid_keys - - def set_override_state(self, *args, **kwargs): - super(AppsEnumEntity, self).set_override_state(*args, **kwargs) - - self.enum_items, self.valid_keys = self._get_enum_values() - new_value = [] - for key in self._current_value: - if key in self.valid_keys: - new_value.append(key) - self._current_value = new_value - - -class ToolsEnumEntity(BaseEnumEntity): - schema_types = ["tools-enum"] - - def _item_initialization(self): - self.multiselection = True - self.value_on_not_set = [] - self.enum_items = [] - self.valid_keys = set() - self.valid_value_types = (list,) - self.placeholder = None - - def _get_enum_values(self): - system_settings_entity = self.get_entity_from_path("system_settings") - - valid_keys = set() - enum_items_list = [] - tool_groups_entity = system_settings_entity["tools"]["tool_groups"] - for group_name, tool_group in tool_groups_entity.items(): - # Try to get group label from entity - group_label = None - if hasattr(tool_groups_entity, "get_key_label"): - group_label = tool_groups_entity.get_key_label(group_name) - - variants_entity = tool_group["variants"] - for variant_name in variants_entity.keys(): - # Prepare tool name (used as value) - tool_name = "/".join((group_name, variant_name)) - - # Try to get variant label from entity - variant_label = None - if hasattr(variants_entity, "get_key_label"): - variant_label = variants_entity.get_key_label(variant_name) - - # Tool label that will be shown - # - use tool name itself if labels are not filled - if group_label and variant_label: - tool_label = " ".join((group_label, variant_label)) - else: - tool_label = tool_name - - enum_items_list.append((tool_name, tool_label)) - valid_keys.add(tool_name) - - enum_items = [] - for key, value in sorted(enum_items_list, key=lambda item: item[1]): - enum_items.append({key: value}) - return enum_items, valid_keys - - def set_override_state(self, *args, **kwargs): - super(ToolsEnumEntity, self).set_override_state(*args, **kwargs) - - self.enum_items, self.valid_keys = self._get_enum_values() - new_value = [] - for key in self._current_value: - if key in self.valid_keys: - new_value.append(key) - self._current_value = new_value - - -class TaskTypeEnumEntity(BaseEnumEntity): - schema_types = ["task-types-enum"] - - def _item_initialization(self): - self.multiselection = self.schema_data.get("multiselection", True) - if self.multiselection: - self.valid_value_types = (list,) - self.value_on_not_set = [] - else: - self.valid_value_types = (STRING_TYPE,) - self.value_on_not_set = "" - - self.enum_items = [] - self.valid_keys = set() - self.placeholder = None - - def _get_enum_values(self): - anatomy_entity = self.get_entity_from_path( - "project_settings/project_anatomy" - ) - - valid_keys = set() - enum_items = [] - for task_type in anatomy_entity["tasks"].keys(): - enum_items.append({task_type: task_type}) - valid_keys.add(task_type) - - return enum_items, valid_keys - - def _convert_value_for_current_state(self, source_value): - if self.multiselection: - output = [] - for key in source_value: - if key in self.valid_keys: - output.append(key) - return output - - if source_value not in self.valid_keys: - # Take first item from enum items - for item in self.enum_items: - for key in item.keys(): - source_value = key - break - return source_value - - def set_override_state(self, *args, **kwargs): - super(TaskTypeEnumEntity, self).set_override_state(*args, **kwargs) - - self.enum_items, self.valid_keys = self._get_enum_values() - - if self.multiselection: - new_value = [] - for key in self._current_value: - if key in self.valid_keys: - new_value.append(key) - - if self._current_value != new_value: - self.set(new_value) - else: - if not self.enum_items: - self.valid_keys.add("") - self.enum_items.append({"": "< Empty >"}) - - for item in self.enum_items: - for key in item.keys(): - value_on_not_set = key - break - - self.value_on_not_set = value_on_not_set - if ( - self._current_value is NOT_SET - or self._current_value not in self.valid_keys - ): - self.set(value_on_not_set) - - -class DynamicEnumEntity(BaseEnumEntity): - schema_types = [] - - def _item_initialization(self): - self.multiselection = self.schema_data.get("multiselection", True) - - self.enum_items = [] - self.valid_keys = set() - - if self.multiselection: - self.valid_value_types = (list,) - self.value_on_not_set = [] - else: - self.valid_value_types = (STRING_TYPE,) - self.value_on_not_set = "" - - # GUI attribute - self.placeholder = self.schema_data.get("placeholder") - - def set_override_state(self, *args, **kwargs): - super(DynamicEnumEntity, self).set_override_state(*args, **kwargs) - - self.enum_items, self.valid_keys = self._get_enum_values() - if self.multiselection: - new_value = [] - for key in self._current_value: - if key in self.valid_keys: - new_value.append(key) - self._current_value = new_value - - else: - if not self.valid_keys: - self._current_value = "" - - elif self._current_value not in self.valid_keys: - self._current_value = tuple(self.valid_keys)[0] - - @abc.abstractmethod - def _get_enum_values(self): - pass - - -class DeadlineUrlEnumEntity(DynamicEnumEntity): - schema_types = ["deadline_url-enum"] - - def _get_enum_values(self): - deadline_urls_entity = self.get_entity_from_path( - "system_settings/modules/deadline/deadline_urls" - ) - - valid_keys = set() - enum_items_list = [] - for server_name, url_entity in deadline_urls_entity.items(): - enum_items_list.append( - {server_name: "{}: {}".format(server_name, url_entity.value)} - ) - valid_keys.add(server_name) - return enum_items_list, valid_keys - - -class RoyalRenderRootEnumEntity(DynamicEnumEntity): - schema_types = ["rr_root-enum"] - - def _get_enum_values(self): - rr_root_entity = self.get_entity_from_path( - "system_settings/modules/royalrender/rr_paths" - ) - - valid_keys = set() - enum_items_list = [] - for server_name, url_entity in rr_root_entity.items(): - enum_items_list.append( - {server_name: "{}: {}".format(server_name, url_entity.value)} - ) - valid_keys.add(server_name) - return enum_items_list, valid_keys - - -class ShotgridUrlEnumEntity(DynamicEnumEntity): - schema_types = ["shotgrid_url-enum"] - - def _get_enum_values(self): - shotgrid_settings = self.get_entity_from_path( - "system_settings/modules/shotgrid/shotgrid_settings" - ) - - valid_keys = set() - enum_items_list = [] - for server_name, settings in shotgrid_settings.items(): - enum_items_list.append( - { - server_name: "{}: {}".format( - server_name, settings["shotgrid_url"].value - ) - } - ) - valid_keys.add(server_name) - return enum_items_list, valid_keys - - -class AnatomyTemplatesEnumEntity(BaseEnumEntity): - schema_types = ["anatomy-templates-enum"] - - def _item_initialization(self): - self.multiselection = False - - self.enum_items = [] - self.valid_keys = set() - - enum_default = self.schema_data.get("default") or "work" - - self.value_on_not_set = enum_default - self.valid_value_types = (STRING_TYPE,) - - # GUI attribute - self.placeholder = self.schema_data.get("placeholder") - - def _get_enum_values(self): - templates_entity = self.get_entity_from_path( - "project_anatomy/templates" - ) - - valid_keys = set() - enum_items_list = [] - - others_entity = None - for key, entity in templates_entity.items(): - # Skip defaults key - if key == "defaults": - continue - - if key == "others": - others_entity = entity - continue - - label = key - if hasattr(entity, "label"): - label = entity.label or label - - enum_items_list.append({key: label}) - valid_keys.add(key) - - if others_entity is not None: - get_child_label_func = getattr( - others_entity, "get_child_label", None - ) - for key, child_entity in others_entity.items(): - label = key - if callable(get_child_label_func): - label = get_child_label_func(child_entity) or label - - enum_items_list.append({key: label}) - valid_keys.add(key) - - return enum_items_list, valid_keys - - def set_override_state(self, *args, **kwargs): - super(AnatomyTemplatesEnumEntity, self).set_override_state( - *args, **kwargs - ) - - self.enum_items, self.valid_keys = self._get_enum_values() - if self._current_value not in self.valid_keys: - self._current_value = self.value_on_not_set diff --git a/client/ayon_core/settings/entities/exceptions.py b/client/ayon_core/settings/entities/exceptions.py deleted file mode 100644 index 5c5003b5da..0000000000 --- a/client/ayon_core/settings/entities/exceptions.py +++ /dev/null @@ -1,127 +0,0 @@ -from ayon_core.settings.constants import KEY_ALLOWED_SYMBOLS - - -class DefaultsNotDefined(Exception): - def __init__(self, obj): - msg = "Default values for object are not set. {}".format(obj.path) - super(DefaultsNotDefined, self).__init__(msg) - - -class StudioDefaultsNotDefined(Exception): - def __init__(self, obj): - msg = "Studio default values for object are not set. {}".format( - obj.path - ) - super(StudioDefaultsNotDefined, self).__init__(msg) - - -class BaseInvalidValue(Exception): - def __init__(self, reason, path): - msg = "Path \"{}\". {}".format(path, reason) - self.msg = msg - super(BaseInvalidValue, self).__init__(msg) - - -class InvalidValueType(BaseInvalidValue): - def __init__(self, valid_types, invalid_type, path): - joined_types = ", ".join( - [str(valid_type) for valid_type in valid_types] - ) - msg = "Got invalid type \"{}\". Expected: {}".format( - invalid_type, joined_types - ) - super(InvalidValueType, self).__init__(msg, path) - - -class RequiredKeyModified(KeyError): - def __init__(self, entity_path, key): - msg = "{} - Tried to modify required key \"{}\"." - super(RequiredKeyModified, self).__init__(msg.format(entity_path, key)) - - -class InvalidKeySymbols(KeyError): - def __init__(self, entity_path, key): - msg = "{} - Invalid key \"{}\". Allowed symbols are {}" - super(InvalidKeySymbols, self).__init__( - msg.format(entity_path, key, KEY_ALLOWED_SYMBOLS) - ) - - -class SchemaError(Exception): - pass - - -class EntitySchemaError(SchemaError): - def __init__(self, entity, reason): - self.entity = entity - self.reason = reason - msg = "{} {} - {}".format(entity.__class__, entity.path, reason) - super(EntitySchemaError, self).__init__(msg) - - -class SchemeGroupHierarchyBug(EntitySchemaError): - def __init__(self, entity): - reason = ( - "Items with attribute \"is_group\" can't have another item with" - " \"is_group\" attribute as child." - ) - super(SchemeGroupHierarchyBug, self).__init__(entity, reason) - - -class SchemaMissingFileInfo(SchemaError): - def __init__(self, invalid): - full_path_keys = [] - for item in invalid: - full_path_keys.append("\"{}\"".format("/".join(item))) - - msg = ( - "Schema has missing definition of output file (\"is_file\" key)" - " for keys. [{}]" - ).format(", ".join(full_path_keys)) - super(SchemaMissingFileInfo, self).__init__(msg) - - -class SchemaDuplicatedKeys(SchemaError): - def __init__(self, entity, key): - msg = ( - "Schema item contain duplicated key \"{}\" in" - " one hierarchy level." - ).format(key) - super(SchemaDuplicatedKeys, self).__init__(entity, msg) - - -class SchemaDuplicatedEnvGroupKeys(SchemaError): - def __init__(self, invalid): - items = [] - for key_path, keys in invalid.items(): - joined_keys = ", ".join([ - "\"{}\"".format(key) for key in keys - ]) - items.append("\"{}\" ({})".format(key_path, joined_keys)) - - msg = ( - "Schema items contain duplicated environment group keys. {}" - ).format(" || ".join(items)) - super(SchemaDuplicatedEnvGroupKeys, self).__init__(msg) - - -class SchemaTemplateMissingKeys(SchemaError): - def __init__(self, missing_keys, required_keys, template_name=None): - self.missing_keys = missing_keys - self.required_keys = required_keys - if template_name: - msg = "Schema template \"{}\" require more keys.\n".format( - template_name - ) - else: - msg = "" - msg += "Required keys: {}\nMissing keys: {}".format( - self.join_keys(required_keys), - self.join_keys(missing_keys) - ) - super(SchemaTemplateMissingKeys, self).__init__(msg) - - def join_keys(self, keys): - return ", ".join([ - "\"{}\"".format(key) for key in keys - ]) diff --git a/client/ayon_core/settings/entities/input_entities.py b/client/ayon_core/settings/entities/input_entities.py deleted file mode 100644 index df67220d06..0000000000 --- a/client/ayon_core/settings/entities/input_entities.py +++ /dev/null @@ -1,608 +0,0 @@ -import re -import copy -import json -from abc import abstractmethod - -from .base_entity import ItemEntity -from .lib import ( - NOT_SET, - STRING_TYPE, - OverrideState -) -from .exceptions import ( - DefaultsNotDefined, - StudioDefaultsNotDefined, - EntitySchemaError -) - -from ayon_core.settings.constants import METADATA_KEYS - - -class EndpointEntity(ItemEntity): - """Entity that is a endpoint of settings value. - - In most of cases endpoint entity does not have children entities and if has - then they are dynamic and can be removed/created. Is automatically set as - group if any parent is not, that is because of override metadata. - """ - - def __init__(self, *args, **kwargs): - super(EndpointEntity, self).__init__(*args, **kwargs) - - if ( - not (self.group_item is not None or self.is_group) - and not (self.is_dynamic_item or self.is_in_dynamic_item) - ): - self.is_group = True - - def schema_validations(self): - """Validation of entity schema and schema hierarchy.""" - # Default value when even defaults are not filled must be set - if self.value_on_not_set is NOT_SET: - reason = "Attribute `value_on_not_set` is not filled. {}".format( - self.__class__.__name__ - ) - raise EntitySchemaError(self, reason) - - super(EndpointEntity, self).schema_validations() - - def collect_dynamic_schema_entities(self, collector): - if self.is_dynamic_schema_node: - collector.add_entity(self) - - @abstractmethod - def _settings_value(self): - pass - - def collect_static_entities_by_path(self): - if self.is_dynamic_item or self.is_in_dynamic_item: - return {} - return {self.path: self} - - def settings_value(self): - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if self.is_group: - if self._override_state is OverrideState.STUDIO: - if not self.has_studio_override: - return NOT_SET - elif self._override_state is OverrideState.PROJECT: - if not self.has_project_override: - return NOT_SET - return self._settings_value() - - def on_change(self): - for callback in self.on_change_callbacks: - callback() - - if self.require_restart_on_change: - if self.require_restart: - self.root_item.add_item_require_restart(self) - else: - self.root_item.remove_item_require_restart(self) - self.parent.on_child_change(self) - - @property - def require_restart(self): - return self.has_unsaved_changes - - def update_default_value(self, value, log_invalid_types=True): - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - self._default_value = value - self.has_default_value = value is not NOT_SET - - def update_studio_value(self, value, log_invalid_types=True): - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - self._studio_override_value = value - self.had_studio_override = bool(value is not NOT_SET) - - def update_project_value(self, value, log_invalid_types=True): - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - self._project_override_value = value - self.had_project_override = bool(value is not NOT_SET) - - -class InputEntity(EndpointEntity): - """Endpoint entity without children.""" - def __init__(self, *args, **kwargs): - super(InputEntity, self).__init__(*args, **kwargs) - self._value_is_modified = False - self._current_value = NOT_SET - - def __eq__(self, other): - if isinstance(other, ItemEntity): - return self.value == other.value - return self.value == other - - def has_child_with_key(self, key): - return False - - def get_child_path(self, child_obj): - raise TypeError("{} can't have children".format( - self.__class__.__name__ - )) - - def schema_validations(self): - # Input entity must have file parent. - if ( - not self.is_dynamic_schema_node - and not self.is_in_dynamic_schema_node - and self.file_item is None - ): - raise EntitySchemaError(self, "Missing parent file entity.") - - super(InputEntity, self).schema_validations() - - @property - def value(self): - """Entity's value without metadata.""" - return self._current_value - - @property - def require_restart(self): - return self._value_is_modified - - def _settings_value(self): - return copy.deepcopy(self.value) - - def set(self, value): - """Change value.""" - self._current_value = self.convert_to_valid_type(value) - self._on_value_change() - - def _on_value_change(self): - # Change has_project_override attr value - if self._override_state is OverrideState.PROJECT: - self._has_project_override = True - - elif self._override_state is OverrideState.STUDIO: - self._has_studio_override = True - - self.on_change() - - def on_change(self): - """Callback triggered on change. - - There are cases when this method may be called from other entity. - """ - value_is_modified = None - if self._override_state is OverrideState.PROJECT: - # Only value change - if ( - self._has_project_override - and self._project_override_value is not NOT_SET - ): - value_is_modified = ( - self._current_value != self._project_override_value - ) - - if ( - self._override_state is OverrideState.STUDIO - or value_is_modified is None - ): - if ( - self._has_studio_override - and self._studio_override_value is not NOT_SET - ): - value_is_modified = ( - self._current_value != self._studio_override_value - ) - - if value_is_modified is None: - value_is_modified = self._current_value != self._default_value - - self._value_is_modified = value_is_modified - - super(InputEntity, self).on_change() - - def on_child_change(self, child_obj): - raise TypeError("Input entities do not contain children.") - - @property - def has_unsaved_changes(self): - if self._override_state is OverrideState.NOT_DEFINED: - return False - - if self._value_is_modified: - return True - - # These may be stored on value change - if self._override_state is OverrideState.DEFAULTS: - if not self.has_default_value: - return True - - elif self._override_state is OverrideState.STUDIO: - if self._has_studio_override != self.had_studio_override: - return True - - if not self._has_studio_override and not self.has_default_value: - return True - - elif self._override_state is OverrideState.PROJECT: - if self._has_project_override != self.had_project_override: - return True - - if ( - not self._has_project_override - and not self._has_studio_override - and not self.has_default_value - ): - return True - return False - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - # Ignore if is dynamic item and use default in that case - if not self.is_dynamic_item and not self.is_in_dynamic_item: - if state > OverrideState.DEFAULTS: - if ( - not self.has_default_value - and not ignore_missing_defaults - ): - raise DefaultsNotDefined(self) - - elif state > OverrideState.STUDIO: - if ( - not self.had_studio_override - and not ignore_missing_defaults - ): - raise StudioDefaultsNotDefined(self) - - if state is OverrideState.STUDIO: - self._has_studio_override = ( - self._studio_override_value is not NOT_SET - ) - - elif state is OverrideState.PROJECT: - self._has_project_override = ( - self._project_override_value is not NOT_SET - ) - self._has_studio_override = self.had_studio_override - - value = NOT_SET - if state is OverrideState.PROJECT: - value = self._project_override_value - - if value is NOT_SET and state >= OverrideState.STUDIO: - value = self._studio_override_value - - if value is NOT_SET and state >= OverrideState.DEFAULTS: - value = self._default_value - - if value is NOT_SET: - value = self.value_on_not_set - self.has_default_value = False - else: - self.has_default_value = True - self._value_is_modified = False - - self._current_value = copy.deepcopy(value) - - def _discard_changes(self, on_change_trigger=None): - if not self._can_discard_changes: - return - - self._value_is_modified = False - if self._override_state >= OverrideState.PROJECT: - self._has_project_override = self.had_project_override - if self.had_project_override: - self._current_value = copy.deepcopy( - self._project_override_value - ) - on_change_trigger.append(self.on_change) - return - - if self._override_state >= OverrideState.STUDIO: - self._has_studio_override = self.had_studio_override - if self.had_studio_override: - self._current_value = copy.deepcopy( - self._studio_override_value - ) - on_change_trigger.append(self.on_change) - return - - if self._override_state >= OverrideState.DEFAULTS: - if self.has_default_value: - value = self._default_value - else: - value = self.value_on_not_set - self._current_value = copy.deepcopy(value) - on_change_trigger.append(self.on_change) - return - - raise NotImplementedError("BUG: Unexcpected part of code.") - - def _add_to_studio_default(self, _on_change_trigger): - self._has_studio_override = True - self.on_change() - - def _remove_from_studio_default(self, on_change_trigger): - if not self._can_remove_from_studio_default: - return - - value = self._default_value - if value is NOT_SET: - value = self.value_on_not_set - self._current_value = copy.deepcopy(value) - - self._has_studio_override = False - self._value_is_modified = False - - on_change_trigger.append(self.on_change) - - def _add_to_project_override(self, _on_change_trigger): - self._has_project_override = True - self.on_change() - - def _remove_from_project_override(self, on_change_trigger): - if not self._can_remove_from_project_override: - return - - self._has_project_override = False - if self._has_studio_override: - current_value = self._studio_override_value - elif self.has_default_value: - current_value = self._default_value - else: - current_value = self.value_on_not_set - - self._current_value = copy.deepcopy(current_value) - on_change_trigger.append(self.on_change) - - -class NumberEntity(InputEntity): - schema_types = ["number"] - float_number_regex = re.compile(r"^\d+\.\d+$") - int_number_regex = re.compile(r"^\d+$") - - def _item_initialization(self): - self.minimum = self.schema_data.get("minimum", -99999) - self.maximum = self.schema_data.get("maximum", 99999) - self.decimal = self.schema_data.get("decimal", 0) - - value_on_not_set = self.schema_data.get("default", 0) - if self.decimal: - valid_value_types = (float, ) - value_on_not_set = float(value_on_not_set) - else: - valid_value_types = (int, ) - value_on_not_set = int(value_on_not_set) - self.valid_value_types = valid_value_types - self.value_on_not_set = value_on_not_set - - # UI specific attributes - self.show_slider = self.schema_data.get("show_slider", False) - steps = self.schema_data.get("steps", None) - # Make sure that steps are not set to `0` - if steps == 0: - steps = None - self.steps = steps - - def _convert_to_valid_type(self, value): - if isinstance(value, str): - new_value = None - if self.float_number_regex.match(value): - new_value = float(value) - elif self.int_number_regex.match(value): - new_value = int(value) - - if new_value is not None: - self.log.info("{} - Converted str {} to {} {}".format( - self.path, value, type(new_value).__name__, new_value - )) - value = new_value - - if self.decimal: - if isinstance(value, float): - return value - if isinstance(value, int): - return float(value) - else: - if isinstance(value, int): - return value - if isinstance(value, float): - new_value = int(value) - if new_value != value: - self.log.info("{} - Converted float {} to int {}".format( - self.path, value, new_value - )) - return new_value - return NOT_SET - - -class BoolEntity(InputEntity): - schema_types = ["boolean"] - - def _item_initialization(self): - self.valid_value_types = (bool, ) - value_on_not_set = self.convert_to_valid_type( - self.schema_data.get("default", True) - ) - self.value_on_not_set = value_on_not_set - - -class TextEntity(InputEntity): - schema_types = ["text"] - - def _item_initialization(self): - self.valid_value_types = (STRING_TYPE, ) - self.value_on_not_set = self.convert_to_valid_type( - self.schema_data.get("default", "") - ) - - # GUI attributes - self.multiline = self.schema_data.get("multiline", False) - self.placeholder_text = self.schema_data.get("placeholder") - self.value_hints = self.schema_data.get("value_hints") or [] - self.minimum_lines_count = ( - self.schema_data.get("minimum_lines_count") or 0) - - def schema_validations(self): - if self.multiline and self.value_hints: - reason = ( - "TextEntity entity can't use value hints" - " for multiline input (yet)." - ) - raise EntitySchemaError(self, reason) - super(TextEntity, self).schema_validations() - - def _convert_to_valid_type(self, value): - # Allow numbers converted to string - if isinstance(value, (int, float)): - return str(value) - return NOT_SET - - -class PathInput(InputEntity): - schema_types = ["path-input"] - - def _item_initialization(self): - self.valid_value_types = (STRING_TYPE, ) - self.value_on_not_set = "" - - # GUI attributes - self.placeholder_text = self.schema_data.get("placeholder") - - def set(self, value): - # Strip value - super(PathInput, self).set(value.strip()) - - def set_override_state(self, state, ignore_missing_defaults): - super(PathInput, self).set_override_state( - state, ignore_missing_defaults - ) - # Strip current value - self._current_value = self._current_value.strip() - - -class RawJsonEntity(InputEntity): - schema_types = ["raw-json"] - - def _item_initialization(self): - # Schema must define if valid value is dict or list - store_as_string = self.schema_data.get("store_as_string", False) - is_list = self.schema_data.get("is_list", False) - if is_list: - valid_value_types = (list, ) - value_on_not_set = [] - else: - valid_value_types = (dict, ) - value_on_not_set = {} - - self.store_as_string = store_as_string - - self._is_list = is_list - self.valid_value_types = valid_value_types - self.value_on_not_set = value_on_not_set - - self.default_metadata = {} - self.studio_override_metadata = {} - self.project_override_metadata = {} - - @property - def is_list(self): - return self._is_list - - @property - def is_dict(self): - return not self._is_list - - def set(self, value): - new_value = self.convert_to_valid_type(value) - - if isinstance(new_value, dict): - for key in METADATA_KEYS: - if key in new_value: - new_value.pop(key) - self._current_value = new_value - self._on_value_change() - - @property - def metadata(self): - return {} - - @property - def has_unsaved_changes(self): - result = super(RawJsonEntity, self).has_unsaved_changes - if not result: - result = self.metadata != self._metadata_for_current_state() - return result - - def _convert_to_valid_type(self, value): - if isinstance(value, STRING_TYPE): - try: - return json.loads(value) - except Exception: - pass - return super(RawJsonEntity, self)._convert_to_valid_type(value) - - def _metadata_for_current_state(self): - if ( - self._override_state is OverrideState.PROJECT - and self._project_override_value is not NOT_SET - ): - return self.project_override_metadata - - if ( - self._override_state >= OverrideState.STUDIO - and self._studio_override_value is not NOT_SET - ): - return self.studio_override_metadata - - return self.default_metadata - - def _settings_value(self): - value = super(RawJsonEntity, self)._settings_value() - if self.store_as_string: - return json.dumps(value) - return value - - def _prepare_value(self, value): - metadata = {} - if isinstance(value, dict): - value = copy.deepcopy(value) - for key in METADATA_KEYS: - if key in value: - metadata[key] = value.pop(key) - return value, metadata - - def update_default_value(self, value, log_invalid_types=True): - value = self._check_update_value(value, "default", log_invalid_types) - self.has_default_value = value is not NOT_SET - value, metadata = self._prepare_value(value) - self._default_value = value - self.default_metadata = metadata - - def update_studio_value(self, value, log_invalid_types=True): - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - self.had_studio_override = value is not NOT_SET - value, metadata = self._prepare_value(value) - self._studio_override_value = value - self.studio_override_metadata = metadata - - def update_project_value(self, value, log_invalid_types=True): - value = self._check_update_value( - value, "project override", log_invalid_types - ) - self.had_project_override = value is not NOT_SET - value, metadata = self._prepare_value(value) - self._project_override_value = value - self.project_override_metadata = metadata diff --git a/client/ayon_core/settings/entities/item_entities.py b/client/ayon_core/settings/entities/item_entities.py deleted file mode 100644 index c888cf3b78..0000000000 --- a/client/ayon_core/settings/entities/item_entities.py +++ /dev/null @@ -1,560 +0,0 @@ -import re - -import six - -from .lib import ( - NOT_SET, - STRING_TYPE, - OverrideState -) -from .exceptions import ( - DefaultsNotDefined, - StudioDefaultsNotDefined, - EntitySchemaError -) -from .base_entity import ItemEntity - - -class PathEntity(ItemEntity): - schema_types = ["path"] - platforms = ("windows", "darwin", "linux") - platform_labels_mapping = { - "windows": "Windows", - "darwin": "MacOS", - "linux": "Linux" - } - path_item_type_error = "Got invalid path value type {}. Expected: {}" - attribute_error_msg = ( - "'PathEntity' has no attribute '{}' if is not set as multiplatform" - ) - - def __setitem__(self, *args, **kwargs): - return self.child_obj.__setitem__(*args, **kwargs) - - def __getitem__(self, *args, **kwargs): - return self.child_obj.__getitem__(*args, **kwargs) - - def __iter__(self): - return self.child_obj.__iter__() - - def keys(self): - if not self.multiplatform: - raise AttributeError(self.attribute_error_msg.format("keys")) - return self.child_obj.keys() - - def values(self): - if not self.multiplatform: - raise AttributeError(self.attribute_error_msg.format("values")) - return self.child_obj.values() - - def items(self): - if not self.multiplatform: - raise AttributeError(self.attribute_error_msg.format("items")) - return self.child_obj.items() - - def has_child_with_key(self, key): - return self.child_obj.has_child_with_key(key) - - def _item_initialization(self): - if self.group_item is None and not self.is_group: - self.is_group = True - - self.multiplatform = self.schema_data.get("multiplatform", False) - self.multipath = self.schema_data.get("multipath", False) - - placeholder_text = self.schema_data.get("placeholder") - - # Create child object - if not self.multiplatform and not self.multipath: - valid_value_types = (STRING_TYPE, ) - item_schema = { - "type": "path-input", - "key": self.key, - "placeholder": placeholder_text - } - - elif not self.multiplatform: - valid_value_types = (list, ) - item_schema = { - "type": "list", - "key": self.key, - "object_type": { - "type": "path-input", - "placeholder": placeholder_text - } - } - - else: - valid_value_types = (dict, ) - item_schema = { - "type": "dict", - "key": self.key, - "show_borders": False, - "children": [] - } - for platform_key in self.platforms: - platform_label = self.platform_labels_mapping[platform_key] - child_item = { - "key": platform_key, - "label": platform_label - } - if self.multipath: - child_item["type"] = "list" - child_item["object_type"] = { - "type": "path-input", - "placeholder": placeholder_text - } - else: - child_item["type"] = "path-input" - child_item["placeholder"] = placeholder_text - - item_schema["children"].append(child_item) - - self.valid_value_types = valid_value_types - self.child_obj = self.create_schema_object(item_schema, self) - - def collect_static_entities_by_path(self): - return self.child_obj.collect_static_entities_by_path() - - def get_child_path(self, _child_obj): - return self.path - - def set(self, value): - self.child_obj.set(value) - - def collect_dynamic_schema_entities(self, *args, **kwargs): - self.child_obj.collect_dynamic_schema_entities(*args, **kwargs) - - def settings_value(self): - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if self.is_group: - if self._override_state is OverrideState.STUDIO: - if not self.has_studio_override: - return NOT_SET - elif self._override_state is OverrideState.PROJECT: - if not self.has_project_override: - return NOT_SET - - return self.child_obj.settings_value() - - def on_change(self): - for callback in self.on_change_callbacks: - callback() - self.parent.on_child_change(self) - - def on_child_change(self, _child_obj): - self.on_change() - - @property - def has_unsaved_changes(self): - return self.child_obj.has_unsaved_changes - - @property - def has_studio_override(self): - return self.child_obj.has_studio_override - - @property - def has_project_override(self): - return self.child_obj.has_project_override - - @property - def value(self): - return self.child_obj.value - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - self.child_obj.set_override_state(state, ignore_missing_defaults) - - def update_default_value(self, value, log_invalid_types=True): - self._default_log_invalid_types = log_invalid_types - self.child_obj.update_default_value(value, log_invalid_types) - - def update_project_value(self, value, log_invalid_types=True): - self._studio_log_invalid_types = log_invalid_types - self.child_obj.update_project_value(value, log_invalid_types) - - def update_studio_value(self, value, log_invalid_types=True): - self._project_log_invalid_types = log_invalid_types - self.child_obj.update_studio_value(value, log_invalid_types) - - def _discard_changes(self, *args, **kwargs): - self.child_obj.discard_changes(*args, **kwargs) - - def _add_to_studio_default(self, *args, **kwargs): - self.child_obj.add_to_studio_default(*args, **kwargs) - - def _remove_from_studio_default(self, *args, **kwargs): - self.child_obj.remove_from_studio_default(*args, **kwargs) - - def _add_to_project_override(self, *args, **kwargs): - self.child_obj.add_to_project_override(*args, **kwargs) - - def _remove_from_project_override(self, *args, **kwargs): - self.child_obj.remove_from_project_override(*args, **kwargs) - - def reset_callbacks(self): - super(PathEntity, self).reset_callbacks() - self.child_obj.reset_callbacks() - - -class ListStrictEntity(ItemEntity): - schema_types = ["list-strict"] - _key_regex = re.compile(r"[0-9]+") - - def __getitem__(self, idx): - if not isinstance(idx, int): - idx = int(idx) - return self.children[idx] - - def __setitem__(self, idx, value): - if not isinstance(idx, int): - idx = int(idx) - self.children[idx].set(value) - - def get(self, idx, default=None): - if not isinstance(idx, int): - idx = int(idx) - - if idx < len(self.children): - return self.children[idx] - return default - - def has_child_with_key(self, key): - if ( - key - and isinstance(key, six.string_types) - and self._key_regex.match(key) - ): - key = int(key) - - if not isinstance(key, int): - return False - - return 0 <= key < len(self.children) - - def _item_initialization(self): - self.valid_value_types = (list, ) - self.require_key = True - - self.initial_value = None - - self._ignore_child_changes = False - - # Child items - self.object_types = self.schema_data["object_types"] - - self.children = [] - for children_schema in self.object_types: - child_obj = self.create_schema_object(children_schema, self, True) - self.children.append(child_obj) - - # GUI attribute - self.is_horizontal = self.schema_data.get("horizontal", True) - if self.group_item is None and not self.is_group: - self.is_group = True - - def schema_validations(self): - # List entity must have file parent. - if ( - not self.is_dynamic_schema_node - and not self.is_in_dynamic_schema_node - and not self.is_file - and self.file_item is None - ): - raise EntitySchemaError( - self, "Missing file entity in hierarchy." - ) - - super(ListStrictEntity, self).schema_validations() - - def collect_static_entities_by_path(self): - output = {} - if self.is_dynamic_item or self.is_in_dynamic_item: - return output - - output[self.path] = self - for child_obj in self.children: - result = child_obj.collect_static_entities_by_path() - if result: - output.update(result) - return output - - def get_child_path(self, child_obj): - result_idx = None - for idx, _child_obj in enumerate(self.children): - if _child_obj is child_obj: - result_idx = idx - break - - if result_idx is None: - raise ValueError("Didn't find child {}".format(child_obj)) - - return "/".join([self.path, str(result_idx)]) - - @property - def value(self): - output = [] - for child_obj in self.children: - output.append(child_obj.value) - return output - - def set(self, value): - new_value = self.convert_to_valid_type(value) - for idx, item in enumerate(new_value): - self.children[idx].set(item) - - def collect_dynamic_schema_entities(self, collector): - if self.is_dynamic_schema_node: - collector.add_entity(self) - - def settings_value(self): - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if ( - self.is_group - and self._override_state is not OverrideState.DEFAULTS - ): - if self._override_state is OverrideState.STUDIO: - if not self.has_studio_override: - return NOT_SET - elif self._override_state is OverrideState.PROJECT: - if not self.has_project_override: - return NOT_SET - - output = [] - for child_obj in self.children: - output.append(child_obj.settings_value()) - return output - - def on_change(self): - for callback in self.on_change_callbacks: - callback() - self.parent.on_child_change(self) - - def on_child_change(self, _child_obj): - if self._ignore_child_changes: - return - - if self._override_state is OverrideState.STUDIO: - self._has_studio_override = self._child_has_studio_override - elif self._override_state is OverrideState.PROJECT: - self._has_project_override = self._child_has_project_override - - self.on_change() - - @property - def has_unsaved_changes(self): - if self._override_state is OverrideState.NOT_DEFINED: - return False - - if self._override_state is OverrideState.DEFAULTS: - if not self.has_default_value: - return True - - elif self._override_state is OverrideState.STUDIO: - if self.had_studio_override != self._has_studio_override: - return True - - if not self._has_studio_override and not self.has_default_value: - return True - - elif self._override_state is OverrideState.PROJECT: - if self.had_project_override != self._has_project_override: - return True - - if ( - not self._has_project_override - and not self._has_studio_override - and not self.has_default_value - ): - return True - - if self._child_has_unsaved_changes: - return True - - if self.settings_value() != self.initial_value: - return True - return False - - @property - def has_studio_override(self): - return self._has_studio_override or self._child_has_studio_override - - @property - def has_project_override(self): - return self._has_project_override or self._child_has_project_override - - @property - def _child_has_unsaved_changes(self): - for child_obj in self.children: - if child_obj.has_unsaved_changes: - return True - return False - - @property - def _child_has_studio_override(self): - for child_obj in self.children: - if child_obj.has_studio_override: - return True - return False - - @property - def _child_has_project_override(self): - for child_obj in self.children: - if child_obj.has_project_override: - return True - return False - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - # Ignore if is dynamic item and use default in that case - if not self.is_dynamic_item and not self.is_in_dynamic_item: - if state > OverrideState.DEFAULTS: - if ( - not self.has_default_value - and not ignore_missing_defaults - ): - raise DefaultsNotDefined(self) - - elif state > OverrideState.STUDIO: - if ( - not self.had_studio_override - and not ignore_missing_defaults - ): - raise StudioDefaultsNotDefined(self) - - for child_entity in self.children: - child_entity.set_override_state(state, ignore_missing_defaults) - - self.initial_value = self.settings_value() - - def _discard_changes(self, on_change_trigger): - for child_obj in self.children: - child_obj.discard_changes(on_change_trigger) - - def _add_to_studio_default(self, _on_change_trigger): - self._has_studio_override = True - self.on_change() - - def _remove_from_studio_default(self, on_change_trigger): - self._ignore_child_changes = True - - for child_obj in self.children: - child_obj.remove_from_studio_default(on_change_trigger) - - self._ignore_child_changes = False - - self._has_studio_override = False - - def _add_to_project_override(self, _on_change_trigger): - self._has_project_override = True - self.on_change() - - def _remove_from_project_override(self, on_change_trigger): - self._ignore_child_changes = True - - for child_obj in self.children: - child_obj.remove_from_project_override(on_change_trigger) - - self._ignore_child_changes = False - - self._has_project_override = False - - def _check_update_value(self, value, value_type, log_invalid_types=True): - value = super(ListStrictEntity, self)._check_update_value( - value, value_type, log_invalid_types - ) - if value is NOT_SET: - return value - - child_len = len(self.children) - value_len = len(value) - if value_len == child_len: - return value - - if log_invalid_types: - self.log.warning( - ( - "{} Amount of strict list items in {} values is not same" - " as expected. Expected {} items. Got {} items. {}" - ).format( - self.path, value_type, - child_len, value_len, str(value) - ) - ) - - if value_len < child_len: - # Fill missing values with NOT_SET - for _ in range(child_len - value_len): - value.append(NOT_SET) - else: - # Pop values that are overloaded - for _ in range(value_len - child_len): - value.pop(child_len) - return value - - def update_default_value(self, value, log_invalid_types=True): - self._default_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "default", log_invalid_types - ) - self.has_default_value = value is not NOT_SET - if value is NOT_SET: - for child_obj in self.children: - child_obj.update_default_value(value, log_invalid_types) - - else: - for idx, item_value in enumerate(value): - self.children[idx].update_default_value( - item_value, log_invalid_types - ) - - def update_studio_value(self, value, log_invalid_types=True): - self._studio_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "studio override", log_invalid_types - ) - if value is NOT_SET: - for child_obj in self.children: - child_obj.update_studio_value(value, log_invalid_types) - - else: - for idx, item_value in enumerate(value): - self.children[idx].update_studio_value( - item_value, log_invalid_types - ) - - def update_project_value(self, value, log_invalid_types=True): - self._project_log_invalid_types = log_invalid_types - value = self._check_update_value( - value, "project override", log_invalid_types - ) - if value is NOT_SET: - for child_obj in self.children: - child_obj.update_project_value(value, log_invalid_types) - - else: - for idx, item_value in enumerate(value): - self.children[idx].update_project_value( - item_value, log_invalid_types - ) - - def reset_callbacks(self): - super(ListStrictEntity, self).reset_callbacks() - for child_obj in self.children: - child_obj.reset_callbacks() diff --git a/client/ayon_core/settings/entities/lib.py b/client/ayon_core/settings/entities/lib.py deleted file mode 100644 index a04a98b230..0000000000 --- a/client/ayon_core/settings/entities/lib.py +++ /dev/null @@ -1,777 +0,0 @@ -import os -import re -import json -import copy -import inspect -import collections -import contextlib - -from .exceptions import ( - SchemaTemplateMissingKeys, - SchemaDuplicatedEnvGroupKeys -) - -from ayon_core.settings.constants import ( - SYSTEM_SETTINGS_KEY, - PROJECT_SETTINGS_KEY, - SCHEMA_KEY_SYSTEM_SETTINGS, - SCHEMA_KEY_PROJECT_SETTINGS -) -try: - STRING_TYPE = basestring -except Exception: - STRING_TYPE = str - -WRAPPER_TYPES = ["form", "collapsible-wrap"] -NOT_SET = type("NOT_SET", (), {"__bool__": lambda obj: False})() -OVERRIDE_VERSION = 1 - -DEFAULT_VALUES_KEY = "__default_values__" -TEMPLATE_METADATA_KEYS = ( - DEFAULT_VALUES_KEY, -) - -SCHEMA_EXTEND_TYPES = ( - "schema", "template", "schema_template", "dynamic_schema" -) - -template_key_pattern = re.compile(r"(\{.*?[^{0]*\})") - - -class OverrideStateItem: - """Object used as item for `OverrideState` enum. - - Used object to be able use exact object comparison and value comparisons. - """ - values = set() - - def __init__(self, value, name): - self.name = name - if value in self.__class__.values: - raise ValueError( - "Implementation bug: Override State with same value as other." - ) - self.__class__.values.add(value) - self.value = value - - def __repr__(self): - return " {} {}".format( - self.__class__.__name__, self.value, self.name - ) - - def __eq__(self, other): - """Defines behavior for the equality operator, ==.""" - if isinstance(other, OverrideStateItem): - return self.value == other.value - return self.value == other - - def __gt__(self, other): - """Defines behavior for the greater-than operator, >.""" - if isinstance(other, OverrideStateItem): - return self.value > other.value - return self.value > other - - def __lt__(self, other): - """Defines behavior for the less-than operator, <.""" - if isinstance(other, OverrideStateItem): - return self.value < other.value - return self.value < other - - def __le__(self, other): - """Defines behavior for the less-than-or-equal-to operator, <=.""" - if isinstance(other, OverrideStateItem): - return self.value == other.value or self.value < other.value - return self.value == other or self.value < other - - def __ge__(self, other): - """Defines behavior for the greater-than-or-equal-to operator, >=.""" - if isinstance(other, OverrideStateItem): - return self.value == other.value or self.value > other.value - return self.value == other or self.value > other - - -class OverrideState: - """Enumeration of override states. - - Each state have unique value. - - Currently has 4 states: - - NOT_DEFINED - Initial state will raise an error if want to access - anything in entity. - - DEFAULTS - Entity cares only about default values. It is not - possible to set higher state if any entity does not have filled - default value. - - STUDIO - First layer of overrides. Hold only studio overridden values - that are applied on top of defaults. - - PROJECT - Second layer of overrides. Hold only project overrides that are - applied on top of defaults and studio overrides. - """ - NOT_DEFINED = OverrideStateItem(-1, "Not defined") - DEFAULTS = OverrideStateItem(0, "Defaults") - STUDIO = OverrideStateItem(1, "Studio overrides") - PROJECT = OverrideStateItem(2, "Project Overrides") - - -class SchemasHub: - def __init__(self, schema_type, reset=True): - self._schema_type = schema_type - - self._loaded_types = {} - self._gui_types = tuple() - - self._crashed_on_load = {} - self._loaded_templates = {} - self._loaded_schemas = {} - - # Attributes for modules settings - self._dynamic_schemas_defs_by_id = {} - self._dynamic_schemas_by_id = {} - - # Store validating and validated dynamic template or schemas - self._validating_dynamic = set() - self._validated_dynamic = set() - - # Trigger reset - if reset: - self.reset() - - @property - def schema_type(self): - return self._schema_type - - def reset(self): - self._load_modules_settings_defs() - self._load_types() - self._load_schemas() - - def _load_modules_settings_defs(self): - from ayon_core.modules import get_module_settings_defs - - module_settings_defs = get_module_settings_defs() - for module_settings_def_cls in module_settings_defs: - module_settings_def = module_settings_def_cls() - def_id = module_settings_def.id - self._dynamic_schemas_defs_by_id[def_id] = module_settings_def - - @property - def gui_types(self): - return self._gui_types - - def resolve_dynamic_schema(self, dynamic_key): - output = [] - for def_id, def_keys in self._dynamic_schemas_by_id.items(): - if dynamic_key in def_keys: - def_schema = def_keys[dynamic_key] - if not def_schema: - continue - - if isinstance(def_schema, dict): - def_schema = [def_schema] - - all_def_schema = [] - for item in def_schema: - items = self.resolve_schema_data(item) - for _item in items: - _item["_dynamic_schema_id"] = def_id - all_def_schema.extend(items) - output.extend(all_def_schema) - return output - - def get_template_name(self, item_def, default=None): - """Get template name from passed item definition. - - Args: - item_def(dict): Definition of item with "type". - default(object): Default return value. - """ - output = default - if not item_def or not isinstance(item_def, dict): - return output - - item_type = item_def.get("type") - if item_type in ("template", "schema_template"): - output = item_def["name"] - return output - - def is_dynamic_template_validating(self, template_name): - """Is template validating using different entity. - - Returns: - bool: Is template validating. - """ - if template_name in self._validating_dynamic: - return True - return False - - def is_dynamic_template_validated(self, template_name): - """Is template already validated. - - Returns: - bool: Is template validated. - """ - - if template_name in self._validated_dynamic: - return True - return False - - @contextlib.contextmanager - def validating_dynamic(self, template_name): - """Template name is validating and validated. - - Context manager that cares about storing template name validations of - template. - - This is to avoid infinite loop of dynamic children validation. - """ - self._validating_dynamic.add(template_name) - try: - yield - self._validated_dynamic.add(template_name) - - finally: - self._validating_dynamic.remove(template_name) - - def get_schema(self, schema_name): - """Get schema definition data by it's name. - - Returns: - dict: Copy of schema loaded from json files. - - Raises: - KeyError: When schema name is stored in loaded templates or json - file was not possible to parse or when schema name was not - found. - """ - if schema_name not in self._loaded_schemas: - if schema_name in self._loaded_templates: - raise KeyError(( - "Template \"{}\" is used as `schema`" - ).format(schema_name)) - - elif schema_name in self._crashed_on_load: - crashed_item = self._crashed_on_load[schema_name] - raise KeyError( - "Unable to parse schema file \"{}\". {}".format( - crashed_item["filepath"], crashed_item["message"] - ) - ) - - raise KeyError( - "Schema \"{}\" was not found".format(schema_name) - ) - return copy.deepcopy(self._loaded_schemas[schema_name]) - - def get_template(self, template_name): - """Get template definition data by it's name. - - Returns: - list: Copy of template items loaded from json files. - - Raises: - KeyError: When template name is stored in loaded schemas or json - file was not possible to parse or when template name was not - found. - """ - if template_name not in self._loaded_templates: - if template_name in self._loaded_schemas: - raise KeyError(( - "Schema \"{}\" is used as `template`" - ).format(template_name)) - - elif template_name in self._crashed_on_load: - crashed_item = self._crashed_on_load[template_name] - raise KeyError( - "Unable to parse template file \"{}\". {}".format( - crashed_item["filepath"], crashed_item["message"] - ) - ) - - raise KeyError( - "Template \"{}\" was not found".format(template_name) - ) - return copy.deepcopy(self._loaded_templates[template_name]) - - def resolve_schema_data(self, schema_data): - """Resolve single item schema data as few types can be expanded. - - This is mainly for 'schema' and 'template' types. Type 'schema' does - not have entity representation and 'template' may contain more than one - output schemas. - - In other cases is retuned passed schema item in list. - - Goal is to have schema and template resolving at one place. - - Returns: - list: Resolved schema data. - """ - schema_type = schema_data["type"] - if schema_type not in SCHEMA_EXTEND_TYPES: - return [schema_data] - - if schema_type == "schema": - return self.resolve_schema_data( - self.get_schema(schema_data["name"]) - ) - - if schema_type == "dynamic_schema": - return self.resolve_dynamic_schema(schema_data["name"]) - - template_name = schema_data["name"] - template_def = self.get_template(template_name) - - filled_template = self._fill_template( - schema_data, template_def - ) - new_template_def = [] - for item in filled_template: - new_template_def.extend(self.resolve_schema_data(item)) - return new_template_def - - def create_schema_object(self, schema_data, *args, **kwargs): - """Create entity for passed schema data. - - Args: - schema_data(dict): Schema definition of settings entity. - - Returns: - ItemEntity: Created entity for passed schema data item. - - Raises: - ValueError: When 'schema', 'template' or any of wrapper types are - passed. - KeyError: When type of passed schema is not known. - """ - schema_type = schema_data["type"] - if schema_type in ("schema", "template", "schema_template"): - raise ValueError( - "Got unresolved schema data of type \"{}\"".format(schema_type) - ) - - if schema_type in WRAPPER_TYPES: - raise ValueError(( - "Function `create_schema_object` can't create entities" - " of any wrapper type. Got type: \"{}\"" - ).format(schema_type)) - - klass = self._loaded_types.get(schema_type) - if not klass: - raise KeyError("Unknown type \"{}\"".format(schema_type)) - - return klass(schema_data, *args, **kwargs) - - def _load_types(self): - """Prepare entity types for cretion of their objects. - - Currently all classes in `ayon_core.settings.entities` that inherited - from `BaseEntity` are stored as loaded types. GUI types are stored to - separated attribute to not mess up api access of entities. - - TODOs: - Add more dynamic way how to add custom types from anywhere and - better handling of abstract classes. Skipping them is dangerous. - """ - - from ayon_core.settings import entities - - # Define known abstract classes - known_abstract_classes = ( - entities.BaseEntity, - entities.BaseItemEntity, - entities.ItemEntity, - entities.EndpointEntity, - entities.InputEntity, - entities.BaseEnumEntity - ) - - self._loaded_types = {} - _gui_types = [] - for attr in dir(entities): - item = getattr(entities, attr) - # Filter classes - if not inspect.isclass(item): - continue - - # Skip classes that do not inherit from BaseEntity - if not issubclass(item, entities.BaseEntity): - continue - - # Skip class that is abstract by design - if item in known_abstract_classes: - continue - - if inspect.isabstract(item): - # Create an object to get crash and get traceback - item() - - # Backwards compatibility - # Single entity may have multiple schema types - for schema_type in item.schema_types: - self._loaded_types[schema_type] = item - - if item.gui_type: - _gui_types.append(item) - self._gui_types = tuple(_gui_types) - - def _load_schemas(self): - """Load schema definitions from json files.""" - - # Refresh all affecting variables - self._crashed_on_load = {} - self._loaded_templates = {} - self._loaded_schemas = {} - self._dynamic_schemas_by_id = {} - - dirpath = os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "schemas", - self.schema_type - ) - loaded_schemas = {} - loaded_templates = {} - dynamic_schemas_by_id = {} - for root, _, filenames in os.walk(dirpath): - for filename in filenames: - basename, ext = os.path.splitext(filename) - if ext != ".json": - continue - - filepath = os.path.join(root, filename) - with open(filepath, "r") as json_stream: - try: - schema_data = json.load(json_stream) - except Exception as exc: - msg = str(exc) - print("Unable to parse JSON file {}\n{}".format( - filepath, msg - )) - self._crashed_on_load[basename] = { - "filepath": filepath, - "message": msg - } - continue - - if basename in self._crashed_on_load: - crashed_item = self._crashed_on_load[basename] - raise KeyError(( - "Duplicated filename \"{}\"." - " One of them crashed on load \"{}\" {}" - ).format( - filename, - crashed_item["filepath"], - crashed_item["message"] - )) - - if isinstance(schema_data, list): - if basename in loaded_templates: - raise KeyError( - "Duplicated template filename \"{}\"".format( - filename - ) - ) - loaded_templates[basename] = schema_data - else: - if basename in loaded_schemas: - raise KeyError( - "Duplicated schema filename \"{}\"".format( - filename - ) - ) - loaded_schemas[basename] = schema_data - - defs_iter = self._dynamic_schemas_defs_by_id.items() - for def_id, module_settings_def in defs_iter: - dynamic_schemas_by_id[def_id] = ( - module_settings_def.get_dynamic_schemas(self.schema_type) - ) - module_schemas = module_settings_def.get_settings_schemas( - self.schema_type - ) - for key, schema_data in module_schemas.items(): - if isinstance(schema_data, list): - if key in loaded_templates: - raise KeyError( - "Duplicated template key \"{}\"".format(key) - ) - loaded_templates[key] = schema_data - else: - if key in loaded_schemas: - raise KeyError( - "Duplicated schema key \"{}\"".format(key) - ) - loaded_schemas[key] = schema_data - - self._loaded_templates = loaded_templates - self._loaded_schemas = loaded_schemas - self._dynamic_schemas_by_id = dynamic_schemas_by_id - - def get_dynamic_modules_settings_defs(self, schema_def_id): - return self._dynamic_schemas_defs_by_id.get(schema_def_id) - - def _fill_template(self, child_data, template_def): - """Fill template based on schema definition and template definition. - - Based on `child_data` is `template_def` modified and result is - returned. - - Template definition may have defined data to fill which - should be filled with data from child data. - - Child data may contain more than one output definition of an template. - - Child data can define paths to skip. Path is full path of an item - which won't be returned. - - TODO: - Be able to handle wrapper items here. - - Args: - child_data(dict): Schema data of template item. - template_def(dict): Template definition that will be filled with - child_data. - - Returns: - list: Resolved template always returns list of schemas. - """ - template_name = child_data["name"] - - # Default value must be dictionary (NOT list) - # - empty list would not add any item if `template_data` are not filled - template_data = child_data.get("template_data") or {} - if isinstance(template_data, dict): - template_data = [template_data] - - skip_paths = child_data.get("skip_paths") or [] - if isinstance(skip_paths, STRING_TYPE): - skip_paths = [skip_paths] - - output = [] - for single_template_data in template_data: - try: - output.extend(self._fill_template_data( - template_def, single_template_data, skip_paths - )) - - except SchemaTemplateMissingKeys as exc: - raise SchemaTemplateMissingKeys( - exc.missing_keys, exc.required_keys, template_name - ) - return output - - def _fill_template_data( - self, - template, - template_data, - skip_paths, - required_keys=None, - missing_keys=None - ): - """Fill template values with data from schema data. - - Template has more abilities than schemas. It is expected that template - will be used at multiple places (but may not). Schema represents - exactly one entity and it's children but template may represent more - entities. - - Template can have "keys to fill" from their definition. Some key may be - required and some may be optional because template has their default - values defined. - - Template also have ability to "skip paths" which means to skip entities - from it's content. A template can be used across multiple places with - different requirements. - - Raises: - SchemaTemplateMissingKeys: When fill data do not contain all - required keys for template. - """ - first = False - if required_keys is None: - first = True - - if "skip_paths" in template_data: - skip_paths = template_data["skip_paths"] - if not isinstance(skip_paths, list): - skip_paths = [skip_paths] - - # Cleanup skip paths (skip empty values) - skip_paths = [path for path in skip_paths if path] - - required_keys = set() - missing_keys = set() - - # Copy template data as content may change - template = copy.deepcopy(template) - - # Get metadata item from template - metadata_item = self._pop_metadata_item(template) - - # Check for default values for template data - default_values = metadata_item.get(DEFAULT_VALUES_KEY) or {} - - for key, value in default_values.items(): - if key not in template_data: - template_data[key] = value - - if not template: - output = template - - elif isinstance(template, list): - # Store paths by first part if path - # - None value says that whole key should be skipped - skip_paths_by_first_key = {} - for path in skip_paths: - parts = path.split("/") - key = parts.pop(0) - if key not in skip_paths_by_first_key: - skip_paths_by_first_key[key] = [] - - value = "/".join(parts) - skip_paths_by_first_key[key].append(value or None) - - output = [] - for item in template: - # Get skip paths for children item - _skip_paths = [] - if not isinstance(item, dict): - pass - - elif item.get("type") in WRAPPER_TYPES: - _skip_paths = copy.deepcopy(skip_paths) - - elif skip_paths_by_first_key: - # Check if this item should be skipped - key = item.get("key") - if key and key in skip_paths_by_first_key: - _skip_paths = skip_paths_by_first_key[key] - # Skip whole item if None is in skip paths value - if None in _skip_paths: - continue - - output_item = self._fill_template_data( - item, - template_data, - _skip_paths, - required_keys, - missing_keys - ) - if output_item: - output.append(output_item) - - elif isinstance(template, dict): - output = {} - for key, value in template.items(): - output[key] = self._fill_template_data( - value, - template_data, - skip_paths, - required_keys, - missing_keys - ) - if ( - output.get("type") in WRAPPER_TYPES - and not output.get("children") - ): - return {} - - elif isinstance(template, STRING_TYPE): - # TODO find much better way how to handle filling template data - template = ( - template - .replace("{{", "__dbcb__") - .replace("}}", "__decb__") - ) - full_replacement = False - for replacement_string in template_key_pattern.findall(template): - key = str(replacement_string[1:-1]) - required_keys.add(key) - if key not in template_data: - missing_keys.add(key) - continue - - value = template_data[key] - if replacement_string == template: - # Replace the value with value from templates data - # - with this is possible to set value with different type - template = value - full_replacement = True - else: - # Only replace the key in string - template = template.replace(replacement_string, value) - - if not full_replacement: - output = ( - template - .replace("__dbcb__", "{") - .replace("__decb__", "}") - ) - else: - output = template - - else: - output = template - - if first and missing_keys: - raise SchemaTemplateMissingKeys(missing_keys, required_keys) - - return output - - def _pop_metadata_item(self, template_def): - """Pop template metadata from template definition. - - Template metadata may define default values if are not passed from - schema data. - """ - - found_idx = None - for idx, item in enumerate(template_def): - if not isinstance(item, dict): - continue - - for key in TEMPLATE_METADATA_KEYS: - if key in item: - found_idx = idx - break - - if found_idx is not None: - break - - metadata_item = {} - if found_idx is not None: - metadata_item = template_def.pop(found_idx) - return metadata_item - - -class DynamicSchemaValueCollector: - # Map schema hub type to store keys - schema_hub_type_map = { - SCHEMA_KEY_SYSTEM_SETTINGS: SYSTEM_SETTINGS_KEY, - SCHEMA_KEY_PROJECT_SETTINGS: PROJECT_SETTINGS_KEY - } - - def __init__(self, schema_hub): - self._schema_hub = schema_hub - self._dynamic_entities = [] - - def add_entity(self, entity): - self._dynamic_entities.append(entity) - - def create_hierarchy(self): - output = collections.defaultdict(dict) - for entity in self._dynamic_entities: - output[entity.dynamic_schema_id][entity.path] = ( - entity.settings_value() - ) - return output - - def save_values(self): - hierarchy = self.create_hierarchy() - - for schema_def_id, schema_def_value in hierarchy.items(): - schema_def = self._schema_hub.get_dynamic_modules_settings_defs( - schema_def_id - ) - top_key = self.schema_hub_type_map.get( - self._schema_hub.schema_type - ) - schema_def.save_defaults(top_key, schema_def_value) diff --git a/client/ayon_core/settings/entities/list_entity.py b/client/ayon_core/settings/entities/list_entity.py deleted file mode 100644 index d9a18e0177..0000000000 --- a/client/ayon_core/settings/entities/list_entity.py +++ /dev/null @@ -1,579 +0,0 @@ -import copy -import six -import re -from . import ( - BaseEntity, - EndpointEntity -) -from .lib import ( - NOT_SET, - OverrideState -) -from .exceptions import ( - DefaultsNotDefined, - StudioDefaultsNotDefined, - EntitySchemaError -) - - -class ListEntity(EndpointEntity): - schema_types = ["list"] - _default_label_wrap = { - "use_label_wrap": False, - "collapsible": True, - "collapsed": False - } - _key_regex = re.compile(r"[0-9]+") - - def __iter__(self): - for item in self.children: - yield item - - def __bool__(self): - """Returns true because len may return 0.""" - return True - - def __len__(self): - return len(self.children) - - def __contains__(self, item): - if isinstance(item, BaseEntity): - for child_entity in self.children: - if child_entity.id == item.id: - return True - return False - - for _item in self.value: - if item == _item: - return True - return False - - def __getitem__(self, idx): - if not isinstance(idx, int): - idx = int(idx) - return self.children[idx] - - def __setitem__(self, idx, value): - if not isinstance(idx, int): - idx = int(idx) - self.children[idx].set(value) - - def get(self, idx, default=None): - if not isinstance(idx, int): - idx = int(idx) - - if idx < len(self.children): - return self.children[idx] - return default - - def index(self, item): - if isinstance(item, BaseEntity): - for idx, child_entity in enumerate(self.children): - if child_entity.id == item.id: - return idx - else: - for idx, _item in enumerate(self.value): - if item == _item: - return idx - raise ValueError( - "{} is not in {}".format(item, self.__class__.__name__) - ) - - def append(self, item): - child_obj = self.add_new_item(trigger_change=False) - child_obj.set(item) - self.on_child_change(child_obj) - - def extend(self, items): - for item in items: - self.append(item) - - def clear(self): - if not self.children: - return - - first_item = self.children.pop(0) - while self.children: - self.children.pop(0) - self.on_child_change(first_item) - - def pop(self, idx): - item = self.children.pop(idx) - self.on_child_change(item) - return item - - def remove(self, item): - try: - self.pop(self.index(item)) - except ValueError: - raise ValueError("ListEntity.remove(x): x not in ListEntity") - - def insert(self, idx, item): - child_obj = self.add_new_item(idx, trigger_change=False) - child_obj.set(item) - self.on_child_change(child_obj) - - def _add_new_item(self, idx=None): - child_obj = self.create_schema_object(self.item_schema, self, True) - if idx is None: - self.children.append(child_obj) - else: - self.children.insert(idx, child_obj) - return child_obj - - def add_new_item(self, idx=None, trigger_change=True): - child_obj = self._add_new_item(idx) - child_obj.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - - if trigger_change: - self.on_child_change(child_obj) - return child_obj - - def swap_items(self, item_1, item_2): - index_1 = self.index(item_1) - index_2 = self.index(item_2) - self.swap_indexes(index_1, index_2) - - def swap_indexes(self, index_1, index_2): - children_len = len(self.children) - if index_1 > children_len or index_2 > children_len: - raise IndexError( - "{} index out of range".format(self.__class__.__name__) - ) - self.children[index_1], self.children[index_2] = ( - self.children[index_2], self.children[index_1] - ) - self.on_change() - - def has_child_with_key(self, key): - if ( - key - and isinstance(key, six.string_types) - and self._key_regex.match(key) - ): - key = int(key) - - if not isinstance(key, int): - return False - - return 0 <= key < len(self.children) - - def _convert_to_valid_type(self, value): - if isinstance(value, (set, tuple)): - return list(value) - return NOT_SET - - def _item_initialization(self): - self.valid_value_types = (list, ) - self.children = [] - self.value_on_not_set = [] - - self._ignore_child_changes = False - - item_schema = self.schema_data["object_type"] - if not isinstance(item_schema, dict): - item_schema = {"type": item_schema} - - obj_template_name = self.schema_hub.get_template_name(item_schema) - _item_schemas = self.schema_hub.resolve_schema_data(item_schema) - if len(_item_schemas) == 1: - self.item_schema = _item_schemas[0] - if self.item_schema != item_schema: - if "label" in self.item_schema: - self.item_schema.pop("label") - self.item_schema["use_label_wrap"] = False - else: - self.item_schema = _item_schemas - - # Store if was used template or schema - self._obj_template_name = obj_template_name - - if self.group_item is None: - self.is_group = True - - # Value that was set on set_override_state - self.initial_value = [] - - def schema_validations(self): - if isinstance(self.item_schema, list): - reason = ( - "`ListWidget` has multiple items as object type." - ) - raise EntitySchemaError(self, reason) - - super(ListEntity, self).schema_validations() - - if self.is_dynamic_item and self.use_label_wrap: - reason = ( - "`ListWidget` can't have set `use_label_wrap` to True and" - " be used as widget at the same time." - ) - raise EntitySchemaError(self, reason) - - if self.use_label_wrap and not self.label: - reason = ( - "`ListWidget` can't have set `use_label_wrap` to True and" - " not have set \"label\" key at the same time." - ) - raise EntitySchemaError(self, reason) - - # Validate object type schema - validate_children = True - for child_entity in self.children: - child_entity.schema_validations() - validate_children = False - break - - if validate_children and self._obj_template_name: - _validated = self.schema_hub.is_dynamic_template_validated( - self._obj_template_name - ) - _validating = self.schema_hub.is_dynamic_template_validating( - self._obj_template_name - ) - validate_children = not _validated and not _validating - - if not validate_children: - return - - def _validate(): - idx = 0 - tmp_child = self._add_new_item(idx) - tmp_child.schema_validations() - self.children.pop(idx) - - if self._obj_template_name: - with self.schema_hub.validating_dynamic(self._obj_template_name): - _validate() - else: - _validate() - - def get_child_path(self, child_obj): - result_idx = None - for idx, _child_obj in enumerate(self.children): - if _child_obj is child_obj: - result_idx = idx - break - - if result_idx is None: - raise ValueError("Didn't find child {}".format(child_obj)) - - return "/".join([self.path, str(result_idx)]) - - def set(self, value): - new_value = self.convert_to_valid_type(value) - self.clear() - for item in new_value: - self.append(item) - - def on_child_change(self, _child_entity): - if self._ignore_child_changes: - return - - if self._override_state is OverrideState.STUDIO: - self._has_studio_override = True - elif self._override_state is OverrideState.PROJECT: - self._has_project_override = True - self.on_change() - - def set_override_state(self, state, ignore_missing_defaults): - # Trigger override state change of root if is not same - if self.root_item.override_state is not state: - self.root_item.set_override_state(state) - return - - self._override_state = state - self._ignore_missing_defaults = ignore_missing_defaults - - while self.children: - self.children.pop(0) - - # Ignore if is dynamic item and use default in that case - if not self.is_dynamic_item and not self.is_in_dynamic_item: - if state > OverrideState.DEFAULTS: - if ( - not self.has_default_value - and not ignore_missing_defaults - ): - raise DefaultsNotDefined(self) - - elif state > OverrideState.STUDIO: - if ( - not self.had_studio_override - and not ignore_missing_defaults - ): - raise StudioDefaultsNotDefined(self) - - value = NOT_SET - if self._override_state is OverrideState.PROJECT: - if self.had_project_override: - value = self._project_override_value - self._has_project_override = self.had_project_override - - if value is NOT_SET or self._override_state is OverrideState.STUDIO: - if self.had_studio_override: - value = self._studio_override_value - self._has_studio_override = self.had_studio_override - - if value is NOT_SET or self._override_state is OverrideState.DEFAULTS: - if self.has_default_value: - value = self._default_value - else: - value = self.value_on_not_set - - for item in value: - child_obj = self._add_new_item() - child_obj.update_default_value( - item, self._default_log_invalid_types - ) - if self._override_state is OverrideState.PROJECT: - if self.had_project_override: - child_obj.update_project_value( - item, self._project_log_invalid_types - ) - elif self.had_studio_override: - child_obj.update_studio_value( - item, self._studio_log_invalid_types - ) - - elif self._override_state is OverrideState.STUDIO: - if self.had_studio_override: - child_obj.update_studio_value( - item, self._studio_log_invalid_types - ) - - for child_obj in self.children: - child_obj.set_override_state( - self._override_state, ignore_missing_defaults - ) - - self.initial_value = self.settings_value() - - @property - def value(self): - output = [] - for child_obj in self.children: - output.append(child_obj.value) - return output - - @property - def has_unsaved_changes(self): - if self._override_state is OverrideState.NOT_DEFINED: - return False - - if self._override_state is OverrideState.DEFAULTS: - if not self.has_default_value: - return True - - elif self._override_state is OverrideState.STUDIO: - if self.had_studio_override != self._has_studio_override: - return True - - if not self._has_studio_override and not self.has_default_value: - return True - - elif self._override_state is OverrideState.PROJECT: - if self.had_project_override != self._has_project_override: - return True - - if ( - not self._has_project_override - and not self._has_studio_override - and not self.has_default_value - ): - return True - - if self._child_has_unsaved_changes: - return True - - if self.settings_value() != self.initial_value: - return True - return False - - @property - def has_studio_override(self): - if self._override_state >= OverrideState.STUDIO: - return ( - self._has_studio_override - or self._child_has_studio_override - ) - return False - - @property - def has_project_override(self): - if self._override_state >= OverrideState.PROJECT: - return ( - self._has_project_override - or self._child_has_project_override - ) - return False - - @property - def _child_has_unsaved_changes(self): - for child_obj in self.children: - if child_obj.has_unsaved_changes: - return True - return False - - @property - def _child_has_studio_override(self): - if self._override_state >= OverrideState.STUDIO: - for child_obj in self.children: - if child_obj.has_studio_override: - return True - return False - - @property - def _child_has_project_override(self): - if self._override_state is OverrideState.PROJECT: - for child_obj in self.children: - if child_obj.has_project_override: - return True - return False - - def _settings_value(self): - output = [] - for child_obj in self.children: - output.append(child_obj.settings_value()) - return output - - def _discard_changes(self, on_change_trigger): - if not self._can_discard_changes: - return - - not_set = object() - value = not_set - if ( - self._override_state >= OverrideState.PROJECT - and self.had_project_override - ): - value = copy.deepcopy(self._project_override_value) - - if ( - value is not_set - and self._override_state >= OverrideState.STUDIO - and self.had_studio_override - ): - value = copy.deepcopy(self._studio_override_value) - - if value is not_set and self._override_state >= OverrideState.DEFAULTS: - if self.has_default_value: - value = copy.deepcopy(self._default_value) - else: - value = copy.deepcopy(self.value_on_not_set) - - if value is not_set: - raise NotImplementedError("BUG: Unexcpected part of code.") - - self._ignore_child_changes = True - - while self.children: - self.children.pop(0) - - for item in value: - child_obj = self._add_new_item() - child_obj.update_default_value( - item, self._default_log_invalid_types - ) - if self._override_state is OverrideState.PROJECT: - if self.had_project_override: - child_obj.update_project_value( - item, self._project_log_invalid_types - ) - elif self.had_studio_override: - child_obj.update_studio_value( - item, self._studio_log_invalid_types - ) - - elif self._override_state is OverrideState.STUDIO: - if self.had_studio_override: - child_obj.update_studio_value( - item, self._studio_log_invalid_types - ) - - child_obj.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - - if self._override_state >= OverrideState.PROJECT: - self._has_project_override = self.had_project_override - - if self._override_state >= OverrideState.STUDIO: - self._has_studio_override = self.had_studio_override - - self._ignore_child_changes = False - - on_change_trigger.append(self.on_change) - - def _add_to_studio_default(self, _on_change_trigger): - self._has_studio_override = True - self.on_change() - - def _remove_from_studio_default(self, on_change_trigger): - if not self._can_remove_from_studio_default: - return - - value = self._default_value - if value is NOT_SET: - value = self.value_on_not_set - - self._ignore_child_changes = True - - while self.children: - self.children.pop(0) - - for item in value: - child_obj = self._add_new_item() - child_obj.update_default_value(item) - child_obj.set_override_state( - self._override_state, self._ignore_missing_defaults - ) - - self._ignore_child_changes = False - - self._has_studio_override = False - - on_change_trigger.append(self.on_change) - - def _add_to_project_override(self, _on_change_trigger): - self._has_project_override = True - self.on_change() - - def _remove_from_project_override(self, on_change_trigger): - if not self._can_remove_from_project_override: - return - - if self._has_studio_override: - value = self._studio_override_value - elif self.has_default_value: - value = self._default_value - else: - value = self.value_on_not_set - - self._ignore_child_changes = True - - while self.children: - self.children.pop(0) - - for item in value: - child_obj = self._add_new_item() - child_obj.update_default_value(item) - if self._has_studio_override: - child_obj.update_studio_value(item) - child_obj.set_override_state( - self._override_state, - self._ignore_missing_defaults - ) - - self._ignore_child_changes = False - - self._has_project_override = False - - on_change_trigger.append(self.on_change) - - def reset_callbacks(self): - super(ListEntity, self).reset_callbacks() - for child_entity in self.children: - child_entity.reset_callbacks() diff --git a/client/ayon_core/settings/entities/op_version_entity.py b/client/ayon_core/settings/entities/op_version_entity.py deleted file mode 100644 index 44add2a369..0000000000 --- a/client/ayon_core/settings/entities/op_version_entity.py +++ /dev/null @@ -1,78 +0,0 @@ -from ayon_core.lib.openpype_version import ( - get_remote_versions, - get_OpenPypeVersion, - get_installed_version -) -from .input_entities import TextEntity -from .lib import ( - OverrideState, - NOT_SET -) -from .exceptions import BaseInvalidValue - - -class OpenPypeVersionInput(TextEntity): - """Entity to store OpenPype version to use. - - Settings created on another machine may affect available versions - on current user's machine. Text input element is provided to explicitly - set version not yet showing up the user's machine. - - It is possible to enter empty string. In that case is used any latest - version. Any other string must match regex of OpenPype version semantic. - """ - def _item_initialization(self): - super(OpenPypeVersionInput, self)._item_initialization() - self.multiline = False - self.placeholder_text = "Latest" - self.value_hints = [] - - def _get_openpype_versions(self): - """This is abstract method returning version hints for UI purposes.""" - raise NotImplementedError(( - "{} does not have implemented '_get_openpype_versions'" - ).format(self.__class__.__name__)) - - def set_override_state(self, state, *args, **kwargs): - """Update value hints for UI purposes.""" - value_hints = [] - if state is OverrideState.STUDIO: - versions = self._get_openpype_versions() - for version in versions: - version_str = str(version) - if version_str not in value_hints: - value_hints.append(version_str) - - self.value_hints = value_hints - - super(OpenPypeVersionInput, self).set_override_state( - state, *args, **kwargs - ) - - def convert_to_valid_type(self, value): - """Add validation of version regex.""" - if value and value is not NOT_SET: - OpenPypeVersion = get_OpenPypeVersion() - if OpenPypeVersion is not None: - try: - OpenPypeVersion(version=value) - except Exception: - raise BaseInvalidValue( - "Value \"{}\"is not valid version format.".format( - value - ), - self.path - ) - return super(OpenPypeVersionInput, self).convert_to_valid_type(value) - - -class VersionsInputEntity(OpenPypeVersionInput): - """Entity meant only for global settings to define production version.""" - schema_types = ["versions-text"] - - def _get_openpype_versions(self): - versions = get_remote_versions() - if versions is None: - return [] - versions.append(get_installed_version()) - return sorted(versions) diff --git a/client/ayon_core/settings/entities/root_entities.py b/client/ayon_core/settings/entities/root_entities.py deleted file mode 100644 index a937c0cc50..0000000000 --- a/client/ayon_core/settings/entities/root_entities.py +++ /dev/null @@ -1,888 +0,0 @@ -import os -import json -import copy -import collections - -from abc import abstractmethod - -from .base_entity import BaseItemEntity -from .lib import ( - NOT_SET, - WRAPPER_TYPES, - SCHEMA_KEY_SYSTEM_SETTINGS, - SCHEMA_KEY_PROJECT_SETTINGS, - OverrideState, - SchemasHub, - DynamicSchemaValueCollector -) -from .exceptions import ( - SchemaError, - InvalidKeySymbols -) -from ayon_core.settings.constants import ( - SYSTEM_SETTINGS_KEY, - PROJECT_SETTINGS_KEY, - PROJECT_ANATOMY_KEY, - KEY_REGEX -) -from ayon_core.settings.exceptions import SaveWarningExc - -from ayon_core.settings.lib import ( - DEFAULTS_DIR, - - get_default_settings, - 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, - - apply_overrides -) - - -class RootEntity(BaseItemEntity): - """Abstract class for root entities. - - Root entity is top hierarchy entity without parent. Should care about - saving and must have access to all entities in it's scope. - """ - schema_types = ["root"] - - def __init__(self, schema_hub, reset, main_schema_name=None): - self.schema_hub = schema_hub - if not main_schema_name: - main_schema_name = "schema_main" - schema_data = schema_hub.get_schema(main_schema_name) - - super(RootEntity, self).__init__(schema_data) - self._require_restart_callbacks = [] - self._item_ids_require_restart = set() - self._item_initialization() - if reset: - self.reset() - - @property - def override_state(self): - """Current OverrideState.""" - return self._override_state - - @property - def require_restart(self): - return bool(self._item_ids_require_restart) - - def add_require_restart_change_callback(self, callback): - self._require_restart_callbacks.append(callback) - - def _on_require_restart_change(self): - for callback in self._require_restart_callbacks: - callback() - - def add_item_require_restart(self, item): - was_empty = len(self._item_ids_require_restart) == 0 - self._item_ids_require_restart.add(item.id) - if was_empty: - self._on_require_restart_change() - - def remove_item_require_restart(self, item): - if item.id not in self._item_ids_require_restart: - return - - self._item_ids_require_restart.remove(item.id) - if not self._item_ids_require_restart: - self._on_require_restart_change() - - @abstractmethod - def reset(self): - """Reset values and entities to initial state. - - Reload settings and entities should reset their changes or be - recreated. - """ - pass - - def __getitem__(self, key): - return self.non_gui_children[key] - - def __setitem__(self, key, value): - self.non_gui_children[key].set(value) - - def __iter__(self): - for key in self.keys(): - yield key - - def get(self, key, default=None): - return self.non_gui_children.get(key, default) - - def set(self, value): - """Set value.""" - new_value = self.convert_to_valid_type(value) - for _key, _value in new_value.items(): - self.non_gui_children[_key].set(_value) - - def has_child_with_key(self, key): - return key in self.non_gui_children - - def keys(self): - return self.non_gui_children.keys() - - def values(self): - return self.non_gui_children.values() - - def items(self): - return self.non_gui_children.items() - - def _add_children(self, schema_data, first=True): - added_children = [] - children_deque = collections.deque() - for _children_schema in schema_data["children"]: - children_schemas = self.schema_hub.resolve_schema_data( - _children_schema - ) - for children_schema in children_schemas: - children_deque.append(children_schema) - - while children_deque: - children_schema = children_deque.popleft() - - if children_schema["type"] in WRAPPER_TYPES: - _children_schema = copy.deepcopy(children_schema) - wrapper_children = self._add_children( - children_schema["children"], False - ) - _children_schema["children"] = wrapper_children - added_children.append(_children_schema) - continue - - child_obj = self.create_schema_object(children_schema, self) - self.children.append(child_obj) - added_children.append(child_obj) - if isinstance(child_obj, self.schema_hub.gui_types): - continue - - if child_obj.key in self.non_gui_children: - raise KeyError( - "Duplicated key \"{}\"".format(child_obj.key) - ) - self.non_gui_children[child_obj.key] = child_obj - - if not first: - return added_children - - for child_obj in added_children: - self.gui_layout.append(child_obj) - - def _item_initialization(self): - # Store `self` to `root_item` for children entities - self.root_item = self - - # Children are stored by key as keys are immutable and are defined by - # schema - self.valid_value_types = (dict, ) - - self.children = [] - self.non_gui_children = {} - self.gui_layout = [] - - self._add_children(self.schema_data) - - self.schema_validations() - - def schema_validations(self): - for child_entity in self.children: - if child_entity.is_group: - reason = ( - "Root entity \"{}\" has child with `is_group`" - " attribute set to True but root can't save overrides." - ).format(self.__class__.__name__) - raise SchemaError(reason) - child_entity.schema_validations() - - for key in self.non_gui_children.keys(): - if not KEY_REGEX.match(key): - raise InvalidKeySymbols(self.path, key) - - @abstractmethod - def get_entity_from_path(self, path): - """Return entity matching passed path.""" - pass - - def create_schema_object(self, schema_data, *args, **kwargs): - """Create entity by entered schema data. - - Available entities are loaded on first run. Children entities can call - this method. - """ - return self.schema_hub.create_schema_object( - schema_data, *args, **kwargs - ) - - def set_override_state(self, state, ignore_missing_defaults=None): - """Set override state and trigger it on children. - - Method will discard all changes in hierarchy and use values, metadata - and all kind of values for defined state. - - Args: - state (OverrideState): State to which should be data changed. - """ - if not ignore_missing_defaults: - ignore_missing_defaults = False - - self._override_state = state - for child_obj in self.non_gui_children.values(): - child_obj.set_override_state(state, ignore_missing_defaults) - - def on_change(self): - """Trigger callbacks on change.""" - for callback in self.on_change_callbacks: - callback() - - def on_child_change(self, _child_entity): - """Whan any children has changed.""" - self.on_change() - - def collect_static_entities_by_path(self): - output = {} - for child_obj in self.non_gui_children.values(): - result = child_obj.collect_static_entities_by_path() - if result: - output.update(result) - return output - - def get_child_path(self, child_entity): - """Return path of children entity""" - for key, _child_entity in self.non_gui_children.items(): - if _child_entity is child_entity: - return key - raise ValueError("Didn't find child {}".format(child_entity)) - - @property - def value(self): - """Value for current override state without metadata.""" - output = {} - for key, child_obj in self.non_gui_children.items(): - output[key] = child_obj.value - return output - - def collect_dynamic_schema_entities(self): - output = DynamicSchemaValueCollector(self.schema_hub) - if self._override_state is not OverrideState.DEFAULTS: - return output - - for child_obj in self.non_gui_children.values(): - child_obj.collect_dynamic_schema_entities(output) - - return output - - def settings_value(self): - """Value for current override state with metadata. - - This is what should be stored on save method. - """ - if self._override_state is OverrideState.NOT_DEFINED: - return NOT_SET - - if self._override_state is not OverrideState.DEFAULTS: - output = {} - for key, child_obj in self.non_gui_children.items(): - if child_obj.is_dynamic_schema_node: - continue - value = child_obj.settings_value() - if value is not NOT_SET: - output[key] = value - return output - - output = {} - for key, child_obj in self.non_gui_children.items(): - child_value = child_obj.settings_value() - if not child_obj.is_file and not child_obj.file_item: - for _key, _value in child_value.items(): - new_key = "/".join([key, _key]) - output[new_key] = _value - else: - output[key] = child_value - return output - - @property - def has_studio_override(self): - """Any children has studio override. - - Return's relevant data only if override state is STUDIO or PROJECT. - - Returns: - bool: True if any children has studio overrides. - """ - if self._override_state >= OverrideState.STUDIO: - for child_obj in self.non_gui_children.values(): - if child_obj.has_studio_override: - return True - return False - - @property - def has_project_override(self): - """Any children has project override. - - Return's relevant data only if override state is PROJECT. - - Returns: - bool: True if any children has project overrides. - """ - if self._override_state >= OverrideState.PROJECT: - for child_obj in self.non_gui_children.values(): - if child_obj.has_project_override: - return True - return False - - @property - def has_unsaved_changes(self): - """Entity contain unsaved changes. - - Root on it's own can't have any modifications so looks only on - children. - - Returns: - bool: True if has unsaved changes. - """ - for child_obj in self.non_gui_children.values(): - if child_obj.has_unsaved_changes: - return True - return False - - def _discard_changes(self, on_change_trigger): - """Implementation of abstract method only trigger children callback.""" - for child_obj in self.non_gui_children.values(): - child_obj.discard_changes(on_change_trigger) - - def _add_to_studio_default(self, *args, **kwargs): - """Implementation of abstract method only trigger children callback.""" - for child_obj in self.non_gui_children.values(): - child_obj.add_to_studio_default(*args, **kwargs) - - def _remove_from_studio_default(self, on_change_trigger): - """Implementation of abstract method only trigger children callback.""" - for child_obj in self.non_gui_children.values(): - child_obj.remove_from_studio_default(on_change_trigger) - - def _add_to_project_override(self, *args, **kwargs): - """Implementation of abstract method only trigger children callback.""" - for child_obj in self.non_gui_children.values(): - child_obj.add_to_project_override(*args, **kwargs) - - def _remove_from_project_override(self, on_change_trigger): - """Implementation of abstract method only trigger children callback.""" - for child_obj in self.non_gui_children.values(): - child_obj.remove_from_project_override(on_change_trigger) - - def save(self): - """Save values for current override state. - - Values are stored with current values and modifications. - """ - if self._override_state is OverrideState.NOT_DEFINED: - raise ValueError( - "Can't save if override state is set to NOT_DEFINED" - ) - - if self._override_state is OverrideState.DEFAULTS: - self._save_default_values() - reset_default_settings() - - elif self._override_state is OverrideState.STUDIO: - self._save_studio_values() - - elif self._override_state is OverrideState.PROJECT: - self._save_project_values() - - # Trigger reset to reload entities - self.reset() - - @abstractmethod - def defaults_dir(self): - """Abstract method to return directory path to defaults. - - Implementation of `_save_default_values` requires defaults dir where - default data will be stored. - """ - pass - - def _save_default_values(self): - """Save default values. - - Do not call this method, always use `save`. Manually called method - won't save current values as defaults if override state is not set to - DEFAULTS. - """ - settings_value = self.settings_value() - - defaults_dir = self.defaults_dir() - for file_path, value in settings_value.items(): - subpath = file_path + ".json" - - output_path = os.path.join(defaults_dir, subpath) - dirpath = os.path.dirname(output_path) - if not os.path.exists(dirpath): - os.makedirs(dirpath) - - self.log.debug("Saving data to: {}\n{}".format(subpath, value)) - data = json.dumps(value, indent=4) + "\n" - with open(output_path, "w") as file_stream: - file_stream.write(data) - - dynamic_values_item = self.collect_dynamic_schema_entities() - dynamic_values_item.save_values() - - @abstractmethod - def _save_studio_values(self): - """Save studio override values.""" - pass - - @abstractmethod - def _save_project_values(self): - """Save project override values.""" - pass - - def is_in_defaults_state(self): - """Api callback to check if current state is DEFAULTS.""" - return self._override_state is OverrideState.DEFAULTS - - def is_in_studio_state(self): - """Api callback to check if current state is STUDIO.""" - return self._override_state is OverrideState.STUDIO - - def is_in_project_state(self): - """Api callback to check if current state is PROJECT.""" - return self._override_state is OverrideState.PROJECT - - def set_defaults_state(self): - """Change override state to DEFAULTS.""" - self.set_override_state(OverrideState.DEFAULTS) - - def set_studio_state(self): - """Change override state to STUDIO.""" - self.set_override_state(OverrideState.STUDIO) - - def set_project_state(self): - """Change override state to PROJECT.""" - self.set_override_state(OverrideState.PROJECT) - - -class SystemSettings(RootEntity): - """Root entity for system settings. - - Allows to modify system settings via entity system and loaded schemas. - - Args: - set_studio_state (bool): Set studio values on initialization. By - default is set to True. - reset (bool): Reset values on initialization. By default is set to - True. - schema_data (dict): Pass schema data to entity. This is for development - and debugging purposes. - """ - root_key = SYSTEM_SETTINGS_KEY - - def __init__( - 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("/") - first_part = path_parts[0] - output = self - if first_part == self.root_key: - path_parts.pop(0) - - for path_part in path_parts: - output = output[path_part] - return output - - def _reset_values(self): - default_value = get_default_settings()[SYSTEM_SETTINGS_KEY] - for key, child_obj in self.non_gui_children.items(): - value = default_value.get(key, NOT_SET) - child_obj.update_default_value(value) - - 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, source_version=None): - """Discard changes and reset entit's values. - - Reload default values and studio override values and update entities. - - Args: - new_state (OverrideState): It is possible to change override state - during reset. Current state is used if not defined. - """ - if new_state is None: - new_state = self._override_state - - if new_state is OverrideState.NOT_DEFINED: - new_state = OverrideState.DEFAULTS - - 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. - - Implementation of abstract method. - """ - return os.path.join(DEFAULTS_DIR, SYSTEM_SETTINGS_KEY) - - def _save_studio_values(self): - settings_value = self.settings_value() - - self.log.debug("Saving system settings: {}".format( - json.dumps(settings_value, indent=4) - )) - save_studio_settings(settings_value) - # Reset source version after restart - self._source_version = None - - def _save_project_values(self): - """System settings can't have project overrides. - - Raises: - ValueError: Raise when called as entity can't use or store project - overrides. - """ - raise ValueError("System settings can't save project overrides.") - - -class ProjectSettings(RootEntity): - """Root entity for project settings. - - Allows to modify project settings via entity system and loaded schemas. - - Args: - project_name (str): Project name which overrides will be loaded. - Use `None` to modify studio defaults. - change_state (bool): Set values on initialization. By - default is set to True. - reset (bool): Reset values on initialization. By default is set to - True. - schema_data (dict): Pass schema data to entity. This is for development - and debugging purposes. - """ - root_key = PROJECT_SETTINGS_KEY - - def __init__( - self, - project_name=None, - change_state=True, - reset=True, - 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 - schema_hub = SchemasHub(SCHEMA_KEY_PROJECT_SETTINGS) - - super(ProjectSettings, self).__init__(schema_hub, reset) - - if change_state: - if self.project_name is None: - self.set_studio_state() - 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 - - @project_name.setter - def project_name(self, project_name): - self.change_project(project_name) - - @property - def system_settings_entity(self): - output = self._system_settings_entity - if output is None: - output = SystemSettings(set_studio_state=False) - self._system_settings_entity = output - - if self.override_state is OverrideState.DEFAULTS: - if output.override_state is not OverrideState.DEFAULTS: - output.set_defaults_state() - elif self.override_state > OverrideState.DEFAULTS: - if output.override_state <= OverrideState.DEFAULTS: - try: - output.set_studio_state() - except Exception: - output.set_defaults_state() - return output - - def get_entity_from_path(self, path): - path_parts = path.split("/") - first_part = path_parts[0] - # TODO replace with constants - if first_part == "system_settings": - output = self.system_settings_entity - path_parts.pop(0) - else: - output = self - if first_part == "project_settings": - path_parts.pop(0) - - for path_part in path_parts: - output = output[path_part] - return output - - def change_project(self, project_name, source_version=None): - if project_name == self._project_name: - 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): - default_values = { - PROJECT_SETTINGS_KEY: get_default_settings()[PROJECT_SETTINGS_KEY], - PROJECT_ANATOMY_KEY: get_default_settings()[PROJECT_ANATOMY_KEY] - } - for key, child_obj in self.non_gui_children.items(): - 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: 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 project_name: - return - - 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: 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. - - Reload default values and studio override values and update entities. - - Args: - new_state (OverrideState): It is possible to change override state - during reset. Current state is used if not defined. - """ - if new_state is None: - new_state = self._override_state - - if new_state is OverrideState.NOT_DEFINED: - new_state = OverrideState.DEFAULTS - - self._system_settings_entity = None - - self._reset_values() - self.set_override_state(new_state) - - def defaults_dir(self): - """Path to defaults directory. - - Implementation of abstract method. - """ - return DEFAULTS_DIR - - def _save_studio_values(self): - settings_value = self.settings_value() - - 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) - )) - project_settings = settings_value.get(PROJECT_SETTINGS_KEY) or {} - project_anatomy = settings_value.get(PROJECT_ANATOMY_KEY) or {} - - warnings = [] - try: - save_project_settings(self.project_name, project_settings) - except SaveWarningExc as exc: - warnings.extend(exc.warnings) - - try: - save_project_anatomy(self.project_name, project_anatomy) - except SaveWarningExc as exc: - warnings.extend(exc.warnings) - - if warnings: - raise SaveWarningExc(warnings) - - def _validate_values_to_save(self, value): - pass - - def _save_project_values(self): - """Project overrides are saved same ways as studio overrides.""" - self._save_studio_values() diff --git a/client/ayon_core/settings/entities/schemas/README.md b/client/ayon_core/settings/entities/schemas/README.md deleted file mode 100644 index eb74dd7a9c..0000000000 --- a/client/ayon_core/settings/entities/schemas/README.md +++ /dev/null @@ -1,823 +0,0 @@ -# Creating GUI schemas - -## Basic rules -- configurations does not define GUI, but GUI defines configurations! -- output is always json serializable -- GUI schema has multiple input types, all inputs are represented by a dictionary -- each input may have "input modifiers" (keys in dictionary) that are required or optional - - only required modifier for all input items is key `"type"` which says what type of item it is -- there are special keys across all inputs - - `"is_file"` - this key is for storing openpype defaults in `openpype` repo - - reasons of existence: developing new schemas does not require to create defaults manually - - key is validated, must be once in hierarchy else it won't be possible to store openpype defaults - - `"is_group"` - define that all values under key in hierarchy will be overridden if any value is modified, this information is also stored to overrides - - this keys is not allowed for all inputs as they may have not reason for that - - key is validated, can be only once in hierarchy but is not required -- currently there are `system settings` and `project settings` -- all entities can have set `"tooltip"` key with description which will be shown in UI - -## Inner schema -- GUI schemas are huge json files, to be able to split whole configuration into multiple schema there's type `schema` -- system configuration schemas are stored in `~/openpype/settings/entities/schemas/system_schema/` and project configurations in `~/openpype/settings/entities/schemas/projects_schema/` -- each schema name is filename of json file except extension (without ".json") -- if content is dictionary content will be used as `schema` else will be used as `schema_template` - -### schema -- can have only key `"children"` which is list of strings, each string should represent another schema (order matters) string represents name of the schema -- will just paste schemas from other schema file in order of "children" list - -``` -{ - "type": "schema", - "name": "my_schema_name" -} -``` - -### template -- allows to define schema "templates" to not duplicate same content multiple times -- legacy name is `schema_template` (still usable) -```javascript -// EXAMPLE json file content (filename: example_template.json) -[ - { - "__default_values__": { - "multipath_executables": true - } - }, { - "type": "raw-json", - "label": "{host_label} Environments", - "key": "{host_name}_environments" - }, { - "type": "path", - "key": "{host_name}_executables", - "label": "{host_label} - Full paths to executables", - "multiplatform": "{multipath_executables}", - "multipath": true - } -] -``` -```javascript -// EXAMPLE usage of the template in schema -{ - "type": "dict", - "key": "template_examples", - "label": "Schema template examples", - "children": [ - { - "type": "template", - // filename of template (example_template.json) - "name": "example_template", - "template_data": { - "host_label": "Maya 2019", - "host_name": "maya_2019", - "multipath_executables": false - } - }, { - "type": "template", - "name": "example_template", - "template_data": { - "host_label": "Maya 2020", - "host_name": "maya_2020" - } - } - ] -} -``` -- item in schema mush contain `"type"` and `"name"` keys but it is also expected that `"template_data"` will be entered too -- all items in the list, except `__default_values__`, will replace `schema_template` item in schema -- template may contain another template or schema -- it is expected that schema template will have unfilled fields as in example - - unfilled fields are allowed only in values of schema dictionary -```javascript -{ - ... - // Allowed - "key": "{to_fill}" - ... - // Not allowed - "{to_fill}": "value" - ... -} -``` -- Unfilled fields can be also used for non string values(e.g. dictionary), in that case value must contain only one key and value for fill must contain right type. -```javascript -// Passed data -{ - "executable_multiplatform": { - "type": "schema", - "name": "my_multiplatform_schema" - } -} -// Template content -{ - ... - // Allowed - "multiplatform": "{executable_multiplatform}" - ... - // Not allowed - "multiplatform": "{executable_multiplatform}_enhanced_string" - ... -} -``` -- It is possible to define default values for unfilled fields to do so one of items in list must be dictionary with key `"__default_values__"` and value as dictionary with default key: values (as in example above). - -### dynamic_schema -- dynamic templates that can be defined by class of `ModuleSettingsDef` -- example: -``` -{ - "type": "dynamic_schema", - "name": "project_settings/global" -} -``` -- all valid `BaseModuleSettingsDef` classes where calling of `get_settings_schemas` - will return dictionary where is key "project_settings/global" with schemas - will extend and replace this item -- dynamic schemas work almost the same way as templates - - one item can be replaced by multiple items (or by 0 items) -- goal is to dynamically loaded settings of OpenPype addons without having - their schemas or default values in main repository - - values of these schemas are saved using the `BaseModuleSettingsDef` methods -- easiest is to use `JsonFilesSettingsDef` which has full implementation of storing default values to json files all you have to implement is method `get_settings_root_path` which should return path to root directory where settings schema can be found and will be saved - -## Basic Dictionary inputs -- these inputs wraps another inputs into {key: value} relation - -## dict -- this is dictionary type wrapping more inputs with keys defined in schema -- may be used as dynamic children (e.g. in `list` or `dict-modifiable`) - - in that case the only key modifier is `children` which is list of it's keys - - USAGE: e.g. List of dictionaries where each dictionary have same structure. -- if is not used as dynamic children then must have defined `"key"` under which are it's values stored -- may be with or without `"label"` (only for GUI) - - `"label"` must be set to be able mark item as group with `"is_group"` key set to True -- item with label can visually wrap it's children - - this option is enabled by default to turn off set `"use_label_wrap"` to `False` - - label wrap is by default collapsible - - that can be set with key `"collapsible"` to `True`/`False` - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - - it is possible to add lighter background with `"highlight_content"` (Default: `False`) - - lighter background has limits of maximum applies after 3-4 nested highlighted items there is not much difference in the color - - output is dictionary `{the "key": children values}` -``` -# Example -{ - "key": "applications", - "type": "dict", - "label": "Applications", - "collapsible": true, - "highlight_content": true, - "is_group": true, - "is_file": true, - "children": [ - ...ITEMS... - ] -} - -# Without label -{ - "type": "dict", - "key": "global", - "children": [ - ...ITEMS... - ] -} - -# When used as widget -{ - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ... - ] - } -} -``` - -## dict-roots -- entity can be used only in Project settings -- keys of dictionary are based on current project roots -- they are not updated "live" it is required to save root changes and then - modify values on this entity - # TODO do live updates -``` -{ - "type": "dict-roots", - "key": "roots", - "label": "Roots", - "object_type": { - "type": "path", - "multiplatform": true, - "multipath": false - } -} -``` - -## dict-conditional -- is similar to `dict` but has always available one enum entity - - the enum entity has single selection and it's value define other children entities -- each value of enumerator have defined children that will be used - - there is no way how to have shared entities across multiple enum items -- value from enumerator is also stored next to other values - - to define the key under which will be enum value stored use `enum_key` - - `enum_key` must match key regex and any enum item can't have children with same key - - `enum_label` is label of the entity for UI purposes -- enum items are define with `enum_children` - - it's a list where each item represents single item for the enum - - all items in `enum_children` must have at least `key` key which represents value stored under `enum_key` - - enum items can define `label` for UI purposes - - most important part is that item can define `children` key where are definitions of it's children (`children` value works the same way as in `dict`) -- to set default value for `enum_key` set it with `enum_default` -- entity must have defined `"label"` if is not used as widget -- is set as group if any parent is not group (can't have children as group) -- may be with or without `"label"` (only for GUI) - - `"label"` must be set to be able mark item as group with `"is_group"` key set to True -- item with label can visually wrap it's children - - this option is enabled by default to turn off set `"use_label_wrap"` to `False` - - label wrap is by default collapsible - - that can be set with key `"collapsible"` to `True`/`False` - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - - it is possible to add lighter background with `"highlight_content"` (Default: `False`) - - lighter background has limits of maximum applies after 3-4 nested highlighted items there is not much difference in the color -- for UI porposes was added `enum_is_horizontal` which will make combobox appear next to children inputs instead of on top of them (Default: `False`) - - this has extended ability of `enum_on_right` which will move combobox to right side next to children widgets (Default: `False`) -- output is dictionary `{the "key": children values}` -- using this type as template item for list type can be used to create infinite hierarchies - -``` -# Example -{ - "type": "dict-conditional", - "key": "my_key", - "label": "My Key", - "enum_key": "type", - "enum_label": "label", - "enum_children": [ - # Each item must be a dictionary with 'key' - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "command", - "label": "Comand" - } - ] - }, - { - "key": "menu", - "label": "Menu", - "children": [ - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": "text" - } - ] - }, - { - # Separator does not have children as "separator" value is enough - "key": "separator", - "label": "Separator" - } - ] -} -``` - -How output of the schema could look like on save: -``` -{ - "type": "separator" -} - -{ - "type": "action", - "key": "action_1", - "label": "Action 1", - "command": "run command -arg" -} - -{ - "type": "menu", - "children": [ - "child_1", - "child_2" - ] -} -``` - -## Inputs for setting any kind of value (`Pure` inputs) -- all inputs must have defined `"key"` if are not used as dynamic item - - they can also have defined `"label"` - -### boolean -- simple checkbox, nothing more to set -``` -{ - "type": "boolean", - "key": "my_boolean_key", - "label": "Do you want to use Pype?" -} -``` - -### number -- number input, can be used for both integer and float - - key `"decimal"` defines how many decimal places will be used, 0 is for integer input (Default: `0`) - - key `"minimum"` as minimum allowed number to enter (Default: `-99999`) - - key `"maximum"` as maximum allowed number to enter (Default: `99999`) -- key `"steps"` will change single step value of UI inputs (using arrows and wheel scroll) -- for UI it is possible to show slider to enable this option set `show_slider` to `true` -``` -{ - "type": "number", - "key": "fps", - "label": "Frame rate (FPS)" - "decimal": 2, - "minimum": 1, - "maximum": 300000 -} -``` - -``` -{ - "type": "number", - "key": "ratio", - "label": "Ratio" - "decimal": 3, - "minimum": 0, - "maximum": 1, - "show_slider": true -} -``` - -### text -- simple text input - - key `"multiline"` allows to enter multiple lines of text (Default: `False`) - - key `"placeholder"` allows to show text inside input when is empty (Default: `None`) - - key `"minimum_lines_count"` allows to define minimum size hint for UI. Can be 0-n lines. - -``` -{ - "type": "text", - "key": "deadline_pool", - "label": "Deadline pool" -} -``` - -### path-input -- this input is implemented to add additional features to text input -- this is meant to be used in proxy input `path` - - DO NOT USE this input in schema please - -### raw-json -- a little bit enhanced text input for raw json -- can store dictionary (`{}`) or list (`[]`) but not both - - by default stores dictionary to change it to list set `is_list` to `True` -- has validations of json format -- output can be stored as string - - this is to allow any keys in dictionary - - set key `store_as_string` to `true` - - code using that setting must expected that value is string and use json module to convert it to python types - -``` -{ - "type": "raw-json", - "key": "profiles", - "label": "Extract Review profiles", - "is_list": true -} -``` - -### enum -- enumeration of values that are predefined in schema -- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) -- values are defined under value of key `"enum_items"` as list - - each item in list is simple dictionary where value is label and key is value which will be stored - - should be possible to enter single dictionary if order of items doesn't matter -- it is possible to set default selected value/s with `default` attribute - - it is recommended to use this option only in single selection mode - - at the end this option is used only when defying default settings value or in dynamic items - -``` -{ - "key": "tags", - "label": "Tags", - "type": "enum", - "multiselection": true, - "enum_items": [ - {"burnin": "Add burnins"}, - {"ftrackreview": "Add to Ftrack"}, - {"delete": "Delete output"}, - {"slate-frame": "Add slate frame"}, - {"no-handles": "Skip handle frames"} - ] -} -``` - -### anatomy-templates-enum -- enumeration of all available anatomy template keys -- have only single selection mode -- it is possible to define default value `default` - - `"work"` is used if default value is not specified -- enum values are not updated on the fly it is required to save templates and - reset settings to recache values -``` -{ - "key": "host", - "label": "Host name", - "type": "anatomy-templates-enum", - "default": "publish" -} -``` - -### hosts-enum -- enumeration of available hosts -- multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) -- it is possible to add empty value (represented with empty string) with setting `"use_empty_value"` to `True` (Default: `False`) -- it is possible to set `"custom_labels"` for host names where key `""` is empty value (Default: `{}`) -- to filter host names it is required to define `"hosts_filter"` which is list of host names that will be available - - do not pass empty string if `use_empty_value` is enabled - - ignoring host names would be more dangerous in some cases -``` -{ - "key": "host", - "label": "Host name", - "type": "hosts-enum", - "multiselection": false, - "use_empty_value": true, - "custom_labels": { - "": "N/A", - "nuke": "Nuke" - }, - "hosts_filter": [ - "nuke" - ] -} -``` - -### apps-enum -- enumeration of available application and their variants from system settings - - applications without host name are excluded -- can be used only in project settings -- has only `multiselection` -- used only in project anatomy -``` -{ - "type": "apps-enum", - "key": "applications", - "label": "Applications" -} -``` - -### tools-enum -- enumeration of available tools and their variants from system settings -- can be used only in project settings -- has only `multiselection` -- used only in project anatomy -``` -{ - "type": "tools-enum", - "key": "tools_env", - "label": "Tools" -} -``` - -### task-types-enum -- enumeration of task types from current project -- enum values are not updated on the fly and modifications of task types on project require save and reset to be propagated to this enum -- has set `multiselection` to `True` but can be changed to `False` in schema - -### deadline_url-enum -- deadline module specific enumerator using deadline system settings to fill it's values -- TODO: move this type to deadline module - -## Inputs for setting value using Pure inputs -- these inputs also have required `"key"` -- attribute `"label"` is required in few conditions - - when item is marked `as_group` or when `use_label_wrap` -- they use Pure inputs "as widgets" - -### list -- output is list -- items can be added and removed -- items in list must be the same type -- to wrap item in collapsible widget with label on top set `use_label_wrap` to `True` - - when this is used `collapsible` and `collapsed` can be set (same as `dict` item does) -- type of items is defined with key `"object_type"` -- there are 2 possible ways how to set the type: - 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) - 2.) item type name as string without modifiers (e.g. `text`) - 3.) enhancement of 1.) there is also support of `template` type but be carefull about endless loop of templates - - goal of using `template` is to easily change same item definitions in multiple lists - -1.) with item modifiers -``` -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": { - "type": "number", # number item type - "minimum": 1, # minimum modifier - "maximum": 65535 # maximum modifier - } -} -``` - -2.) without modifiers -``` -{ - "type": "list", - "key": "exclude_ports", - "label": "Exclude ports", - "object_type": "text" -} -``` - -3.) with template definition -``` -# Schema of list item where template is used -{ - "type": "list", - "key": "menu_items", - "label": "Menu Items", - "object_type": { - "type": "template", - "name": "template_object_example" - } -} - -# WARNING: -# In this example the template use itself inside which will work in `list` -# but may cause an issue in other entity types (e.g. `dict`). - -'template_object_example.json' : -[ - { - "type": "dict-conditional", - "use_label_wrap": true, - "collapsible": true, - "key": "menu_items", - "label": "Menu items", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - } - ] - }, - { - "key": "menu", - "label": "Menu", - "children": [ - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": { - "type": "template", - "name": "template_object_example" - } - } - ] - } - ] - } -] -``` - -### dict-modifiable -- one of dictionary inputs, this is only used as value input -- items in this input can be removed and added same way as in `list` input -- value items in dictionary must be the same type -- type of items is defined with key `"object_type"` -- required keys may be defined under `"required_keys"` - - required keys must be defined as a list (e.g. `["key_1"]`) and are moved to the top - - these keys can't be removed or edited (it is possible to edit label if item is collapsible) -- there are 2 possible ways how to set the type: - 1.) dictionary with item modifiers (`number` input has `minimum`, `maximum` and `decimals`) in that case item type must be set as value of `"type"` (example below) - 2.) item type name as string without modifiers (e.g. `text`) -- this input can be collapsible - - that can be set with key `"collapsible"` as `True`/`False` (Default: `True`) - - with key `"collapsed"` as `True`/`False` can be set that is collapsed when GUI is opened (Default: `False`) - -1.) with item modifiers -``` -{ - "type": "dict-modifiable", - "object_type": { - "type": "number", - "minimum": 0, - "maximum": 300 - }, - "is_group": true, - "key": "templates_mapping", - "label": "Deadline - Templates mapping", - "is_file": true -} -``` - -2.) without modifiers -``` -{ - "type": "dict-modifiable", - "object_type": "text", - "is_group": true, - "key": "templates_mapping", - "label": "Deadline - Templates mapping", - "is_file": true -} -``` - -### path -- input for paths, use `path-input` internally -- has 2 input modifiers `"multiplatform"` and `"multipath"` - - `"multiplatform"` - adds `"windows"`, `"linux"` and `"darwin"` path inputs result is dictionary - - `"multipath"` - it is possible to enter multiple paths - - if both are enabled result is dictionary with lists - -``` -{ - "type": "path", - "key": "ffmpeg_path", - "label": "FFmpeg path", - "multiplatform": true, - "multipath": true -} -``` - -### list-strict -- input for strict number of items in list -- each child item can be different type with different possible modifiers -- it is possible to display them in horizontal or vertical layout - - key `"horizontal"` as `True`/`False` (Default: `True`) -- each child may have defined `"label"` which is shown next to input - - label does not reflect modifications or overrides (TODO) -- children item are defined under key `"object_types"` which is list of dictionaries - - key `"children"` is not used because is used for hierarchy validations in schema -- USAGE: For colors, transformations, etc. Custom number and different modifiers - give ability to define if color is HUE or RGB, 0-255, 0-1, 0-100 etc. - -``` -{ - "type": "list-strict", - "key": "color", - "label": "Color", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] -} -``` - -### color -- preimplemented entity to store and load color values -- entity store and expect list of 4 integers in range 0-255 - - integers represents rgba [Red, Green, Blue, Alpha] - -``` -{ - "type": "color", - "key": "bg_color", - "label": "Background Color" -} -``` - -## Noninteractive widgets -- have nothing to do with data - -### label -- add label with note or explanations -- it is possible to use html tags inside the label -- set `work_wrap` to `true`/`false` if you want to enable word wrapping in UI (default: `false`) - -``` -{ - "type": "label", - "label": "RED LABEL: Normal label" -} -``` - -### separator -- legacy name is `splitter` (still usable) -- visual separator of items (more divider than separator) - -``` -{ - "type": "separator" -} -``` - -## Anatomy -Anatomy represents data stored on project document. - -### anatomy -- entity works similarly to `dict` -- anatomy has always all keys overridden with overrides - - overrides are not applied as all anatomy data must be available from project document - - all children must be groups - -## Proxy wrappers -- should wraps multiple inputs only visually -- these does not have `"key"` key and do not allow to have `"is_file"` or `"is_group"` modifiers enabled -- can't be used as widget (first item in e.g. `list`, `dict-modifiable`, etc.) - -### form -- wraps inputs into form look layout -- should be used only for Pure inputs - -``` -{ - "type": "dict-form", - "children": [ - { - "type": "text", - "key": "deadline_department", - "label": "Deadline apartment" - }, { - "type": "number", - "key": "deadline_priority", - "label": "Deadline priority" - }, { - ... - } - ] -} -``` - - -### collapsible-wrap -- wraps inputs into collapsible widget - - looks like `dict` but does not hold `"key"` -- should be used only for Pure inputs - -``` -{ - "type": "collapsible-wrap", - "label": "Collapsible example" - "children": [ - { - "type": "text", - "key": "_example_input_collapsible", - "label": "Example input in collapsible wrapper" - }, { - ... - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_main.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_main.json deleted file mode 100644 index 4315987a33..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_main.json +++ /dev/null @@ -1,172 +0,0 @@ -{ - "key": "project", - "type": "dict", - "children": [ - { - "type": "anatomy", - "key": "project_anatomy", - "label": "Anatomy", - "children": [ - { - "key": "roots", - "label": "Roots", - "type": "dict-modifiable", - "is_file": true, - "is_group": true, - "expandable": false, - "object_type": { - "type": "path", - "multiplatform": true - } - }, - { - "type": "schema", - "name": "schema_anatomy_templates" - }, - { - "type": "schema", - "name": "schema_anatomy_attributes" - }, - { - "type": "dict-modifiable", - "key": "tasks", - "label": "Task types", - "is_file": true, - "is_group": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "short_name", - "label": "Short name" - } - ] - } - }, - { - "type": "schema", - "name": "schema_anatomy_imageio" - } - ] - }, - { - "type": "dict", - "key": "project_settings", - "children": [ - { - "type": "schema", - "name": "schema_project_global" - }, - { - "type": "schema", - "name": "schema_project_ftrack" - }, - { - "type": "schema", - "name": "schema_project_shotgrid" - }, - { - "type": "schema", - "name": "schema_project_kitsu" - }, - { - "type": "schema", - "name": "schema_project_deadline" - }, - { - "type": "schema", - "name": "schema_project_royalrender" - }, - { - "type": "schema", - "name": "schema_project_slack" - }, - { - "type": "schema", - "name": "schema_project_applications" - }, - { - "type": "schema", - "name": "schema_project_max" - }, - { - "type": "schema", - "name": "schema_project_maya" - }, - { - "type": "schema", - "name": "schema_project_nuke" - }, - { - "type": "schema", - "name": "schema_project_fusion" - }, - { - "type": "schema", - "name": "schema_project_hiero" - }, - { - "type": "schema", - "name": "schema_project_houdini" - }, - { - "type": "schema", - "name": "schema_project_blender" - }, - { - "type": "schema", - "name": "schema_project_aftereffects" - }, - { - "type": "schema", - "name": "schema_project_photoshop" - }, - { - "type": "schema", - "name": "schema_project_substancepainter" - }, - { - "type": "schema", - "name": "schema_project_harmony" - }, - { - "type": "schema", - "name": "schema_project_tvpaint" - }, - { - "type": "schema", - "name": "schema_project_celaction" - }, - { - "type": "schema", - "name": "schema_project_flame" - }, - { - "type": "schema", - "name": "schema_project_resolve" - }, - { - "type": "schema", - "name": "schema_project_standalonepublisher" - }, - { - "type": "schema", - "name": "schema_project_traypublisher" - }, - { - "type": "schema", - "name": "schema_project_webpublisher" - }, - { - "type": "schema", - "name": "schema_project_unreal" - }, - { - "type": "dynamic_schema", - "name": "project_settings/global" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_aftereffects.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_aftereffects.json deleted file mode 100644 index 72f09a641d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_aftereffects.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "aftereffects", - "label": "AfterEffects", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "RenderCreator", - "label": "Create render", - "children": [ - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text", - "docstring": "Fill default variant(s) (like 'Main' or 'Default') used in subset name creation." - }, - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review", - "default": true - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectReview", - "label": "Collect Review", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": true - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateSceneSettings", - "label": "Validate Scene Settings", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Validate if FPS and Resolution match shot data" - }, - { - "type": "list", - "key": "skip_resolution_check", - "object_type": "text", - "label": "Skip Resolution Check for Tasks" - }, - { - "type": "list", - "key": "skip_timelines_check", - "object_type": "text", - "label": "Skip Timeline Check for Tasks" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "docstring": "Check if loaded container in scene are latest versions.", - "key": "ValidateContainers", - "label": "ValidateContainers" - } - ] - } - ] - }, - { - "type": "schema_template", - "name": "template_workfile_options", - "skip_paths": [ - "workfile_builder/builder_on_start", - "workfile_builder/profiles" - ] - }, - { - "type": "schema", - "name": "schema_templated_workfile_build" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_applications.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_applications.json deleted file mode 100644 index 030ed3ee8a..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_applications.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "dict", - "key": "applications", - "label": "Applications", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "boolean", - "key": "only_available", - "label": "Show only available applications" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_blender.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_blender.json deleted file mode 100644 index 535d9434a3..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_blender.json +++ /dev/null @@ -1,174 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "blender", - "label": "Blender", - "is_file": true, - "children": [ - { - "key": "unit_scale_settings", - "type": "dict", - "label": "Set Unit Scale", - "collapsible": true, - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "apply_on_opening", - "type": "boolean", - "label": "Apply on Opening Existing Files" - }, - { - "key": "base_file_unit_scale", - "type": "number", - "label": "Base File Unit Scale", - "decimal": 10 - } - ] - }, - { - "key": "set_resolution_startup", - "type": "boolean", - "label": "Set Resolution on Startup" - }, - { - "key": "set_frames_startup", - "type": "boolean", - "label": "Set Start/End Frames and FPS on Startup" - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "RenderSettings", - "label": "Render Settings", - "children": [ - { - "type": "text", - "key": "default_render_image_folder", - "label": "Default render image folder" - }, - { - "key": "aov_separator", - "label": "AOV Separator Character", - "type": "enum", - "multiselection": false, - "defaults": "underscore", - "enum_items": [ - {"dash": "- (dash)"}, - {"underscore": "_ (underscore)"}, - {"dot": ". (dot)"} - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"exr": "OpenEXR"}, - {"bmp": "BMP"}, - {"rgb": "Iris"}, - {"png": "PNG"}, - {"jpg": "JPEG"}, - {"jp2": "JPEG 2000"}, - {"tga": "Targa"}, - {"tif": "TIFF"} - ] - }, - { - "key": "multilayer_exr", - "type": "boolean", - "label": "Multilayer (EXR)" - }, - { - "type": "label", - "label": "Note: Multilayer EXR is only used when output format type set to EXR." - }, - { - "key": "aov_list", - "label": "AOVs to create", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"empty": "< empty >"}, - {"combined": "Combined"}, - {"z": "Z"}, - {"mist": "Mist"}, - {"normal": "Normal"}, - {"diffuse_light": "Diffuse Light"}, - {"diffuse_color": "Diffuse Color"}, - {"specular_light": "Specular Light"}, - {"specular_color": "Specular Color"}, - {"volume_light": "Volume Light"}, - {"emission": "Emission"}, - {"environment": "Environment"}, - {"shadow": "Shadow"}, - {"ao": "Ambient Occlusion"}, - {"denoising": "Denoising"}, - {"volume_direct": "Direct Volumetric Scattering"}, - {"volume_indirect": "Indirect Volumetric Scattering"} - ] - }, - { - "type": "label", - "label": "Add custom AOVs. They are added to the view layer and in the Compositing Nodetree,\nbut they need to be added manually to the Shader Nodetree." - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "custom_passes", - "label": "Custom Passes", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "type", - "label": "Type", - "type": "enum", - "multiselection": false, - "default": "COLOR", - "enum_items": [ - {"COLOR": "Color"}, - {"VALUE": "Value"} - ] - } - ] - } - } - ] - }, - { - "type": "schema_template", - "name": "template_workfile_options", - "skip_paths": [ - "workfile_builder/builder_on_start", - "workfile_builder/profiles" - ] - }, - { - "type": "schema", - "name": "schema_blender_publish" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_celaction.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_celaction.json deleted file mode 100644 index 9d50e85631..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_celaction.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "celaction", - "label": "CelAction", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (derived to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_derived" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "workfile", - "label": "Workfile", - "children": [ - { - "key": "submission_overrides", - "label": "Submission workfile overrides", - "type": "enum", - "multiselection": true, - "enum_items": [ - { - "render_chunk": "Pass chunk size" - }, - { - "frame_range": "Pass frame range" - }, - { - "resolution": "Pass resolution" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectRenderPath", - "label": "CollectRenderPath", - "is_group": true, - "children": [ - { - "type": "text", - "key": "output_extension", - "label": "Output render file extension" - }, - { - "type": "text", - "key": "anatomy_template_key_render_files", - "label": "Anatomy template key: render files" - }, - { - "type": "text", - "key": "anatomy_template_key_metadata", - "label": "Anatomy template key: metadata job file" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_deadline.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_deadline.json deleted file mode 100644 index 42dea33ef9..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_deadline.json +++ /dev/null @@ -1,711 +0,0 @@ -{ - "type": "dict", - "key": "deadline", - "label": "Deadline", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "deadline_url-enum", - "key": "deadline_servers", - "label": "Deadline Webservice URLs", - "multiselect": true - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectDefaultDeadlineServer", - "label": "Default Deadline Webservice", - "children": [ - { - "type": "boolean", - "key": "pass_mongo_url", - "label": "Pass Mongo url to job" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectDeadlinePools", - "label": "Default Deadline Pools", - "children": [ - { - "type": "text", - "key": "primary_pool", - "label": "Primary Pool" - }, - { - "type": "text", - "key": "secondary_pool", - "label": "Secondary Pool" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateExpectedFiles", - "label": "Validate Expected Files", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Validate if all expected files were rendered" - }, - { - "type": "boolean", - "key": "allow_user_override", - "object_type": "text", - "label": "Allow user change frame range" - }, - { - "type": "list", - "key": "families", - "object_type": "text", - "label": "Trigger on families" - }, - { - "type": "list", - "key": "targets", - "object_type": "text", - "label": "Trigger for plugins" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "MayaSubmitDeadline", - "label": "Maya Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "enum", - "key": "tile_assembler_plugin", - "label": "Tile Assembler Plugin", - "multiselection": false, - "enum_items": [ - { - "DraftTileAssembler": "Draft Tile Assembler" - }, - { - "OpenPypeTileAssembler": "OpenPype Tile Assembler" - } - ] - }, - { - "type": "boolean", - "key": "use_published", - "label": "Use Published scene" - }, - { - "type": "boolean", - "key": "import_reference", - "label": "Use Scene with Imported Reference" - }, - { - "type": "boolean", - "key": "asset_dependencies", - "label": "Use Asset dependencies" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "tile_priority", - "label": "Tile Assembler Priority" - }, - { - "type": "text", - "key": "group", - "label": "Group Name" - }, - { - "type": "list", - "key": "limit", - "label": "Limit Groups", - "object_type": "text" - }, - { - "type": "raw-json", - "key": "jobInfo", - "label": "Additional JobInfo data" - }, - { - "type": "raw-json", - "key": "pluginInfo", - "label": "Additional PluginInfo data" - }, - { - "type": "list", - "key": "scene_patches", - "label": "Scene patches", - "required_keys": ["name", "regex", "line"], - "object_type": { - "type": "dict", - "children": [ - { - "key": "name", - "label": "Patch name", - "type": "text" - }, { - "key": "regex", - "label": "Patch regex", - "type": "text" - }, { - "key": "line", - "label": "Patch line", - "type": "text" - } - ] - - } - }, - { - "type": "boolean", - "key": "strict_error_checking", - "label": "Strict Error Checking", - "default": true - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "MaxSubmitDeadline", - "label": "3dsMax Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "boolean", - "key": "use_published", - "label": "Use Published scene" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Frame per Task" - }, - { - "type": "text", - "key": "group", - "label": "Group Name" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "FusionSubmitDeadline", - "label": "Fusion submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Frame per Task" - }, - { - "type": "number", - "key": "concurrent_tasks", - "label": "Number of concurrent tasks" - }, - { - "type": "text", - "key": "group", - "label": "Group Name" - }, - { - "type": "enum", - "key": "plugin", - "label": "Deadline Plugin", - "enum_items": [ - {"Fusion": "Fusion"}, - {"FusionCmd": "FusionCmd"} - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "NukeSubmitDeadline", - "label": "Nuke Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "splitter" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Chunk Size" - }, - { - "type": "number", - "key": "concurrent_tasks", - "label": "Number of concurrent tasks" - }, - { - "type": "splitter" - }, - { - "type": "text", - "key": "group", - "label": "Group" - }, - { - "type": "splitter" - }, - { - "type": "text", - "key": "department", - "label": "Department" - }, - { - "type": "boolean", - "key": "use_gpu", - "label": "Use GPU" - }, - { - "type": "boolean", - "key": "workfile_dependency", - "label": "Workfile Dependency" - }, - { - "type": "boolean", - "key": "use_published_workfile", - "label": "Use Published Workfile" - }, - { - "type": "list", - "key": "env_allowed_keys", - "object_type": "text", - "label": "Allowed environment keys" - }, - { - "type": "dict-modifiable", - "key": "env_search_replace_values", - "label": "Search & replace in environment values", - "object_type": { - "type": "text" - } - }, - { - "type": "dict-modifiable", - "key": "limit_groups", - "label": "Limit Groups", - "object_type": { - "type": "list", - "object_type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "HarmonySubmitDeadline", - "label": "Harmony Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "boolean", - "key": "use_published", - "label": "Use Published scene" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Chunk Size" - }, - { - "type": "text", - "key": "group", - "label": "Group" - }, - { - "type": "text", - "key": "department", - "label": "Department" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "AfterEffectsSubmitDeadline", - "label": "After Effects Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "boolean", - "key": "use_published", - "label": "Use Published scene" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Chunk Size" - }, - { - "type": "text", - "key": "group", - "label": "Group" - }, - { - "type": "text", - "key": "department", - "label": "Department" - }, - { - "type": "boolean", - "key": "multiprocess", - "label": "Multiprocess" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CelactionSubmitDeadline", - "label": "Celaction Submit Deadline", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "deadline_department", - "label": "Deadline apartment" - }, - { - "type": "number", - "key": "deadline_priority", - "label": "Deadline priority" - }, - { - "type": "text", - "key": "deadline_pool", - "label": "Deadline pool" - }, - { - "type": "text", - "key": "deadline_pool_secondary", - "label": "Deadline pool (secondary)" - }, - { - "type": "text", - "key": "deadline_group", - "label": "Deadline Group" - }, - { - "type": "number", - "key": "deadline_chunk_size", - "label": "Deadline Chunk size" - }, - { - "type": "text", - "key": "deadline_job_delay", - "label": "Delay job (timecode dd:hh:mm:ss)" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "BlenderSubmitDeadline", - "label": "Blender Submit to Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "boolean", - "key": "use_published", - "label": "Use Published scene" - }, - { - "type": "number", - "key": "priority", - "label": "Priority" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Frame per Task" - }, - { - "type": "text", - "key": "group", - "label": "Group Name" - }, - { - "type": "text", - "key": "job_delay", - "label": "Delay job (timecode dd:hh:mm:ss)" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ProcessSubmittedCacheJobOnFarm", - "label": "ProcessSubmittedCacheJobOnFarm", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "deadline_department", - "label": "Deadline department" - }, - { - "type": "text", - "key": "deadline_pool", - "label": "Deadline Pool" - }, - { - "type": "text", - "key": "deadline_group", - "label": "Deadline Group" - }, - { - "type": "number", - "key": "deadline_chunk_size", - "label": "Deadline Chunk Size" - }, - { - "type": "number", - "key": "deadline_priority", - "label": "Deadline Priotity" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ProcessSubmittedJobOnFarm", - "label": "ProcessSubmittedJobOnFarm", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "deadline_department", - "label": "Deadline department" - }, - { - "type": "text", - "key": "deadline_pool", - "label": "Deadline Pool" - }, - { - "type": "text", - "key": "deadline_group", - "label": "Deadline Group" - }, - { - "type": "number", - "key": "deadline_chunk_size", - "label": "Deadline Chunk Size" - }, - { - "type": "number", - "key": "deadline_priority", - "label": "Deadline Priotity" - }, - { - "type": "splitter" - }, - { - "type": "text", - "key": "publishing_script", - "label": "Publishing script path" - }, - { - "type": "list", - "key": "skip_integration_repre_list", - "label": "Skip integration of representation with ext", - "object_type": { - "type": "text" - } - }, - { - "type": "dict-modifiable", - "docstring": "Regular expression to filter for which subset review should be created in publish job.", - "key": "aov_filter", - "label": "Reviewable subsets filter", - "object_type": { - "type": "list", - "object_type": "text" - } - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_flame.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_flame.json deleted file mode 100644 index 06f818966f..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_flame.json +++ /dev/null @@ -1,582 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "flame", - "label": "Flame", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (remapped to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_remapped" - }, - { - "key": "project", - "type": "dict", - "label": "Project", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "text", - "key": "colourPolicy", - "label": "Colour Policy (name or path)" - }, - { - "type": "text", - "key": "frameDepth", - "label": "Image Depth" - }, - { - "type": "text", - "key": "fieldDominance", - "label": "Field Dominance" - } - ] - } - ] - }, - { - "type": "label", - "label": "Profile names mapping settings is deprecated use ./imagio/remapping instead" - }, - { - "key": "profilesMapping", - "type": "dict", - "label": "Profile names mapping [deprecated]", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "flameName", - "label": "Flame name" - }, - { - "type": "text", - "key": "ocioName", - "label": "OCIO name" - } - ] - } - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Create plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateShotClip", - "label": "Create Shot Clip", - "is_group": true, - "children": [ - { - "type": "collapsible-wrap", - "label": "Shot Hierarchy And Rename Settings", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "hierarchy", - "label": "Shot parent hierarchy" - }, - { - "type": "boolean", - "key": "useShotName", - "label": "Use Shot Name" - }, - { - "type": "boolean", - "key": "clipRename", - "label": "Rename clips" - }, - { - "type": "text", - "key": "clipName", - "label": "Clip name template" - }, - { - "type": "boolean", - "key": "segmentIndex", - "label": "Accept segment order" - }, - { - "type": "number", - "key": "countFrom", - "label": "Count sequence from" - }, - { - "type": "number", - "key": "countSteps", - "label": "Stepping number" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Template Keywords", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "folder", - "label": "{folder}" - }, - { - "type": "text", - "key": "episode", - "label": "{episode}" - }, - { - "type": "text", - "key": "sequence", - "label": "{sequence}" - }, - { - "type": "text", - "key": "track", - "label": "{track}" - }, - { - "type": "text", - "key": "shot", - "label": "{shot}" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Vertical Synchronization Of Attributes", - "collapsible": false, - "children": [ - { - "type": "boolean", - "key": "vSyncOn", - "label": "Enable Vertical Sync" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Attributes", - "collapsible": false, - "children": [ - { - "type": "number", - "key": "workfileFrameStart", - "label": "Workfiles Start Frame" - }, - { - "type": "number", - "key": "handleStart", - "label": "Handle start (head)" - }, - { - "type": "number", - "key": "handleEnd", - "label": "Handle end (tail)" - }, - { - "type": "boolean", - "key": "includeHandles", - "label": "Enable handles including" - }, - { - "type": "boolean", - "key": "retimedHandles", - "label": "Enable retimed handles" - }, - { - "type": "boolean", - "key": "retimedFramerange", - "label": "Enable retimed shot frameranges" - } - ] - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectTimelineInstances", - "label": "Collect Timeline Instances", - "is_group": true, - "children": [ - { - "type": "collapsible-wrap", - "label": "XML presets attributes parsable from segment comments", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "list", - "key": "xml_preset_attrs_from_comments", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "name", - "label": "Attribute name" - }, - { - "key": "type", - "label": "Attribute type", - "type": "enum", - "default": "number", - "enum_items": [ - { - "number": "number" - }, - { - "float": "float" - }, - { - "string": "string" - } - ] - } - ] - } - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Add tasks", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "list", - "key": "add_tasks", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "name", - "label": "Task name" - }, - { - "key": "type", - "label": "Task type", - "multiselection": false, - "type": "task-types-enum" - }, - { - "type": "boolean", - "key": "create_batch_group", - "label": "Create batch group" - } - ] - } - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractSubsetResources", - "label": "Extract Subset Resources", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "keep_original_representation", - "label": "Publish clip's original media" - }, - { - "key": "export_presets_mapping", - "label": "Export presets mapping", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "active", - "label": "Is active", - "default": true - }, - { - "type": "separator" - }, - { - "key": "export_type", - "label": "Eport clip type", - "type": "enum", - "default": "Sequence Publish", - "enum_items": [ - { - "Movie": "Movie" - }, - { - "File Sequence": "File Sequence" - }, - { - "Sequence Publish": "Sequence Publish" - } - ] - }, - { - "key": "ext", - "label": "Output extension", - "type": "text", - "default": "exr" - }, - { - "key": "xml_preset_file", - "label": "XML preset file (with ext)", - "type": "text" - }, - { - "key": "colorspace_out", - "label": "Output color", - "type": "text", - "default": "linear" - }, - { - "type": "collapsible-wrap", - "label": "Other parameters", - "collapsible": true, - "collapsed": true, - "children": [ - { - "key": "xml_preset_dir", - "label": "XML preset folder (optional)", - "type": "text" - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "parsed_comment_attrs", - "label": "Include parsed attributes from comments", - "default": false - - }, - { - "type": "separator" - }, - { - "type": "collapsible-wrap", - "label": "Representation", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "boolean", - "key": "representation_add_range", - "label": "Add frame range to representation" - }, - { - "type": "list", - "key": "representation_tags", - "label": "Add representation tags", - "object_type": { - "type": "text", - "multiline": false - } - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Loading during publish", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "boolean", - "key": "load_to_batch_group", - "label": "Load to batch group reel", - "default": false - }, - { - "type": "text", - "key": "batch_group_loader_name", - "label": "Use loader name" - } - ] - } - - ] - }, - { - "type": "collapsible-wrap", - "label": "Filtering", - "collapsible": true, - "collapsed": true, - "children": [ - { - "key": "filter_path_regex", - "label": "Regex in clip path", - "type": "text", - "default": ".*" - } - ] - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "IntegrateBatchGroup", - "label": "IntegrateBatchGroup", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "load", - "label": "Loader plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "LoadClip", - "label": "Load Clip", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "families", - "label": "Families", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "reel_group_name", - "label": "Reel group name" - }, - { - "type": "text", - "key": "reel_name", - "label": "Reel name" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "clip_name_template", - "label": "Clip name template" - }, - { - "type": "text", - "key": "layer_rename_template", - "label": "Layer name template" - }, - { - "type": "list", - "key": "layer_rename_patterns", - "label": "Layer rename patters", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "LoadClipBatch", - "label": "Load as clip to current batch", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "families", - "label": "Families", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "reel_name", - "label": "Reel name" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "clip_name_template", - "label": "Clip name template" - }, - { - "type": "text", - "key": "layer_rename_template", - "label": "Layer name template" - }, - { - "type": "list", - "key": "layer_rename_patterns", - "label": "Layer rename patters", - "object_type": "text" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_ftrack.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_ftrack.json deleted file mode 100644 index d6efb118b9..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_ftrack.json +++ /dev/null @@ -1,1254 +0,0 @@ -{ - "type": "dict", - "key": "ftrack", - "label": "Ftrack", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "dict", - "key": "events", - "label": "Server Actions/Events", - "children": [ - { - "type": "dict", - "key": "sync_to_avalon", - "label": "Sync to avalon", - "children": [ - { - "type": "label", - "label": "Allow name and hierarchy change only if following statuses are on all children tasks" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "prepare_project", - "label": "Prepare Project", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "sync_hier_entity_attributes", - "label": "Sync Hierarchical and Entity Attributes", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "interest_entity_types", - "label": "Entity types of interest", - "object_type": { - "type": "text", - "multiline": false - } - }, - { - "type": "list", - "key": "interest_attributes", - "label": "Attributes to sync", - "object_type": { - "type": "text", - "multiline": false - } - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "action_enabled", - "label": "Enable Action" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles for action", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "clone_review_session", - "label": "Clone Review Session", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles for action", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "thumbnail_updates", - "label": "Update Hierarchy thumbnails", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Push thumbnail from version, up through multiple hierarchy levels." - }, - { - "type": "number", - "key": "levels", - "label": "Levels" - } - ] - }, - { - "type": "dict", - "key": "user_assignment", - "label": "Run script on user assignments", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "status_update", - "label": "Update status on task action", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "mapping", - "type": "dict-modifiable", - "object_type": { - "type": "list", - "object_type": "text" - } - } - ] - }, - { - "type": "dict", - "key": "status_task_to_parent", - "label": "Sync status from Task to Parent", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "List of parent object types where this is triggered (\"Shot\", \"Asset Build\", etc.). Skipped if list is empty." - }, - { - "type": "list", - "object_type": "text", - "key": "parent_object_types", - "label": "Object types" - }, - { - "key": "parent_status_match_all_task_statuses", - "type": "dict-modifiable", - "label": "Change parent if all tasks match", - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "list", - "key": "parent_status_by_task_status", - "label": "Change parent status if a single task matches", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "label": "New parent status", - "key": "new_status" - }, - { - "type": "separator" - }, - { - "type": "list", - "label": "Task status", - "key": "task_statuses", - "object_type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "status_task_to_version", - "label": "Sync status from Task to Version", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict-modifiable", - "key": "mapping", - "object_type": - { - "type": "list", - "object_type": "text" - } - }, - { - "type": "label", - "label": "Limit status changes to entered asset types. Limitation is ignored if nothing is entered." - }, - { - "type": "list", - "key": "asset_types_filter", - "label": "Asset types (short)", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "status_version_to_task", - "label": "Sync status from Version to Task", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Change Task status based on a changed Version status.
Version's new status on the left will trigger a change of a task status to the first available from the list on right.
- if no status from the list is available it will use the same status as the version." - }, - { - "type": "dict-modifiable", - "key": "mapping", - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Disable event if status was changed on specific Asset type." - }, - { - "type": "list", - "label": "Asset types (short)", - "key": "asset_types_to_skip", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "next_task_update", - "is_group": true, - "label": "Update status on next task", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Change status on next task by task types order when task status state changed to \"Done\". All tasks with same Task type must be \"Done\"." - }, - { - "type": "label", - "label": "Mapping of next task status changes From -> To." - }, - { - "type": "dict-modifiable", - "key": "mapping", - "object_type": { - "type": "text" - } - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Status names that are ignored on \"Done\" check (e.g. \"Omitted\")." - }, - { - "type": "list", - "key": "ignored_statuses", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Allow to break rule that all tasks with same Task type must be \"Done\" and change statuses with same type tasks ordered by name." - }, - { - "label": "Name sorting", - "type": "boolean", - "key": "name_sorting" - } - ] - }, - { - "type": "dict", - "key": "transfer_values_of_hierarchical_attributes", - "label": "Action to transfer hierarchical attribute values", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "key": "create_daily_review_session", - "label": "Create daily review session", - "type": "dict", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text", - "use_label_wrap": true - }, - { - "type": "boolean", - "key": "cycle_enabled", - "label": "Run automatically every day" - }, - { - "type": "separator" - }, - { - "type": "list-strict", - "key": "cycle_hour_start", - "label": "Create daily review session at", - "tooltip": "This may take affect on next day", - "object_types": [ - { - "label": "H:", - "type": "number", - "minimum": 0, - "maximum": 23, - "decimal": 0 - }, { - "label": "M:", - "type": "number", - "minimum": 0, - "maximum": 59, - "decimal": 0 - }, { - "label": "S:", - "type": "number", - "minimum": 0, - "maximum": 59, - "decimal": 0 - } - ] - }, - { - "type": "label", - "label": "This can't be overriden per project and any change will take effect on the next day or on restart of event server." - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "review_session_template", - "label": "ReviewSession template", - "placeholder": "Default: {yy}{mm}{dd}" - }, - { - "type": "label", - "label": "Possible formatting keys in template:
- \"project_name\" - <Name of project>
- \"d\" - <Day of month number> in shortest possible way.
- \"dd\" - <Day of month number> with 2 digits.
- \"ddd\" - <Week day name> shortened week day. e.g.: `Mon`, ...
- \"dddd\" - <Week day name> full name of week day. e.g.: `Monday`, ...
- \"m\" - <Month number> in shortest possible way. e.g.: `1` if January
- \"mm\" - <Month number> with 2 digits.
- \"mmm\" - <Month name> shortened month name. e.g.: `Jan`, ...
- \"mmmm\" -<Month name> full month name. e.g.: `January`, ...
- \"yy\" - <Year number> shortened year. e.g.: `19`, `20`, ...
- \"yyyy\" - <Year number> full year. e.g.: `2019`, `2020`, ..." - } - ] - } - ] - }, - { - "type": "dict", - "key": "user_handlers", - "label": "User Actions/Events", - "children": [ - { - "type": "dict", - "key": "application_launch_statuses", - "is_group": true, - "label": "Application - Status change on launch", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Do not change status if current status is:" - }, - { - "type": "list", - "key": "ignored_statuses", - "object_type": "text" - }, - { - "type": "label", - "label": "Change task's status to left side if current task status is in list on right side." - }, - { - "type": "dict-modifiable", - "key": "status_change", - "object_type": { - "type": "list", - "object_type": "text" - } - } - ] - }, - { - "type": "dict", - "key": "create_update_attributes", - "label": "Create/Update Avalon Attributes", - "children": [ - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "prepare_project", - "label": "Prepare Project", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Check \"Create project structure\" by default" - }, - { - "type": "boolean", - "key": "create_project_structure_checked", - "label": "Checked" - } - ] - }, - { - "type": "dict", - "key": "clean_hierarchical_attr", - "label": "Clean hierarchical custom attributes", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "delete_asset_subset", - "label": "Delete Asset/Subsets", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "delete_old_versions", - "label": "Delete old versions", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "delivery_action", - "label": "Delivery", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "store_thubmnail_to_avalon", - "label": "Store Thumbnails to avalon", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "job_killer", - "label": "Job Killer", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "sync_to_avalon_local", - "label": "Sync to avalon (local) - For development", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "fill_workfile_attribute", - "label": "Fill workfile Custom attribute", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Custom attribute must be Text type added to Task entity type" - }, - { - "type": "text", - "key": "custom_attribute_key", - "label": "Custom attribute key" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "seed_project", - "label": "Seed Debug Project", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "role_list", - "label": "Roles", - "object_type": "text" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectFtrackFamily", - "label": "Collect Ftrack Family", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "collapsible": true, - "key": "profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "add_ftrack_family", - "label": "Add Ftrack Family", - "type": "boolean" - }, - { - "type": "list", - "collapsible": true, - "key": "advanced_filtering", - "label": "Advanced adding if additional families present", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Additional Families", - "type": "list", - "object_type": "text" - }, - { - "key": "add_ftrack_family", - "label": "Add Ftrack Family", - "type": "boolean" - } - ] - } - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectFtrackCustomAttributeData", - "label": "Collect Custom Attribute Data", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Collect custom attributes from ftrack for ftrack entities that can be used in some templates during publishing." - }, - { - "type": "list", - "key": "custom_attribute_keys", - "label": "Custom attribute keys", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "key": "IntegrateHierarchyToFtrack", - "label": "Integrate Hierarchy to ftrack", - "is_group": true, - "collapsible": true, - "children": [ - { - "type": "label", - "label": "Set task status on new task creation. Ftrack's default status is used otherwise." - }, - { - "type": "list", - "key": "create_task_status_profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "text", - "key": "status_name", - "label": "Status name" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "IntegrateFtrackNote", - "label": "IntegrateFtrackNote", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Template may contain formatting keys intent, comment, host_name, app_name, app_label, published_paths and source." - }, - { - "type": "text", - "key": "note_template", - "label": "Note template", - "multiline": true - }, - { - "type": "list", - "object_type": "text", - "key": "note_labels", - "label": "Note labels" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "IntegrateFtrackDescription", - "label": "Integrate Ftrack Description", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Add description to integrated AssetVersion." - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Template may contain formatting keys intent and comment." - }, - { - "type": "text", - "key": "description_template", - "label": "Description template" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateFtrackAttributes", - "label": "ValidateFtrackAttributes", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "raw-json", - "key": "ftrack_custom_attributes", - "label": "Custom attributes to validate" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "IntegrateFtrackComponentOverwrite", - "label": "IntegrateFtrackComponentOverwrite", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "IntegrateFtrackInstance", - "label": "Integrate Ftrack Instance", - "is_group": true, - "children": [ - { - "type": "dict-modifiable", - "key": "family_mapping", - "label": "Family Mapping", - "object_type": { - "type": "text" - } - }, - { - "type": "boolean", - "key": "keep_first_subset_name_for_review", - "label": "Make subset name as first asset name", - "default": true - }, - { - "type": "list", - "collapsible": true, - "key": "asset_versions_status_profiles", - "label": "AssetVersion status on publish", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "family", - "label": "Family", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "status", - "label": "Status name", - "type": "text" - } - ] - } - }, - { - "key": "additional_metadata_keys", - "label": "Additional metadata keys on components", - "type": "enum", - "multiselection": true, - "enum_items": [ - {"openpype_version": "OpenPype version"}, - {"frame_start": "Frame start"}, - {"frame_end": "Frame end"}, - {"duration": "Duration"}, - {"width": "Resolution width"}, - {"height": "Resolution height"}, - {"fps": "FPS"}, - {"code": "Codec"} - ] - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "upload_reviewable_with_origin_name", - "label": "Upload reviewable with origin name" - }, - { - "type": "label", - "label": "Note: Reviewable will be uploaded twice into ftrack when enabled. One with original name and second with required 'ftrackreview-mp4'. That may cause dramatic increase of ftrack storage usage." - }, - { - "type": "separator" - } - ] - }, - { - "type": "dict", - "key": "IntegrateFtrackFarmStatus", - "label": "Ftrack Status To Farm", - "children": [ - { - "type": "label", - "label": "Change status of task when it's subset is submitted to farm" - }, - { - "type": "list", - "collapsible": true, - "key": "farm_status_profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "status_name", - "label": "Status name", - "type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "ftrack_task_status_local_publish", - "label": "Ftrack Status Local Integration", - "children": [ - { - "type": "label", - "label": "Change status of task when is integrated locally" - }, - { - "type": "list", - "collapsible": true, - "key": "status_profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "host_names", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subset_names", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "status_name", - "label": "Status name", - "type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "ftrack_task_status_on_farm_publish", - "label": "Ftrack Status On Farm", - "children": [ - { - "type": "label", - "label": "Change status of task when it's subset is integrated on farm" - }, - { - "type": "list", - "collapsible": true, - "key": "status_profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "host_names", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subset_names", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "status_name", - "label": "Status name", - "type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "IntegrateFtrackTaskStatus", - "label": "Integrate Ftrack Task Status", - "children": [ - { - "type": "label", - "label": "Apply collected task statuses. This plugin can run before or after version integration. Some status automations may conflict with status changes on versions because of wrong order." - }, - { - "type": "boolean", - "key": "after_version_statuses", - "label": "After version integration" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_fusion.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_fusion.json deleted file mode 100644 index 84d1efae78..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_fusion.json +++ /dev/null @@ -1,208 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "fusion", - "label": "Fusion", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict", - "key": "copy_fusion_settings", - "collapsible": true, - "label": "Local Fusion profile settings", - "children": [ - { - "key": "copy_path", - "type": "path", - "label": "Local Fusion profile directory" - }, - { - "type": "boolean", - "key": "copy_status", - "label": "Copy profile on first launch" - }, - { - "key":"force_sync", - "type": "boolean", - "label": "Resync profile on each launch" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "hooks", - "label": "Hooks", - "children": [ - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "InstallPySideToFusion", - "label": "Install PySide2", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateSaver", - "label": "Create Render Saver", - "is_group": true, - "children": [ - { - "type": "text", - "key": "temp_rendering_path_template", - "label": "Temporary rendering path template" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "key": "instance_attributes", - "label": "Instance attributes", - "type": "enum", - "multiselection": true, - "enum_items": [ - { - "reviewable": "Reviewable" - }, - { - "farm_rendering": "Farm rendering" - } - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselect": false, - "enum_items": [ - {"exr": "exr"}, - {"tga": "tga"}, - {"png": "png"}, - {"tif": "tif"}, - {"jpg": "jpg"} - ] - }, - { - "key": "default_frame_range_option", - "label": "Default frame range source", - "type": "enum", - "multiselect": false, - "enum_items": [ - {"asset_db": "Current asset context"}, - {"render_range": "From render in/out"}, - {"comp_range": "From composition timeline"} - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateImageSaver", - "label": "Create Image Saver", - "is_group": true, - "children": [ - { - "type": "text", - "key": "temp_rendering_path_template", - "label": "Temporary rendering path template" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "key": "instance_attributes", - "label": "Instance attributes", - "type": "enum", - "multiselection": true, - "enum_items": [ - { - "reviewable": "Reviewable" - }, - { - "farm_rendering": "Farm rendering" - } - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselect": false, - "enum_items": [ - {"exr": "exr"}, - {"tga": "tga"}, - {"png": "png"}, - {"tif": "tif"}, - {"jpg": "jpg"} - ] - }, - { - "type": "number", - "key": "default_frame", - "label": "Default rendered frame" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateSaverResolution", - "label": "Validate Saver Resolution" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_global.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_global.json deleted file mode 100644 index 4094632c72..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_global.json +++ /dev/null @@ -1,170 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "global", - "label": "Global", - "is_file": true, - "children": [ - { - "type": "dict", - "key": "version_start_category", - "label": "Version Start", - "collapsible": true, - "collapsible_key": true, - "children": [ - { - "type": "list", - "collapsible": true, - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "host_names", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "key": "version_start", - "label": "Version Start", - "type": "number", - "minimum": 0 - } - ] - } - } - ] - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management", - "is_group": true, - "children": [ - { - "type": "label", - "label": "It's important to note that once color management is activated on a project, all hosts will be color managed by default.
The OpenColorIO (OCIO) config file is used either from the global settings or from the host's overrides. It's worth
noting that the order of the defined configuration paths matters, with higher priority given to paths listed earlier in
the configuration list.

To avoid potential issues, ensure that the OCIO configuration path is not an absolute path and includes at least
the root token (Anatomy). This helps ensure that the configuration path remains valid across different environments and
avoids any hard-coding of paths that may be specific to one particular system.

Related documentation." - }, - { - "type": "boolean", - "key": "activate_global_color_management", - "label": "Enable Color Management" - }, - { - "key": "ocio_config", - "type": "dict", - "label": "OCIO config", - "collapsible": true, - "children": [ - { - "type": "path", - "key": "filepath", - "label": "Config path", - "multiplatform": false, - "multipath": true - } - ] - }, - { - "key": "file_rules", - "type": "dict", - "label": "File Rules (OCIO v1 only)", - "collapsible": true, - "children": [ - { - "type": "boolean", - "key": "activate_global_file_rules", - "label": "Enable File Rules" - }, - { - "key": "rules", - "label": "Rules", - "type": "dict-modifiable", - "highlight_content": true, - "collapsible": false, - "object_type": { - "type": "dict", - "children": [ - { - "key": "pattern", - "label": "Regex pattern", - "type": "text" - }, - { - "key": "colorspace", - "label": "Colorspace name", - "type": "text" - }, - { - "key": "ext", - "label": "File extension", - "type": "text" - } - ] - } - } - ] - } - - ] - }, - { - "type": "schema", - "name": "schema_global_publish" - }, - { - "type": "schema", - "name": "schema_global_tools" - }, - { - "type": "raw-json", - "label": "Project Folder Structure", - "key": "project_folder_structure", - "use_label_wrap": true, - "store_as_string": true - }, - { - "type": "schema", - "name": "schema_project_syncserver" - }, - { - "key": "project_plugins", - "type": "path", - "label": "Additional Project Plugin Paths", - "multiplatform": true, - "multipath": true, - "use_label_wrap": true - }, - { - "key": "project_environments", - "type": "raw-json", - "label": "Additional Project Environments (set on application launch)", - "use_label_wrap": true - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_harmony.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_harmony.json deleted file mode 100644 index f081c48b23..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_harmony.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "harmony", - "label": "Harmony", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectPalettes", - "label": "Collect Palettes", - "children": [ - { - "type": "label", - "label": "Set regular expressions to filter triggering on specific task names. '.*' means on all." - }, - { - "type": "list", - "key": "allowed_tasks", - "label": "Allowed tasks", - "object_type": "text" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "docstring": "Check if scene contains audio track.", - "key": "ValidateAudio", - "label": "ValidateAudio" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "docstring": "Check if loaded container is scene are latest versions.", - "key": "ValidateContainers", - "label": "ValidateContainers" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateSceneSettings", - "label": "Validate Scene Settings", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Validate if FrameStart, FrameEnd and Resolution match shot data in DB.\n Use regular expressions to limit validations only on particular asset or task names." - }, - { - "type": "list", - "key": "frame_check_filter", - "label": "Skip Frame check for Assets with", - "object_type": "text" - }, - { - "type": "list", - "key": "skip_resolution_check", - "object_type": "text", - "label": "Skip Resolution Check for Tasks" - }, - { - "type": "list", - "key": "skip_timelines_check", - "object_type": "text", - "label": "Skip Timeline Check for Tasks" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_hiero.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_hiero.json deleted file mode 100644 index d80edf902b..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_hiero.json +++ /dev/null @@ -1,327 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "hiero", - "label": "Hiero", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - }, - { - "key": "workfile", - "type": "dict", - "label": "Workfile", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "enum", - "key": "ocioConfigName", - "label": "OpenColorIO Config", - "enum_items": [ - { - "nuke-default": "nuke-default" - }, - { - "aces_1.0.3": "aces_1.0.3 (12)" - }, - { - "aces_1.1": "aces_1.1 (12, 13)" - }, - { - "aces_1.2": "aces_1.2 (13, 14)" - }, - { - "studio-config-v1.0.0_aces-v1.3_ocio-v2.1": "studio-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)" - }, - { - "cg-config-v1.0.0_aces-v1.3_ocio-v2.1": "cg-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)" - } - ] - }, - { - "type": "text", - "key": "workingSpace", - "label": "Working Space" - }, - { - "type": "text", - "key": "sixteenBitLut", - "label": "16 Bit Files" - }, - { - "type": "text", - "key": "eightBitLut", - "label": "8 Bit Files" - }, - { - "type": "text", - "key": "floatLut", - "label": "Floating Point Files" - }, - { - "type": "text", - "key": "logLut", - "label": "Log Files" - }, - { - "type": "text", - "key": "viewerLut", - "label": "Viewer" - }, - { - "type": "text", - "key": "thumbnailLut", - "label": "Thumbnails" - }, - { - "type": "text", - "key": "monitorOutLut", - "label": "Monitor" - } - ] - } - ] - }, - { - "key": "regexInputs", - "type": "dict", - "label": "Colorspace on Inputs by regex detection", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "regex", - "label": "Regex" - }, - { - "type": "text", - "key": "colorspace", - "label": "Colorspace" - } - ] - } - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Create plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateShotClip", - "label": "Create Shot Clip", - "is_group": true, - "children": [ - { - "type": "collapsible-wrap", - "label": "Shot Hierarchy And Rename Settings", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "hierarchy", - "label": "Shot parent hierarchy" - }, - { - "type": "boolean", - "key": "clipRename", - "label": "Rename clips" - }, - { - "type": "text", - "key": "clipName", - "label": "Clip name template" - }, - { - "type": "number", - "key": "countFrom", - "label": "Count sequence from" - }, - { - "type": "number", - "key": "countSteps", - "label": "Stepping number" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Template Keywords", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "folder", - "label": "{folder}" - }, - { - "type": "text", - "key": "episode", - "label": "{episode}" - }, - { - "type": "text", - "key": "sequence", - "label": "{sequence}" - }, - { - "type": "text", - "key": "track", - "label": "{track}" - }, - { - "type": "text", - "key": "shot", - "label": "{shot}" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Vertical Synchronization Of Attributes", - "collapsible": false, - "children": [ - { - "type": "boolean", - "key": "vSyncOn", - "label": "Enable Vertical Sync" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Attributes", - "collapsible": false, - "children": [ - { - "type": "number", - "key": "workfileFrameStart", - "label": "Workfiles Start Frame" - }, - { - "type": "number", - "key": "handleStart", - "label": "Handle start (head)" - }, - { - "type": "number", - "key": "handleEnd", - "label": "Handle end (tail)" - } - ] - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "load", - "label": "Loader plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "LoadClip", - "label": "Load Clip", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "families", - "label": "Families", - "object_type": "text" - }, - { - "type": "text", - "key": "clip_name_template", - "label": "Clip name template" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectInstanceVersion", - "label": "Collect Instance Version", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractReviewCutUpVideo", - "label": "Extract Review Cut Up Video", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "object_type": "text", - "key": "tags_addition", - "label": "Tags addition" - } - ] - } - ] - }, - { - "type": "schema", - "name": "schema_publish_gui_filter" - }, - { - "type": "schema", - "name": "schema_scriptsmenu" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_houdini.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_houdini.json deleted file mode 100644 index d4d0565ec9..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_houdini.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "houdini", - "label": "Houdini", - "is_file": true, - "children": [ - { - "type": "schema", - "name": "schema_houdini_general" - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "schema", - "name": "schema_houdini_scriptshelf" - }, - { - "type": "schema", - "name": "schema_houdini_create" - }, - { - "type": "schema", - "name": "schema_houdini_publish" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_kitsu.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_kitsu.json deleted file mode 100644 index 8aeed00542..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_kitsu.json +++ /dev/null @@ -1,143 +0,0 @@ -{ - "type": "dict", - "key": "kitsu", - "label": "Kitsu", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "dict", - "key": "entities_naming_pattern", - "label": "Entities naming pattern", - "children": [ - { - "type": "text", - "key": "episode", - "label": "Episode:" - }, - { - "type": "text", - "key": "sequence", - "label": "Sequence:" - }, - { - "type": "text", - "key": "shot", - "label": "Shot:" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Integrator" - }, - { - "type": "dict", - "collapsible": true, - "key": "IntegrateKitsuNote", - "label": "Integrate Kitsu Note", - "children": [ - { - "type": "boolean", - "key": "set_status_note", - "label": "Set status with note" - }, - { - "type": "text", - "key": "note_status_shortname", - "label": "Note shortname" - }, - { - "type": "dict", - "collapsible": true, - "key": "status_change_conditions", - "label": "Status change conditions", - "children": [ - { - "type": "list", - "key": "status_conditions", - "label": "Status conditions", - "object_type": { - "type": "dict", - "key": "condition_dict", - "children": [ - { - "type": "enum", - "key": "condition", - "label": "Condition", - "enum_items": [ - {"equal": "Equal"}, - {"not_equal": "Not equal"} - ] - }, - { - "type": "text", - "key": "short_name", - "label": "Short name" - } - ] - } - }, - { - "type": "list", - "key": "family_requirements", - "label": "Family requirements", - "object_type": { - "type": "dict", - "key": "requirement_dict", - "children": [ - { - "type": "enum", - "key": "condition", - "label": "Condition", - "enum_items": [ - {"equal": "Equal"}, - {"not_equal": "Not equal"} - ] - }, - { - "type": "text", - "key": "family", - "label": "Family" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "custom_comment_template", - "label": "Custom Comment Template", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Kitsu supports markdown and here you can create a custom comment template.
You can use data from your publishing instance's data." - }, - { - "key": "comment_template", - "type": "text", - "multiline": true, - "label": "Custom comment" - } - ] - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_max.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_max.json deleted file mode 100644 index e4d4d40ce7..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_max.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "max", - "label": "Max", - "is_file": true, - "children": [ - { - "key": "unit_scale_settings", - "type": "dict", - "label": "Set Unit Scale", - "collapsible": true, - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "scene_unit_scale", - "label": "Scene Unit Scale", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"Millimeters": "mm"}, - {"Centimeters": "cm"}, - {"Meters": "m"}, - {"Kilometers": "km"} - ] - } - ] - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "RenderSettings", - "label": "Render Settings", - "children": [ - { - "type": "text", - "key": "default_render_image_folder", - "label": "Default render image folder" - }, - { - "key": "aov_separator", - "label": "AOV Separator character", - "type": "enum", - "multiselection": false, - "default": "underscore", - "enum_items": [ - {"dash": "- (dash)"}, - {"underscore": "_ (underscore)"}, - {"dot": ". (dot)"} - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"bmp": "bmp"}, - {"exr": "exr"}, - {"tif": "tif"}, - {"tiff": "tiff"}, - {"jpg": "jpg"}, - {"png": "png"}, - {"tga": "tga"}, - {"dds": "dds"} - ] - }, - { - "type": "boolean", - "key": "multipass", - "label": "multipass" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateReview", - "label": "Create Review", - "children": [ - { - "type": "number", - "key": "review_width", - "label": "Review Width" - }, - { - "type": "number", - "key": "review_height", - "label": "Review Height" - }, - { - "type": "number", - "key": "percentSize", - "label": "Percent of Output" - }, - { - "type": "boolean", - "key": "keep_images", - "label": "Keep Image Sequences" - }, - { - "key": "image_format", - "label": "Image Format Options", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"exr": "exr"}, - {"jpg": "jpg"}, - {"png": "png"}, - {"tga": "tga"} - ] - }, - { - "key": "visual_style", - "label": "Preference", - "type": "enum", - "multiselection": false, - "defaults": "Realistic", - "enum_items": [ - {"Realistic": "Realistic"}, - {"Shaded": "Shaded"}, - {"Facets": "Facets"}, - {"ConsistentColors": "ConsistentColors"}, - {"HiddenLine": "HiddenLine"}, - {"Wireframe": "Wireframe"}, - {"BoundingBox": "BoundingBox"}, - {"Ink": "Ink"}, - {"ColorInk": "ColorInk"}, - {"Acrylic": "Acrylic"}, - {"Tech": "Tech"}, - {"Graphite": "Graphite"}, - {"ColorPencil": "ColorPencil"}, - {"Pastel": "Pastel"}, - {"Clay": "Clay"}, - {"ModelAssist": "ModelAssist"} - ] - }, - { - "key": "viewport_preset", - "label": "Pre-View Preset", - "type": "enum", - "multiselection": false, - "defaults": "Quality", - "enum_items": [ - {"Quality": "Quality"}, - {"Standard": "Standard"}, - {"Performance": "Performance"}, - {"DXMode": "DXMode"}, - {"Customize": "Customize"} - ] - }, - { - "key": "anti_aliasing", - "label": "Anti-aliasing Quality", - "type": "enum", - "multiselection": false, - "defaults": "None", - "enum_items": [ - {"None": "None"}, - {"2X": "2X"}, - {"4X": "4X"}, - {"8X": "8X"} - ] - }, - { - "type": "boolean", - "key": "vp_texture", - "label": "Viewport Texture" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "PointCloud", - "label": "Point Cloud", - "children": [ - { - "type": "label", - "label": "Define the channel attribute names before exporting as PRT" - }, - { - "type": "dict-modifiable", - "collapsible": true, - "key": "attribute", - "label": "Channel Attribute", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "schema", - "name": "schema_max_publish" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_maya.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_maya.json deleted file mode 100644 index a6fd742b40..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_maya.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "maya", - "label": "Maya", - "is_file": true, - "children": [ - { - "type": "boolean", - "key": "open_workfile_post_initialization", - "label": "Open Workfile Post Initialization" - }, - { - "type": "dict", - "key": "explicit_plugins_loading", - "label": "Explicit Plugins Loading", - "collapsible": true, - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "plugins_to_load", - "label": "Plugins To Load", - "object_type": { - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "name", - "label": "Name" - } - ] - } - } - ] - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - }, - { - "key": "workfile", - "type": "dict", - "label": "Workfile", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "renderSpace", - "label": "Rendering Space" - }, - { - "type": "text", - "key": "displayName", - "label": "Display" - }, - { - "type": "text", - "key": "viewName", - "label": "View" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "[Deprecated] please migrate all to 'Workfile' and enable it.", - "collapsible": true, - "collapsed": true, - "children": [ - { - "key": "colorManagementPreference_v2", - "type": "dict", - "label": "[DEPRECATED] Color Management Preference v2 (Maya 2022+)", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Use Color Management Preference v2" - }, - { - "type": "text", - "key": "renderSpace", - "label": "Rendering Space" - }, - { - "type": "text", - "key": "displayName", - "label": "Display" - }, - { - "type": "text", - "key": "viewName", - "label": "View" - } - ] - }, - { - "key": "colorManagementPreference", - "type": "dict", - "label": "[DEPRECATED] Color Management Preference (legacy)", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "renderSpace", - "label": "Rendering Space" - }, - { - "type": "text", - "key": "viewTransform", - "label": "Viewer Transform (workfile/viewName)" - } - ] - } - ] - } - ] - }, - { - "type": "text", - "multiline" : true, - "use_label_wrap": true, - "key": "mel_workspace", - "label": "Maya MEL Workspace" - }, - { - "type": "dict-modifiable", - "key": "ext_mapping", - "label": "Extension Mapping", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "maya-dirmap", - "label": "Maya Directory Mapping", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "use_env_var_as_root", - "label": "Use env var placeholder in referenced paths", - "docstring": "Use ${} placeholder instead of absolute value of a root in referenced filepaths." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict", - "key": "paths", - "children": [ - { - "type": "list", - "object_type": "text", - "key": "source-path", - "label": "Source Path" - }, - { - "type": "list", - "object_type": "text", - "key": "destination-path", - "label": "Destination Path" - } - ] - } - ] - }, - { - "type": "dict", - "key": "include_handles", - "collapsible": true, - "label": "Include/Exclude Handles in default playback & render range", - "children": [ - { - "key": "include_handles_default", - "label": "Include handles by default", - "type": "boolean" - }, - { - "type": "list", - "key": "per_task_type", - "label": "Include/exclude handles by task type", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "task-types-enum", - "key": "task_type", - "label": "Task types" - }, - { - "type": "boolean", - "key": "include_handles", - "label": "Include handles" - } - ] - } - } - ] - }, - { - "type": "schema", - "name": "schema_scriptsmenu" - }, - { - "type": "schema", - "name": "schema_maya_render_settings" - }, - { - "type": "schema", - "name": "schema_maya_create" - }, - { - "type": "schema", - "name": "schema_maya_publish" - }, - { - "type": "schema", - "name": "schema_maya_load" - }, - { - "type": "schema", - "name": "schema_workfile_build" - }, - { - "type": "schema", - "name": "schema_templated_workfile_build" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_nuke.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_nuke.json deleted file mode 100644 index 0b24c8231c..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_nuke.json +++ /dev/null @@ -1,296 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "nuke", - "label": "Nuke", - "is_file": true, - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "general", - "label": "General", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "menu", - "label": "OpenPype Menu shortcuts", - "children": [ - { - "type": "text", - "key": "create", - "label": "Create..." - }, - { - "type": "text", - "key": "publish", - "label": "Publish..." - }, - { - "type": "text", - "key": "load", - "label": "Load..." - }, - { - "type": "text", - "key": "manage", - "label": "Manage..." - }, - { - "type": "text", - "key": "build_workfile", - "label": "Build Workfile" - } - ] - } - ] - }, - { - "type": "schema", - "name": "schema_nuke_imageio" - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "nuke-dirmap", - "label": "Nuke Directory Mapping", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict", - "key": "paths", - "children": [ - { - "type": "list", - "object_type": "text", - "key": "source-path", - "label": "Source Path" - }, - { - "type": "list", - "object_type": "text", - "key": "destination-path", - "label": "Destination Path" - } - ] - } - ] - }, - { - "type": "schema", - "name": "schema_scriptsmenu" - }, - { - "type": "schema", - "name": "schema_nuke_scriptsgizmo" - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateWriteRender", - "label": "CreateWriteRender", - "is_group": true, - "children": [ - { - "type": "text", - "key": "temp_rendering_path_template", - "label": "Temporary rendering path template" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "schema_template", - "name": "template_nuke_write_attrs" - }, - { - "key": "prenodes", - "label": "Pre write nodes", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "nodeclass", - "label": "Node class", - "type": "text" - }, - { - "key": "dependent", - "label": "Outside node dependency", - "type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Node knobs", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateWritePrerender", - "label": "CreateWritePrerender", - "is_group": true, - "children": [ - { - "type": "text", - "key": "temp_rendering_path_template", - "label": "Temporary rendering path template" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "schema_template", - "name": "template_nuke_write_attrs" - }, - { - "key": "prenodes", - "label": "Pre write nodes", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "nodeclass", - "label": "Node class", - "type": "text" - }, - { - "key": "dependent", - "label": "Outside node dependency", - "type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Node knobs", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateWriteImage", - "label": "CreateWriteImage", - "is_group": true, - "children": [ - { - "type": "text", - "key": "temp_rendering_path_template", - "label": "Temporary rendering path template" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "schema_template", - "name": "template_nuke_write_attrs" - }, - { - "key": "prenodes", - "label": "Pre write nodes", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "nodeclass", - "label": "Node class", - "type": "text" - }, - { - "key": "dependent", - "label": "Outside node dependency", - "type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Node knobs", - "key": "knobs" - } - ] - } - ] - } - } - ] - } - ] - }, - { - "type": "schema", - "name": "schema_nuke_publish", - "template_data": [] - }, - { - "type": "schema", - "name": "schema_nuke_load", - "template_data": [] - }, - { - "type": "schema_template", - "name": "template_workfile_options" - }, - { - "type": "label", - "label": "^ Settings and for Workfile Builder is deprecated and will be soon removed.
Please use Template Workfile Build Settings instead." - }, - { - "type": "schema", - "name": "schema_templated_workfile_build" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_photoshop.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_photoshop.json deleted file mode 100644 index 20d4ff0aa3..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_photoshop.json +++ /dev/null @@ -1,386 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "photoshop", - "label": "Photoshop", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (remapped to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_remapped" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "ImageCreator", - "label": "Create Image", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Manually create instance from layer or group of layers. \n Separate review could be created for this image to be sent to Asset Management System." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review by default" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "AutoImageCreator", - "label": "Create Flatten Image", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Auto create image for all visible layers, used for simplified processing. \n Separate review could be created for this image to be sent to Asset Management System." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review by default" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ReviewCreator", - "label": "Create Review", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Auto create review instance containing all published image instances or visible layers if no image instance." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": true - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "WorkfileCreator", - "label": "Create Workfile", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Auto create workfile instance" - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "is_group": true, - "key": "CollectColorCodedInstances", - "label": "Collect Color Coded Instances", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Set color for publishable layers, set its resulting family and template for subset name. \nCan create flatten image from published instances.(Applicable only for remote publishing!)" - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": true - }, - { - "key": "create_flatten_image", - "label": "Create flatten image", - "type": "enum", - "multiselection": false, - "enum_items": [ - { "flatten_with_images": "Flatten with images" }, - { "flatten_only": "Flatten only" }, - { "no": "No" } - ] - }, - { - "type": "text", - "key": "flatten_subset_template", - "label": "Subset template for flatten image" - }, - { - "type": "list", - "key": "color_code_mapping", - "label": "Color code mappings", - "use_label_wrap": false, - "collapsible": false, - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "key": "color_code", - "label": "Color codes for layers", - "type": "enum", - "multiselection": true, - "enum_items": [ - { "red": "red" }, - { "orange": "orange" }, - { "yellowColor": "yellow" }, - { "grain": "green" }, - { "blue": "blue" }, - { "violet": "violet" }, - { "gray": "gray" } - ] - }, - { - "type": "list", - "key": "layer_name_regex", - "label": "Layer name regex", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "family", - "label": "Resulting family", - "type": "enum", - "enum_items": [ - { - "image": "image" - } - ] - }, - { - "type": "text", - "key": "subset_template_name", - "label": "Subset template name" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectReview", - "label": "Collect Review", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": true - } - ] - }, - { - "type": "dict", - "key": "CollectVersion", - "label": "Collect Version", - "checkbox_key": "enabled", - "children": [ - { - "type": "label", - "label": "Synchronize version for image and review instances by workfile version." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateContainers", - "label": "ValidateContainers" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateNaming", - "label": "Validate naming of subsets and layers", - "children": [ - { - "type": "label", - "label": "Subset cannot contain invalid characters or extract to file would fail" - }, - { - "type": "text", - "key": "invalid_chars", - "label": "Regex pattern of invalid characters" - }, - { - "type": "text", - "key": "replace_char", - "label": "Replacement character" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractImage", - "label": "Extract Image", - "children": [ - { - "type": "label", - "label": "Currently only jpg and png are supported" - }, - { - "type": "list", - "key": "formats", - "label": "Extract Formats", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractReview", - "label": "Extract Review", - "children": [ - { - "type": "boolean", - "key": "make_image_sequence", - "label": "Makes an image sequence instead of a flatten image" - }, - { - "type": "number", - "key": "max_downscale_size", - "label": "Maximum size of sources for review", - "tooltip": "FFMpeg can only handle limited resolution for creation of review and/or thumbnail", - "minimum": 300, - "maximum": 16384, - "decimal": 0 - }, - { - "type": "dict", - "collapsible": false, - "key": "jpg_options", - "label": "Extracted jpg Options", - "children": [ - { - "type": "schema", - "name": "schema_representation_tags" - } - ] - }, - { - "type": "dict", - "collapsible": false, - "key": "mov_options", - "label": "Extracted mov Options", - "children": [ - { - "type": "schema", - "name": "schema_representation_tags" - } - ] - } - ] - } - ] - }, - { - "type": "schema_template", - "name": "template_workfile_options", - "skip_paths": [ - "workfile_builder/builder_on_start", - "workfile_builder/profiles" - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_resolve.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_resolve.json deleted file mode 100644 index 650470850e..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_resolve.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "resolve", - "label": "DaVinci Resolve", - "is_file": true, - "children": [ - { - "type": "boolean", - "key": "launch_openpype_menu_on_start", - "label": "Launch OpenPype menu on start of Resolve" - }, - { - "key": "imageio", - "type": "dict", - "label": "Color Management (remapped to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_remapped" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateShotClip", - "label": "Create Shot Clip", - "is_group": true, - "children": [ - { - "type": "collapsible-wrap", - "label": "Shot Hierarchy And Rename Settings", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "hierarchy", - "label": "Shot parent hierarchy" - }, - { - "type": "boolean", - "key": "clipRename", - "label": "Rename clips" - }, - { - "type": "text", - "key": "clipName", - "label": "Clip name template" - }, - { - "type": "number", - "key": "countFrom", - "label": "Count sequence from" - }, - { - "type": "number", - "key": "countSteps", - "label": "Stepping number" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Template Keywords", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "folder", - "label": "{folder}" - }, - { - "type": "text", - "key": "episode", - "label": "{episode}" - }, - { - "type": "text", - "key": "sequence", - "label": "{sequence}" - }, - { - "type": "text", - "key": "track", - "label": "{track}" - }, - { - "type": "text", - "key": "shot", - "label": "{shot}" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Vertical Synchronization Of Attributes", - "collapsible": false, - "children": [ - { - "type": "boolean", - "key": "vSyncOn", - "label": "Enable Vertical Sync" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot Attributes", - "collapsible": false, - "children": [ - { - "type": "number", - "key": "workfileFrameStart", - "label": "Workfiles Start Frame" - }, - { - "type": "number", - "key": "handleStart", - "label": "Handle start (head)" - }, - { - "type": "number", - "key": "handleEnd", - "label": "Handle end (tail)" - } - ] - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_royalrender.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_royalrender.json deleted file mode 100644 index f4bf2f51ba..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_royalrender.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "royalrender", - "label": "Royal Render", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "rr_root-enum", - "key": "rr_paths", - "label": "Royal Render Roots", - "multiselect": true - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Collectors" - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectSequencesFromJob", - "label": "Collect Sequences from the Job", - "children": [ - { - "type": "boolean", - "key": "review", - "label": "Generate reviews from sequences" - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_shotgrid.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_shotgrid.json deleted file mode 100644 index a5f1c57121..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_shotgrid.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "type": "dict", - "key": "shotgrid", - "label": "Shotgrid", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "number", - "key": "shotgrid_project_id", - "label": "Shotgrid project id" - }, - { - "type": "shotgrid_url-enum", - "key": "shotgrid_server", - "label": "Shotgrid Server", - "multiselection": false - }, - { - "type": "dict", - "key": "event", - "label": "Event Handler", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "fields", - "label": "Fields Template", - "collapsible": true, - "children": [ - { - "type": "dict", - "key": "asset", - "label": "Asset", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "type", - "label": "Asset Type" - } - ] - }, - { - "type": "dict", - "key": "sequence", - "label": "Sequence", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "episode_link", - "label": "Episode link" - } - ] - }, - { - "type": "dict", - "key": "shot", - "label": "Shot", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "episode_link", - "label": "Episode link" - }, - { - "type": "text", - "key": "sequence_link", - "label": "Sequence link" - } - ] - }, - { - "type": "dict", - "key": "task", - "label": "Task", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "step", - "label": "Step link" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_slack.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_slack.json deleted file mode 100644 index 1a9804cd4f..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_slack.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "type": "dict", - "key": "slack", - "label": "Slack", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "text", - "key": "token", - "label": "Auth Token" - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Fill combination of families, task names and hosts when to send notification" - }, - { - "type": "dict", - "key": "CollectSlackFamilies", - "label": "Notification to Slack", - "use_label_wrap": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "list", - "collapsible": true, - "key": "profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Host names", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "number", - "key": "review_upload_limit", - "label": "Upload review maximum file size (MB)", - "decimal": 2, - "default": 50, - "minimum": 0, - "maximum": 1000000 - }, - { - "type": "separator" - }, - { - "key": "channel_messages", - "label": "Messages to channels", - "type": "list", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "object_type": "text", - "key": "channels", - "label": "Channels" - }, - { - "type": "boolean", - "key": "upload_thumbnail", - "label": "Upload thumbnail" - }, - { - "type": "boolean", - "key": "upload_review", - "label": "Upload review" - }, - { - "type": "text", - "multiline": true, - "key": "message", - "label": "Message" - } - ] - } - } - ] - } - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_standalonepublisher.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_standalonepublisher.json deleted file mode 100644 index ae25007683..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_standalonepublisher.json +++ /dev/null @@ -1,420 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "standalonepublisher", - "label": "Standalone Publisher", - "is_file": true, - "children": [ - { - "type": "dict-modifiable", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "family", - "label": "Family" - }, - { - "type": "text", - "key": "icon", - "label": "Icon" - }, - { - "type": "list", - "key": "defaults", - "label": "Defaults", - "object_type": { - "type": "text" - } - }, - { - "type": "text", - "key": "help", - "label": "Help" - } - ] - } - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectTextures", - "label": "Collect Textures", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "list", - "key": "main_workfile_extensions", - "object_type": "text", - "label": "Main workfile extensions" - }, - { - "key": "other_workfile_extensions", - "label": "Support workfile extensions", - "type": "list", - "object_type": "text" - }, - { - "type": "list", - "key": "texture_extensions", - "object_type": "text", - "label": "Texture extensions" - }, - { - "type": "list", - "key": "workfile_families", - "object_type": "text", - "label": "Additional families for workfile" - }, - { - "type": "list", - "key": "texture_families", - "object_type": "text", - "label": "Additional families for textures" - }, - { - "type": "list", - "key": "color_space", - "object_type": "text", - "label": "Color spaces" - }, - { - "type": "dict", - "collapsible": false, - "key": "input_naming_patterns", - "label": "Regex patterns for naming conventions", - "children": [ - { - "type": "label", - "label": "Add regex groups matching expected name" - }, - { - "type": "list", - "object_type": "text", - "key": "workfile", - "label": "Workfile naming pattern" - }, - { - "type": "list", - "object_type": "text", - "key": "textures", - "label": "Textures naming pattern" - } - ] - }, - { - "type": "dict", - "collapsible": false, - "key": "input_naming_groups", - "label": "Group order for regex patterns", - "children": [ - { - "type": "label", - "label": "Add names of matched groups in correct order. Available values: ('filler', 'asset', 'shader', 'version', 'channel', 'color_space', 'udim')" - }, - { - "type": "list", - "object_type": "text", - "key": "workfile", - "label": "Workfile group positions" - }, - { - "type": "list", - "object_type": "text", - "key": "textures", - "label": "Textures group positions" - } - ] - }, - { - "type": "text", - "key": "workfile_subset_template", - "label": "Subset name template for workfile" - }, - { - "type": "text", - "key": "texture_subset_template", - "label": "Subset name template for textures" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateSceneSettings", - "label": "Validate Scene Settings", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Validate if frame range in DB matches number of published files" - }, - { - "type": "list", - "key": "check_extensions", - "object_type": "text", - "label": "Check Frame Range for Extensions" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "list", - "key": "skip_timelines_check", - "object_type": "text", - "label": "Skip Frame Range check for Tasks" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractThumbnailSP", - "label": "ExtractThumbnailSP", - "is_group": true, - "children": [ - { - "type": "dict", - "collapsible": false, - "key": "ffmpeg_args", - "label": "ffmpeg_args", - "children": [ - { - "type": "list", - "object_type": "text", - "key": "input", - "label": "input" - }, - { - "type": "list", - "object_type": "text", - "key": "output", - "label": "output" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectEditorial", - "label": "Collect Editorial", - "is_group": true, - "children": [ - { - "type": "text", - "key": "source_dir", - "label": "Editorial resources pointer" - }, - { - "type": "list", - "key": "extensions", - "label": "Accepted extensions", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectHierarchyInstance", - "label": "Collect Instance Hierarchy", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "shot_rename", - "label": "Shot Rename" - }, - { - "type": "text", - "key": "shot_rename_template", - "label": "Shot rename template" - }, - { - "key": "shot_rename_search_patterns", - "label": "Shot renaming paterns search", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "text" - } - }, - { - "type": "dict", - "key": "shot_add_hierarchy", - "label": "Shot hierarchy", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "parents_path", - "label": "Parents path template" - }, - { - "key": "parents", - "label": "Parents", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "key": "shot_add_tasks", - "label": "Add tasks to shot", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "task-types-enum", - "key": "type", - "label": "Task type" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectInstances", - "label": "Collect Clip Instances", - "is_group": true, - "children": [ - { - "type": "number", - "key": "custom_start_frame", - "label": "Custom start frame", - "default": 0, - "minimum": 1, - "maximum": 100000 - }, - { - "type": "number", - "key": "timeline_frame_start", - "label": "Timeline start frame", - "default": 90000, - "minimum": 0, - "maximum": 10000000 - }, - { - "type": "number", - "key": "timeline_frame_offset", - "label": "Timeline frame offset", - "default": 0, - "minimum": -1000000, - "maximum": 1000000 - }, - { - "key": "subsets", - "label": "Subsets", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "family", - "label": "Family" - }, - { - "type": "list", - "key": "families", - "label": "Families", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "list", - "key": "extensions", - "label": "Extensions", - "object_type": "text" - }, - { - "key": "version", - "label": "Version lock", - "type": "number", - "default": 0, - "minimum": 0, - "maximum": 10 - } - , - { - "type": "boolean", - "key": "keepSequence", - "label": "Keep sequence if used for review", - "default": false - } - ] - } - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_substancepainter.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_substancepainter.json deleted file mode 100644 index 6be8cecad3..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_substancepainter.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "substancepainter", - "label": "Substance Painter", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "dict-modifiable", - "key": "shelves", - "label": "Shelves", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_syncserver.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_syncserver.json deleted file mode 100644 index 7e1b0114f5..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_syncserver.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "type": "dict", - "key": "sync_server", - "label": "Site Sync (beta testing)", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict", - "key": "config", - "label": "Config", - "collapsible": true, - "children": [ - { - "type": "text", - "key": "retry_cnt", - "label": "Retry Count" - }, - { - "type": "text", - "key": "loop_delay", - "label": "Loop Delay" - }, - { - "type": "list", - "key": "always_accessible_on", - "label": "Always accessible on sites", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "text", - "key": "active_site", - "label": "User Default Active Site" - }, - { - "type": "text", - "key": "remote_site", - "label": "User Default Remote Site" - } - ] - }, - { - "type": "sync-server-sites", - "collapsible": true, - "key": "sites", - "label": "Sites", - "collapsible_key": false - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_traypublisher.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_traypublisher.json deleted file mode 100644 index 93e6325b5a..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_traypublisher.json +++ /dev/null @@ -1,369 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "traypublisher", - "label": "Tray Publisher", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (derived to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_derived" - } - ] - }, - { - "type": "list", - "collapsible": true, - "key": "simple_creators", - "label": "Simple Create Plugins", - "use_label_wrap": true, - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "family", - "label": "Family" - }, - { - "type": "text", - "key": "identifier", - "label": "Identifier", - "placeholder": "< Use 'Family' >", - "tooltip": "All creators must have unique identifier.\nBy default is used 'family' but if you need to have more creators with same families\nyou have to set identifier too." - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "icon", - "label": "Icon" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "description", - "label": "Description" - }, - { - "type": "text", - "key": "detailed_description", - "label": "Detailed Description", - "multiline": true - }, - { - "type": "separator" - }, - { - "key": "allow_sequences", - "label": "Allow sequences", - "type": "boolean" - }, - { - "key": "allow_multiple_items", - "label": "Allow multiple items", - "type": "boolean" - }, - { - "type": "boolean", - "key": "allow_version_control", - "label": "Allow version control", - "default": false - }, - { - "type": "list", - "key": "extensions", - "label": "Extensions", - "use_label_wrap": true, - "collapsible_key": true, - "collapsed": false, - "object_type": "text" - } - ] - } - }, - { - "type": "dict", - "collapsible": true, - "key": "editorial_creators", - "label": "Editorial creator plugins", - "use_label_wrap": true, - "collapsible_key": true, - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "editorial_simple", - "label": "Editorial simple creator", - "use_label_wrap": true, - "collapsible_key": true, - "children": [ - - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "splitter" - }, - { - "type": "collapsible-wrap", - "label": "Shot metadata creator", - "collapsible": true, - "collapsed": true, - "children": [ - { - "key": "clip_name_tokenizer", - "label": "Clip name tokenizer", - "type": "dict-modifiable", - "highlight_content": true, - "tooltip": "Using Regex expression to create tokens. \nThose can be used later in \"Shot rename\" creator \nor \"Shot hierarchy\". \n\nTokens should be decorated with \"_\" on each side", - "object_type": { - "type": "text" - } - }, - { - "type": "dict", - "key": "shot_rename", - "label": "Shot rename", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "shot_rename_template", - "label": "Shot rename template", - "tooltip":"Template only supports Anatomy keys and Tokens \nfrom \"Clip name tokenizer\"" - } - ] - }, - { - "type": "dict", - "key": "shot_hierarchy", - "label": "Shot hierarchy", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "parents_path", - "label": "Parents path template", - "tooltip": "Using keys from \"Token to parent convertor\" or tokens directly" - }, - { - "key": "parents", - "label": "Token to parent convertor", - "type": "list", - "highlight_content": true, - "tooltip": "The left side is key to be used in template. \nThe right is value build from Tokens comming from \n\"Clip name tokenizer\"", - "object_type": { - "type": "dict", - "children": [ - { - "type": "enum", - "key": "type", - "label": "Parent type", - "enum_items": [ - {"Project": "Project"}, - {"Folder": "Folder"}, - {"Episode": "Episode"}, - {"Sequence": "Sequence"} - ] - }, - { - "type": "text", - "key": "name", - "label": "Parent token name", - "tooltip": "Unique name used in \"Parent path template\"" - }, - { - "type": "text", - "key": "value", - "label": "Parent name value", - "tooltip": "Template where any text, Anatomy keys and Tokens could be used" - } - ] - } - } - ] - }, - { - "key": "shot_add_tasks", - "label": "Add tasks to shot", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "task-types-enum", - "key": "type", - "label": "Task type", - "multiselection": false - } - ] - } - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Shot's subset creator", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "list", - "key": "family_presets", - "label": "Family presets", - "object_type": { - "type": "dict", - "children": [ - { - "type": "enum", - "key": "family", - "label": "Family", - "enum_items": [ - {"review": "review"}, - {"plate": "plate"}, - {"audio": "audio"} - ] - }, - { - "type": "text", - "key": "variant", - "label": "Variant", - "placeholder": "< Inherited >" - }, - { - "type": "boolean", - "key": "review", - "label": "Review", - "default": true - }, - { - "type": "enum", - "key": "output_file_type", - "label": "Integrating file type", - "enum_items": [ - {".mp4": "MP4"}, - {".mov": "MOV"}, - {".wav": "WAV"} - ] - } - ] - } - } - ] - } - ] - } - ] - }, - { - "key": "create", - "label": "Create plugins", - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "BatchMovieCreator", - "label": "Batch Movie Creator", - "collapsible_key": true, - "children": [ - { - "type": "label", - "label": "Allows to publish multiple video files in one go.
Name of matching asset is parsed from file names ('asset.mov', 'asset_v001.mov', 'my_asset_to_publish.mov')" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - }, - { - "type": "list", - "key": "default_tasks", - "label": "Default tasks", - "object_type": { - "type": "text" - } - }, - { - "type": "list", - "key": "extensions", - "label": "Extensions", - "use_label_wrap": true, - "collapsible_key": true, - "collapsed": false, - "object_type": "text" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "schema_template", - "name": "template_validate_plugin", - "template_data": [ - { - "key": "CollectSequenceFrameData", - "label": "Collect Original Sequence Frame Data" - }, - { - "key": "ValidateFrameRange", - "label": "Validate frame range" - }, - { - "key": "ValidateExistingVersion", - "label": "Validate Existing Version" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_tvpaint.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_tvpaint.json deleted file mode 100644 index 5b2647bc6d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_tvpaint.json +++ /dev/null @@ -1,441 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "tvpaint", - "label": "TVPaint", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (derived to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_derived" - } - ] - }, - { - "type": "boolean", - "key": "stop_timer_on_application_exit", - "label": "Stop timer on application exit" - }, - { - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Create plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "create_workfile", - "label": "Create Workfile", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create_review", - "label": "Create Review", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create_render_scene", - "label": "Create Render Scene", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active_on_create", - "label": "Active by default" - }, - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review by default" - }, - { - "type": "text", - "key": "default_pass_name", - "label": "Default beauty pass" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create_render_layer", - "label": "Create Render Layer", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review by default" - }, - { - "type": "text", - "key": "default_pass_name", - "label": "Default beauty pass" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "create_render_pass", - "label": "Create Render Pass", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "mark_for_review", - "label": "Review by default" - }, - { - "type": "text", - "key": "default_variant", - "label": "Default variant" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default variants", - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "auto_detect_render", - "label": "Auto-Detect Create Render", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "The creator tries to auto-detect Render Layers and Render Passes in scene. For Render Layers is used group name as a variant and for Render Passes is used TVPaint layer name.

Group names can be renamed by their used order in scene. The renaming template where can be used {group_index} formatting key which is filled by \"used position index of group\".
- Template: L{group_index}
- Group offset: 10
- Group padding: 3
Would create group names \"L010\", \"L020\", ..." - }, - { - "type": "boolean", - "key": "allow_group_rename", - "label": "Allow group rename" - }, - { - "type": "text", - "key": "group_name_template", - "label": "Group name template" - }, - { - "key": "group_idx_offset", - "label": "Group index Offset", - "type": "number", - "decimal": 0, - "minimum": 1 - }, - { - "key": "group_idx_padding", - "type": "number", - "label": "Group index Padding", - "decimal": 0, - "minimum": 1 - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectRenderInstances", - "label": "Collect Render Instances", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "ignore_render_pass_transparency", - "label": "Ignore Render Pass opacity" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractSequence", - "label": "ExtractSequence", - "is_group": true, - "children": [ - { - "type": "label", - "label": "Review BG color is used for whole scene review and for thumbnails." - }, - { - "type": "color", - "key": "review_bg", - "label": "Review BG color", - "use_alpha": false - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateProjectSettings", - "label": "ValidateProjectSettings", - "docstring": "Validate if FPS and Resolution match shot data" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateMarks", - "label": "Validate MarkIn/Out", - "docstring": "Validate MarkIn/Out match Frame start/end on shot data" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateStartFrame", - "label": "Validate Scene Start Frame", - "docstring": "Validate first frame of scene is set to '0'." - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateAssetName", - "label": "ValidateAssetName", - "docstring": "Validate if shot on instances metadata is same as workfiles shot" - } - ] - }, - { - "type": "dict", - "key": "ExtractConvertToEXR", - "label": "Extract Convert To EXR", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "WARNING: This plugin does not work on MacOS (using OIIO tool)." - }, - { - "type": "boolean", - "key": "replace_pngs", - "label": "Replace source PNG" - }, - { - "type": "enum", - "key": "exr_compression", - "label": "EXR Compression", - "multiselection": false, - "enum_items": [ - {"ZIP": "ZIP"}, - {"ZIPS": "ZIPS"}, - {"DWAA": "DWAA"}, - {"DWAB": "DWAB"}, - {"PIZ": "PIZ"}, - {"RLE": "RLE"}, - {"PXR24": "PXR24"}, - {"B44": "B44"}, - {"B44A": "B44A"}, - {"none": "None"} - ] - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "load", - "label": "Loader plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "LoadImage", - "label": "Load Image", - "children": [ - { - "key": "defaults", - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "stretch", - "label": "Stretch" - }, - { - "type": "boolean", - "key": "timestretch", - "label": "TimeStretch" - }, - { - "type": "boolean", - "key": "preload", - "label": "Preload" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ImportImage", - "label": "Import Image", - "children": [ - { - "key": "defaults", - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "stretch", - "label": "Stretch" - }, - { - "type": "boolean", - "key": "timestretch", - "label": "TimeStretch" - }, - { - "type": "boolean", - "key": "preload", - "label": "Preload" - } - ] - } - ] - } - ] - }, - { - "type": "schema_template", - "name": "template_workfile_options", - "skip_paths": [ - "workfile_builder/builder_on_start", - "workfile_builder/profiles" - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_unreal.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_unreal.json deleted file mode 100644 index b23744f406..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_unreal.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "unreal", - "label": "Unreal Engine", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - } - ] - }, - { - "type": "boolean", - "key": "level_sequences_for_layouts", - "label": "Generate level sequences when loading layouts" - }, - { - "type": "boolean", - "key": "delete_unmatched_assets", - "label": "Delete assets that are not matched" - }, - { - "type": "text", - "key": "render_config_path", - "label": "Render Config Path" - }, - { - "type": "number", - "key": "preroll_frames", - "label": "Pre-roll frames" - }, - { - "key": "render_format", - "label": "Render format", - "type": "enum", - "multiselection": false, - "enum_items": [ - {"png": "PNG"}, - {"exr": "EXR"}, - {"jpg": "JPG"}, - {"bmp": "BMP"} - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "project_setup", - "label": "Project Setup", - "children": [ - { - "type": "boolean", - "key": "dev_mode", - "label": "Dev mode" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_webpublisher.json b/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_webpublisher.json deleted file mode 100644 index 87de732d69..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schema_project_webpublisher.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "webpublisher", - "label": "Web Publisher", - "is_file": true, - "children": [ - { - "key": "imageio", - "type": "dict", - "label": "Color Management (derived to OCIO)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_derived" - } - ] - }, - { - "type": "list", - "collapsible": true, - "use_label_wrap": true, - "key": "timeout_profiles", - "label": "Timeout profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum", - "multiselection": true - }, - { - "type": "separator" - }, - { - "type": "number", - "key": "timeout", - "label": "Timeout (sec)" - } - ] - } - }, - { - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectPublishedFiles", - "label": "Collect Published Files", - "children": [ - { - "type": "label", - "label": "Select if all versions of published items should be kept same. (As max(published) + 1.)" - }, - { - "type": "boolean", - "key": "sync_next_version", - "label": "Sync next publish version" - }, - { - "type": "label", - "label": "Configure resulting family and tags on representation based on uploaded file and task.
Eg. '.png' is uploaded >> create instance of 'render' family
'Create review' in Tags >> mark representation to create review from." - }, - { - "type": "dict-modifiable", - "collapsible": true, - "key": "task_type_to_family", - "label": "Task type to family mapping", - "collapsible_key": true, - "object_type": { - "type": "list", - "collapsible": true, - "key": "task_type", - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "is_sequence", - "label": "Is Sequence" - }, - { - "type": "list", - "key": "extensions", - "label": "Extensions", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "list", - "key": "families", - "label": "Families", - "object_type": "text" - }, - { - "type": "schema", - "name": "schema_representation_tags" - }, - { - "type": "text", - "key": "result_family", - "label": "Resulting family" - } - ] - } - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectTVPaintInstances", - "label": "Collect TVPaint Instances", - "children": [ - { - "type": "label", - "label": "Regex helps to extract render layer and pass names from TVPaint layer name.
The regex must contain named groups 'layer' and 'pass' which are used for creation of RenderPass instances.

Example layer name: \"L001_Person_Hand\"
Example regex: \"(?P<layer>L[0-9]{3}_\\w+)_(?P<pass>.+)\"
Extracted layer: \"L001_Person\"
Extracted pass: \"Hand\"" - }, - { - "type": "text", - "key": "layer_name_regex", - "label": "Layer name regex" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_attributes.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_attributes.json deleted file mode 100644 index a728024376..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_attributes.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "attributes", - "label": "Attributes", - "is_file": true, - "is_group": true, - "children": [ - { - "type": "number", - "key": "fps", - "label": "Frame Rate", - "decimal": 3, - "minimum": 0 - }, - { - "type": "number", - "key": "frameStart", - "label": "Frame Start", - "maximum": 999999999 - }, - { - "type": "number", - "key": "frameEnd", - "label": "Frame End", - "maximum": 999999999 - }, - { - "type": "number", - "key": "clipIn", - "label": "Clip In", - "maximum": 999999999 - }, - { - "type": "number", - "key": "clipOut", - "label": "Clip Out", - "maximum": 999999999 - }, - { - "type": "number", - "key": "handleStart", - "label": "Handle Start" - }, - { - "type": "number", - "key": "handleEnd", - "label": "Handle End" - }, - { - "type": "number", - "key": "resolutionWidth", - "label": "Resolution Width" - }, - { - "type": "number", - "key": "resolutionHeight", - "label": "Resolution Height" - }, - { - "type": "number", - "key": "pixelAspect", - "label": "Pixel Aspect Ratio", - "decimal": 2, - "minimum": 0 - }, - { - "type": "apps-enum", - "key": "applications", - "label": "Applications" - }, - { - "type": "tools-enum", - "key": "tools_env", - "label": "Tools" - }, - { - "type": "boolean", - "key": "active", - "label": "Active Project" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_imageio.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_imageio.json deleted file mode 100644 index 93b6adae6b..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_imageio.json +++ /dev/null @@ -1,497 +0,0 @@ -{ - "type": "dict", - "key": "imageio", - "label": "Color Management and Output Formats (Deprecated)", - "is_file": true, - "is_group": true, - "children": [ - { - "type": "label", - "label": "These settings are deprecated and have moved to: project_settings/{app}/imageio.
You can right click to copy each host's values and paste them to apply to each host as needed.
Changing these values here will not do anything." - }, - { - "key": "hiero", - "type": "dict", - "label": "Hiero", - "children": [ - { - "key": "workfile", - "type": "dict", - "label": "Workfile", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "enum", - "key": "ocioConfigName", - "label": "OpenColorIO Config", - "enum_items": [ - { - "nuke-default": "nuke-default" - }, - { - "aces_1.0.3": "aces_1.0.3" - }, - { - "aces_1.1": "aces_1.1" - }, - { - "custom": "custom" - } - ] - }, - { - "type": "path", - "key": "ocioconfigpath", - "label": "Custom OCIO path", - "multiplatform": true, - "multipath": true - }, - { - "type": "text", - "key": "workingSpace", - "label": "Working Space" - }, - { - "type": "text", - "key": "sixteenBitLut", - "label": "16 Bit Files" - }, - { - "type": "text", - "key": "eightBitLut", - "label": "8 Bit Files" - }, - { - "type": "text", - "key": "floatLut", - "label": "Floating Point Files" - }, - { - "type": "text", - "key": "logLut", - "label": "Log Files" - }, - { - "type": "text", - "key": "viewerLut", - "label": "Viewer" - }, - { - "type": "text", - "key": "thumbnailLut", - "label": "Thumbnails" - } - ] - } - ] - }, - { - "key": "regexInputs", - "type": "dict", - "label": "Colorspace on Inputs by regex detection", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "regex", - "label": "Regex" - }, - { - "type": "text", - "key": "colorspace", - "label": "Colorspace" - } - ] - } - } - ] - } - ] - }, - { - "key": "nuke", - "type": "dict", - "label": "Nuke", - "children": [ - { - "key": "viewer", - "type": "dict", - "label": "Viewer", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "viewerProcess", - "label": "Viewer Process" - } - ] - }, - { - "key": "baking", - "type": "dict", - "label": "Extract-review baking profile", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "viewerProcess", - "label": "Viewer Process" - } - ] - }, - { - "key": "workfile", - "type": "dict", - "label": "Workfile", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "enum", - "key": "colorManagement", - "label": "color management", - "enum_items": [ - { - "Nuke": "Nuke" - }, - { - "OCIO": "OCIO" - } - ] - }, - { - "type": "enum", - "key": "OCIO_config", - "label": "OpenColorIO Config", - "enum_items": [ - { - "nuke-default": "nuke-default" - }, - { - "spi-vfx": "spi-vfx" - }, - { - "spi-anim": "spi-anim" - }, - { - "aces_0.1.1": "aces_0.1.1" - }, - { - "aces_0.7.1": "aces_0.7.1" - }, - { - "aces_1.0.1": "aces_1.0.1" - }, - { - "aces_1.0.3": "aces_1.0.3" - }, - { - "aces_1.1": "aces_1.1" - }, - { - "aces_1.2": "aces_1.2" - }, - { - "custom": "custom" - } - ] - }, - { - "type": "path", - "key": "customOCIOConfigPath", - "label": "Custom OCIO config path", - "multiplatform": true, - "multipath": true - }, - { - "type": "text", - "key": "workingSpaceLUT", - "label": "Working Space" - }, - { - "type": "text", - "key": "monitorLut", - "label": "monitor" - }, - { - "type": "text", - "key": "int8Lut", - "label": "8-bit files" - }, - { - "type": "text", - "key": "int16Lut", - "label": "16-bit files" - }, - { - "type": "text", - "key": "logLut", - "label": "log files" - }, - { - "type": "text", - "key": "floatLut", - "label": "float files" - } - ] - } - ] - }, - { - "key": "nodes", - "type": "dict", - "label": "Nodes", - "collapsible": true, - "children": [ - { - "key": "requiredNodes", - "type": "list", - "label": "Plugin required", - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "key": "plugins", - "label": "Used in plugins", - "object_type": { - "type": "text", - "key": "pluginClass" - } - }, - { - "type": "text", - "key": "nukeNodeClass", - "label": "Nuke Node Class" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Knobs", - "key": "knobs" - } - ] - } - - ] - } - }, - { - "type": "splitter" - }, - { - "type": "list", - "key": "overrideNodes", - "label": "Plugin's node overrides", - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "key": "plugins", - "label": "Used in plugins", - "object_type": { - "type": "text", - "key": "pluginClass" - } - }, - { - "type": "text", - "key": "nukeNodeClass", - "label": "Nuke Node Class" - }, - { - "key": "subsets", - "label": "Subsets", - "type": "list", - "object_type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Knobs overrides", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "key": "regexInputs", - "type": "dict", - "label": "Colorspace on Inputs by regex detection", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "regex", - "label": "Regex" - }, - { - "type": "text", - "key": "colorspace", - "label": "Colorspace" - } - ] - } - } - ] - } - ] - }, - { - "key": "maya", - "type": "dict", - "label": "Maya", - "children": [ - { - "key": "colorManagementPreference_v2", - "type": "dict", - "label": "Color Management Preference v2 (Maya 2022+)", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Use Color Management Preference v2" - }, - { - "type": "path", - "key": "configFilePath", - "label": "OCIO Config File Path", - "multiplatform": true, - "multipath": true - }, - { - "type": "text", - "key": "renderSpace", - "label": "Rendering Space" - }, - { - "type": "text", - "key": "displayName", - "label": "Display" - }, - { - "type": "text", - "key": "viewName", - "label": "View" - } - ] - }, - { - "key": "colorManagementPreference", - "type": "dict", - "label": "Color Management Preference (legacy)", - "collapsible": true, - "children": [ - { - "type": "path", - "key": "configFilePath", - "label": "OCIO Config File Path", - "multiplatform": true, - "multipath": true - }, - { - "type": "text", - "key": "renderSpace", - "label": "Rendering Space" - }, - { - "type": "text", - "key": "viewTransform", - "label": "Viewer Transform" - } - ] - } - ] - }, - { - "key": "flame", - "type": "dict", - "label": "Flame & Flare", - "children": [ - { - "key": "project", - "type": "dict", - "label": "Project", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "text", - "key": "colourPolicy", - "label": "Colour Policy (name or path)" - }, - { - "type": "text", - "key": "frameDepth", - "label": "Image Depth" - }, - { - "type": "text", - "key": "fieldDominance", - "label": "Field Dominance" - } - ] - } - ] - }, - { - "key": "profilesMapping", - "type": "dict", - "label": "Profile names mapping", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "flameName", - "label": "Flame name" - }, - { - "type": "text", - "key": "ocioName", - "label": "OCIO name" - } - ] - } - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_templates.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_templates.json deleted file mode 100644 index 0548824ee1..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_anatomy_templates.json +++ /dev/null @@ -1,179 +0,0 @@ -{ - "type": "dict", - "key": "templates", - "label": "Templates", - "collapsible": true, - "collapsible_key": true, - "is_file": true, - "is_group": true, - "children": [ - { - "type": "dict", - "key": "defaults", - "children": [ - { - "type": "label", - "label": "The list of existing placeholders is available here:
https://openpype.io/docs/admin_settings_project_anatomy/#available-template-keys " - }, - { - "type": "number", - "key": "version_padding", - "label": "Version Padding", - "minimum": 1, - "maximum": 10 - }, - { - "type": "text", - "key": "version", - "label": "Version" - }, - { - "type": "number", - "key": "frame_padding", - "label": "Frame Padding", - "minimum": 1, - "maximum": 10 - }, - { - "type": "text", - "key": "frame", - "label": "Frame" - } - ] - }, - { - "type": "separator" - }, - { - "type": "dict", - "key": "work", - "label": "Work", - "children": [ - { - "type": "text", - "key": "folder", - "label": "Folder" - }, - { - "type": "text", - "key": "file", - "label": "File" - }, - { - "type": "text", - "key": "path", - "label": "Path" - } - ] - }, - { - "type": "dict", - "key": "render", - "label": "Render", - "children": [ - { - "type": "text", - "key": "folder", - "label": "Folder" - }, - { - "type": "text", - "key": "file", - "label": "File" - }, - { - "type": "text", - "key": "path", - "label": "Path" - } - ] - }, - { - "type": "dict", - "key": "publish", - "label": "Publish", - "children": [ - { - "type": "text", - "key": "folder", - "label": "Folder" - }, - { - "type": "text", - "key": "file", - "label": "File" - }, - { - "type": "text", - "key": "path", - "label": "Path" - }, - { - "type": "text", - "key": "thumbnail", - "label": "Thumbnail" - } - ] - }, - { - "type": "dict", - "key": "hero", - "label": "Hero", - "children": [ - { - "type": "text", - "key": "folder", - "label": "Folder" - }, - { - "type": "text", - "key": "file", - "label": "File" - }, - { - "type": "text", - "key": "path", - "label": "Path" - } - ] - }, - { - "type": "dict-modifiable", - "key": "delivery", - "label": "Delivery", - "object_type": "text" - }, - { - "type": "dict", - "key": "unreal", - "label": "Unreal", - "children": [ - { - "type": "text", - "key": "folder", - "label": "Folder" - }, - { - "type": "text", - "key": "file", - "label": "File" - }, - { - "type": "text", - "key": "path", - "label": "Path" - } - ] - }, - { - "type": "dict-modifiable", - "key": "others", - "label": "Others", - "collapsible_key": true, - "object_type": { - "type": "dict-modifiable", - "object_type": "text" - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_blender_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_blender_publish.json deleted file mode 100644 index e4f1096223..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_blender_publish.json +++ /dev/null @@ -1,290 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Validators" - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateCameraZeroKeyframe", - "label": "Validate Camera Zero Keyframe" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateFileSaved", - "label": "Validate File Saved", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "splitter" - }, - { - "key": "exclude_families", - "label": "Exclude Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Model", - "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateMeshHasUvs", - "label": "Validate Mesh Has UVs" - }, - { - "key": "ValidateMeshNoNegativeScale", - "label": "Validate Mesh No Negative Scale" - }, - { - "key": "ValidateTransformZero", - "label": "Validate Transform Zero" - }, - { - "key": "ValidateNoColonsInName", - "label": "Validate No Colons In Name" - } - ] - } - ] - }, - { - "type": "collapsible-wrap", - "label": "BlendScene", - "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateInstanceEmpty", - "label": "Validate Instance is not Empty" - } - ] - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Render", - "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "type": "dict", - "collapsible": true, - "key": "ValidateRenderCameraIsSet", - "label": "Validate Render Camera Is Set", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateDeadlinePublish", - "label": "Validate Render Output for Deadline", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - } - ] - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Extractors" - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractBlend", - "label": "Extract Blend", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ExtractModelABC", - "label": "Extract ABC (model)" - }, - { - "key": "ExtractFBX", - "label": "Extract FBX (model and rig)" - }, - { - "key": "ExtractBlendAnimation", - "label": "Extract Animation as Blend" - }, - { - "key": "ExtractAnimationFBX", - "label": "Extract Animation as FBX" - }, - { - "key": "ExtractCamera", - "label": "Extract Camera as FBX" - }, - { - "key": "ExtractCameraABC", - "label": "Extract Camera as ABC" - }, - { - "key": "ExtractLayout", - "label": "Extract Layout as JSON" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractThumbnail", - "label": "ExtractThumbnail", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "raw-json", - "key": "presets", - "label": "Presets" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractPlayblast", - "label": "ExtractPlayblast", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "raw-json", - "key": "presets", - "label": "Presets" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_publish.json deleted file mode 100644 index 64f292a140..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_publish.json +++ /dev/null @@ -1,1068 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CollectAnatomyInstanceData", - "label": "Collect Anatomy Instance Data", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "follow_workfile_version", - "label": "Follow workfile version" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectAudio", - "label": "Collect Audio", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "audio_subset_name", - "label": "Name of audio variant", - "type": "text", - "placeholder": "audioMain" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectSceneVersion", - "label": "Collect Version from Workfile", - "is_group": true, - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "skip_hosts_headless_publish", - "label": "Skip for host if headless publish", - "type": "hosts-enum", - "multiselection": true - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "collect_comment_per_instance", - "label": "Collect comment per instance", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectFramesFixDef", - "label": "Collect Frames to Fix", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "rewrite_version_enable", - "label": "Show 'Rewrite latest version' toggle" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateEditorialAssetName", - "label": "Validate Editorial Asset Name", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateVersion", - "label": "Validate Version" - } - ] - }, - { - "type": "dict", - "label": "Validate Intent", - "key": "ValidateIntent", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Validate if Publishing intent was selected. It is possible to disable validation for specific publishing context with profiles." - }, - { - "type": "list", - "collapsible": true, - "key": "profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "validate", - "label": "Validate", - "type": "boolean" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractThumbnail", - "label": "ExtractThumbnail", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "integrate_thumbnail", - "label": "Integrate thumbnail as representation" - }, - { - "type": "dict-conditional", - "use_label_wrap": false, - "collapsible": false, - "key": "target_size", - "label": "Target size", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "source", - "label": "Image source", - "children": [ - { - "type": "label", - "label": "Image size will be inherited from source image." - } - ] - }, - { - "key": "resize", - "label": "Resize", - "children": [ - { - "type": "label", - "label": "Image will be resized to specified size." - }, - { - "type": "number", - "key": "width", - "label": "Width", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - }, - { - "type": "number", - "key": "height", - "label": "Height", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - } - ] - } - ] - }, - { - "type": "color", - "label": "Background color", - "key": "background_color" - }, - { - "key": "duration_split", - "label": "Duration split ratio", - "type": "number", - "decimal": 1, - "default": 0.5, - "minimum": 0, - "maximum": 1 - }, - { - "type": "dict", - "collapsible": true, - "key": "oiiotool_defaults", - "label": "OIIOtool defaults", - "children": [ - { - "type": "enum", - "key": "type", - "label": "Target type", - "enum_items": [ - { "colorspace": "Colorspace" }, - { "display_and_view": "Display & View" } - ] - }, - { - "type": "text", - "key": "colorspace", - "label": "Colorspace" - }, - { - "type": "text", - "key": "view", - "label": "View" - }, - { - "type": "text", - "key": "display", - "label": "Display" - } - ] - }, - { - "type": "dict", - "key": "ffmpeg_args", - "children": [ - { - "type": "list", - "object_type": "text", - "key": "input", - "label": "FFmpeg input arguments" - }, - { - "type": "list", - "object_type": "text", - "key": "output", - "label": "FFmpeg output arguments" - } - ] - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractOIIOTranscode", - "label": "Extract OIIO Transcode", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "label", - "label": "Configure Output Definition(s) for new representation(s). \nEmpty 'Extension' denotes keeping source extension. \nName(key) of output definition will be used as new representation name \nunless 'passthrough' value is used to keep existing name. \nFill either 'Colorspace' (for target colorspace) or \nboth 'Display' and 'View' (for display and viewer colorspaces)." - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "boolean", - "key": "delete_original", - "label": "Delete Original Representation" - }, - { - "type": "splitter" - }, - { - "key": "outputs", - "label": "Output Definitions", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "extension", - "label": "Extension", - "type": "text" - }, - { - "type": "enum", - "key": "transcoding_type", - "label": "Transcoding type", - "enum_items": [ - { "colorspace": "Use Colorspace" }, - { "display": "Use Display&View" } - ] - }, - { - "key": "colorspace", - "label": "Colorspace", - "type": "text" - }, - { - "key": "display", - "label": "Display", - "type": "text" - }, - { - "key": "view", - "label": "View", - "type": "text" - }, - { - "key": "oiiotool_args", - "label": "OIIOtool arguments", - "type": "dict", - "highlight_content": true, - "children": [ - { - "key": "additional_command_args", - "label": "Arguments", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "schema", - "name": "schema_representation_tags" - }, - { - "key": "custom_tags", - "label": "Custom Tags", - "type": "list", - "object_type": "text" - } - ] - } - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractReview", - "label": "ExtractReview", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "type": "splitter" - }, - { - "key": "outputs", - "label": "Output Definitions", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "ext", - "label": "Output extension", - "type": "text" - }, - { - "type": "schema", - "name": "schema_representation_tags" - }, - { - "key": "burnins", - "label": "Link to a burnin by name", - "type": "list", - "object_type": "text" - }, - { - "key": "ffmpeg_args", - "label": "FFmpeg arguments", - "type": "dict", - "highlight_content": true, - "children": [ - { - "key": "video_filters", - "label": "Video filters", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "audio_filters", - "label": "Audio filters", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "input", - "label": "Input arguments", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "output", - "label": "Output arguments", - "type": "list", - "object_type": "text" - } - ] - }, - { - "key": "filter", - "label": "Additional output filtering", - "type": "dict", - "highlight_content": true, - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "subsets", - "label": "Subsets", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "custom_tags", - "label": "Custom Tags", - "type": "list", - "object_type": "text" - }, - { - "type": "label", - "label": "Use output always / only if input is 1 frame image / only if has 2+ frames or is video" - }, - { - "type": "enum", - "key": "single_frame_filter", - "default": "everytime", - "enum_items": [ - {"everytime": "Always"}, - {"single_frame": "Only if input has 1 image frame"}, - {"multi_frame": "Only if input is video or sequence of frames"} - ] - } - ] - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Crop input overscan. See the documentation for more information." - }, - { - "type": "text", - "key": "overscan_crop", - "label": "Overscan crop" - }, - { - "type": "label", - "label": "Overscan color is used when input aspect ratio is not same as output aspect ratio." - }, - { - "type": "color", - "label": "Overscan color", - "key": "overscan_color", - "use_alpha": false - }, - { - "type": "label", - "label": "Width and Height must be both set to higher value than 0 else source resolution is used." - }, - { - "key": "width", - "label": "Output width", - "type": "number", - "default": 0, - "minimum": 0, - "maximum": 100000 - }, - { - "key": "height", - "label": "Output height", - "type": "number", - "default": 0, - "minimum": 0, - "maximum": 100000 - }, - { - "type": "label", - "label": "Rescale input when it's pixel aspect ratio is not 1. Usefull for anamorph reviews." - }, - { - "key": "scale_pixel_aspect", - "label": "Scale pixel aspect", - "type": "boolean" - }, - { - "type": "label", - "label": "Background color is used only when input have transparency and Alpha is higher than 0." - }, - { - "type": "color", - "label": "Background color", - "key": "bg_color" - }, - { - "key": "letter_box", - "label": "Letter box", - "type": "dict", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": false - }, - { - "key": "ratio", - "label": "Ratio", - "type": "number", - "decimal": 4, - "default": 0, - "minimum": 0, - "maximum": 10000 - }, - { - "type": "color", - "label": "Fill Color", - "key": "fill_color" - }, - { - "key": "line_thickness", - "label": "Line Thickness", - "type": "number", - "minimum": 0, - "maximum": 1000 - }, - { - "type": "color", - "label": "Line Color", - "key": "line_color" - } - ] - } - ] - } - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractBurnin", - "label": "ExtractBurnin", - "checkbox_key": "enabled", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict", - "collapsible": true, - "key": "options", - "label": "Burnin formatting options", - "children": [ - { - "type": "number", - "key": "font_size", - "label": "Font size", - "minimum": 0 - }, - { - "type": "color", - "key": "font_color", - "label": "Font Color" - }, - { - "type": "color", - "key": "bg_color", - "label": "Background Color" - }, - { - "type": "number", - "key": "x_offset", - "label": "X Offset" - }, - { - "type": "number", - "key": "y_offset", - "label": "Y Offset" - }, - { - "type": "number", - "key": "bg_padding", - "label": "Padding aroung text" - }, - { - "type": "path", - "key": "font_filepath", - "label": "Font file path", - "multipath": false, - "multiplatform": true - } - ] - }, - { - "type": "separator" - }, - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "burnins", - "label": "Burnins", - "type": "dict-modifiable", - "highlight_content": true, - "collapsible": false, - "object_type": { - "type": "dict", - "children": [ - { - "key": "TOP_LEFT", - "label": "Top Left", - "type": "text" - }, - { - "key": "TOP_CENTERED", - "label": "Top Centered", - "type": "text" - }, - { - "key": "TOP_RIGHT", - "label": "top Right", - "type": "text" - }, - { - "key": "BOTTOM_LEFT", - "label": "Bottom Left", - "type": "text" - }, - { - "key": "BOTTOM_CENTERED", - "label": "Bottom Centered", - "type": "text" - }, - { - "key": "BOTTOM_RIGHT", - "label": "BottomRight", - "type": "text" - }, - { - "key": "filter", - "label": "Additional filtering", - "type": "dict", - "highlight_content": true, - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "schema", - "name": "schema_representation_tags" - } - ] - } - ] - } - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "PreIntegrateThumbnails", - "label": "Override Integrate Thumbnail Representations", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Explicitly set if Thumbnail representation should be integrated into DB.
If no matching profile set, existing state from Host implementation is kept." - }, - { - "type": "list", - "key": "integrate_profiles", - "label": "Integrate profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "integrate_thumbnail", - "label": "Integrate thumbnail" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "IntegrateSubsetGroup", - "label": "Integrate Subset Group", - "is_group": true, - "children": [ - { - "type": "list", - "key": "subset_grouping_profiles", - "label": "Subset grouping profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "label", - "label": "Set all published instances as a part of specific group named according to 'Template'.
Implemented all variants of placeholders [{task},{family},{host},{subset},{renderlayer}]" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "template", - "label": "Template" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "IntegrateHeroVersion", - "label": "IntegrateHeroVersion", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "label", - "label": "NOTE: Hero publish template profiles settings were moved to Tools/Publish/Hero template name profiles. Please move values there." - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CleanUp", - "label": "Clean Up", - "is_group": true, - "children": [ - { - "type": "list", - "key": "paterns", - "label": "Paterrns (regex)", - "object_type": { - "type": "text" - } - }, - { - "type": "boolean", - "key": "remove_temp_renders", - "label": "Remove Temp renders", - "default": false - } - ] - }, - { - "type": "dict", - "collapsible": false, - "key": "CleanUpFarm", - "label": "Clean Up Farm", - "is_group": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json deleted file mode 100644 index 23fc7c9351..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ /dev/null @@ -1,476 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "tools", - "label": "Tools", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "creator", - "label": "Creator", - "children": [ - { - "type": "dict-modifiable", - "collapsible": true, - "key": "families_smart_select", - "label": "Families smart select", - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "list", - "key": "subset_name_profiles", - "label": "Subset name profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "template", - "label": "Template" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "Workfiles", - "label": "Workfiles", - "children": [ - { - "type": "list", - "key": "workfile_template_profiles", - "label": "Workfile template profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "type": "splitter" - }, - { - "key": "workfile_template", - "label": "Workfile template", - "type": "anatomy-templates-enum", - "multiselection": false - } - ] - } - }, - { - "type": "list", - "key": "last_workfile_on_startup", - "label": "Open last workfiles on launch", - "is_group": true, - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true, - "hosts_filter": [ - "aftereffects", - "blender", - "celaction", - "fusion", - "harmony", - "hiero", - "houdini", - "maya", - "nuke", - "photoshop", - "resolve", - "tvpaint", - "unreal" - ] - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "use_last_published_workfile", - "label": "Use last published workfile" - } - ] - } - }, - { - "type": "list", - "key": "open_workfile_tool_on_startup", - "label": "Open workfile tool on launch", - "is_group": true, - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true, - "hosts_filter": [ - "nuke" - ] - }, - { - "key": "task_types", - "label": "Task types", - "type": "list", - "object_type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - }, - { - "type": "list", - "key": "extra_folders", - "label": "Extra work folders", - "collapsible": true, - "use_label_wrap": true, - "is_group": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "type": "task-types-enum", - "key": "task_types", - "label": "Task types" - }, - { - "label": "Task names", - "key": "task_names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Folders will be created in directory next to workfile. Items may contain nested directories (e.g. resources/images)." - }, - { - "key": "folders", - "label": "Folders", - "type": "list", - "highlight_content": true, - "collapsible": false, - "object_type": "text" - } - ] - } - }, - { - "type": "list", - "key": "workfile_lock_profiles", - "label": "Workfile lock profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "hosts-enum", - "key": "host_name", - "label": "Hosts", - "multiselection": true - }, - { - "type": "splitter" - }, - { - "key": "enabled", - "label": "Enabled", - "type": "boolean" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "loader", - "label": "Loader", - "children": [ - { - "type": "list", - "key": "family_filter_profiles", - "label": "Family filtering", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "type": "task-types-enum", - "key": "task_types", - "label": "Task types" - }, - { - "type": "boolean", - "key": "is_include", - "label": "Exclude / Include" - }, - { - "type": "template", - "name": "template_publish_families", - "template_data": { - "key": "filter_families", - "label": "Filter families", - "multiselection": true - } - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "publish", - "label": "Publish", - "children": [ - { - "type": "list", - "key": "template_name_profiles", - "label": "Template name profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "template_name", - "label": "Template name" - } - ] - } - }, - { - "type": "list", - "key": "hero_template_name_profiles", - "label": "Hero template name profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "type": "hosts-enum", - "key": "hosts", - "label": "Hosts", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "template_name", - "label": "Template name", - "tooltip": "Name of template from Anatomy templates" - } - ] - } - }, - { - "type": "list", - "key": "custom_staging_dir_profiles", - "label": "Custom Staging Dir Profiles", - "use_label_wrap": true, - "docstring": "Profiles to specify special location and persistence for staging dir. Could be used in Creators and Publish phase!", - "object_type": { - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "active", - "label": "Is active", - "default": true - }, - { - "type": "separator" - }, - { - "key": "hosts", - "label": "Host names", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "separator" - }, - { - "key": "custom_staging_dir_persistent", - "label": "Custom Staging Folder Persistent", - "type": "boolean", - "default": false - }, - { - "key": "template_name", - "label": "Template Name", - "type": "text", - "placeholder": "transient" - } - ] - } - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json deleted file mode 100644 index 213ec9d04e..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_create.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "schema_template", - "name": "template_create_plugin", - "template_data": [ - { - "key": "CreateAlembicCamera", - "label": "Create Alembic Camera" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateArnoldAss", - "label": "Create Arnold Ass", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "enum", - "key": "ext", - "label": "Default Output Format (extension)", - "multiselection": false, - "enum_items": [ - { - ".ass": ".ass" - }, - { - ".ass.gz": ".ass.gz (gzipped)" - } - ] - } - ] - - }, - { - "type": "schema_template", - "name": "template_create_plugin", - "template_data": [ - { - "key": "CreateArnoldRop", - "label": "Create Arnold ROP" - }, - { - "key": "CreateCompositeSequence", - "label": "Create Composite (Image Sequence)" - }, - { - "key": "CreateHDA", - "label": "Create Houdini Digital Asset" - }, - { - "key": "CreateKarmaROP", - "label": "Create Karma ROP" - }, - { - "key": "CreateMantraIFD", - "label": "Create Mantra IFD" - }, - { - "key": "CreateMantraROP", - "label": "Create Mantra ROP" - }, - { - "key": "CreatePointCache", - "label": "Create PointCache (Abc)" - }, - { - "key": "CreateBGEO", - "label": "Create PointCache (Bgeo)" - }, - { - "key": "CreateRedshiftProxy", - "label": "Create Redshift Proxy" - }, - { - "key": "CreateRedshiftROP", - "label": "Create Redshift ROP" - }, - { - "key": "CreateReview", - "label": "Create Review" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateStaticMesh", - "label": "Create Static Mesh", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "text", - "key": "static_mesh_prefix", - "label": "Static Mesh Prefix" - }, - { - "type": "list", - "key": "collision_prefixes", - "label": "Collision Mesh Prefixes", - "object_type": "text" - } - ] - }, - { - "type": "schema_template", - "name": "template_create_plugin", - "template_data": [ - { - "key": "CreateUSD", - "label": "Create USD (experimental)" - }, - { - "key": "CreateUSDRender", - "label": "Create USD render (experimental)" - }, - { - "key": "CreateVDBCache", - "label": "Create VDB Cache" - }, - { - "key": "CreateVrayROP", - "label": "Create VRay ROP" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_general.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_general.json deleted file mode 100644 index e118f83d21..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_general.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "type": "dict", - "key": "general", - "label": "General", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "add_self_publish_button", - "label": "Add Self Publish Button" - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "update_houdini_var_context", - "label": "Update Houdini Vars on context change", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Sync vars with context changes.
If a value is treated as a directory on update it will be ensured the folder exists" - }, - { - "type": "list", - "key": "houdini_vars", - "label": "Houdini Vars", - "collapsible": false, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "var", - "label": "Var" - }, - { - "type": "text", - "key": "value", - "label": "Value" - }, - { - "type": "boolean", - "key": "is_directory", - "label": "Treat as directory" - } - ] - } - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json deleted file mode 100644 index aaaf4311b7..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_publish.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type":"label", - "label":"Collectors" - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectAssetHandles", - "label": "Collect Asset Handles", - "children": [ - { - "type": "label", - "label": "Disable this if you want the publisher to ignore start and end handles specified in the asset data for publish instances" - }, - { - "type": "boolean", - "key": "use_asset_handles", - "label": "Use asset handles" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "CollectChunkSize", - "label": "Collect Chunk Size", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "number", - "key": "chunk_size", - "label": "Frames Per Task" - } - ] - }, - { - "type": "label", - "label": "Validators" - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateContainers", - "label": "Validate Containers" - }, - { - "key": "ValidateMeshIsStatic", - "label": "Validate Mesh is Static" - }, - { - "key": "ValidateReviewColorspace", - "label": "Validate Review Colorspace" - }, - { - "key": "ValidateSubsetName", - "label": "Validate Subset Name" - }, - { - "key": "ValidateUnrealStaticMeshName", - "label": "Validate Unreal Static Mesh Name" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateWorkfilePaths", - "label": "Validate Workfile Paths", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "key": "node_types", - "label": "Node types", - "type": "list", - "object_type": "text" - }, - { - "key": "prohibited_vars", - "label": "Prohibited variables", - "type": "list", - "object_type": "text" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_scriptshelf.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_scriptshelf.json deleted file mode 100644 index cee04b73e5..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_houdini_scriptshelf.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "type": "list", - "key": "shelves", - "label": "Shelves Manager", - "is_group": true, - "use_label_wrap": true, - "object_type": { - "type": "dict-conditional", - "enum_key": "options", - "enum_label": "Options", - "enum_children": [ - { - - "key": "add_shelf_file", - "label": "Add a .shelf file", - "children": [ - { - "type": "dict", - "key": "add_shelf_file", - "label": "Add a .shelf file", - "children": [ - { - "type": "path", - "key": "shelf_set_source_path", - "label": "Shelf Set Path", - "multipath": false, - "multiplatform": true - } - ] - } - ] - }, - { - "key": "add_set_and_definitions", - "label": "Add Shelf Set Name and Shelves Definitions", - "children": [ - { - "key": "add_set_and_definitions", - "label": "Add Shelf Set Name and Shelves Definitions", - "type": "dict", - "children": [ - { - "type": "text", - "key": "shelf_set_name", - "label": "Shelf Set Name" - }, - { - "type": "list", - "key": "shelf_definition", - "label": "Shelves Definitions", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "shelf_name", - "label": "Shelf Name" - }, - { - "type": "list", - "key": "tools_list", - "label": "Tools", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "label", - "label": "Name and Script Path are mandatory." - }, - { - "type": "text", - "key": "label", - "label": "Name" - }, - { - "type": "path", - "key": "script", - "label": "Script" - }, - { - "type": "path", - "key": "icon", - "label": "Icon" - }, - { - "type": "text", - "key": "help", - "label": "Help" - } - ] - } - } - ] - } - } - ] - } - ] - } - ] - } -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json deleted file mode 100644 index b4d85bda98..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_max_publish.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateFrameRange", - "label": "Validate Frame Range", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateAttributes", - "label": "ValidateAttributes", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "raw-json", - "key": "attributes", - "label": "Attributes" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateLoadedPlugin", - "label": "Validate Loaded Plugin", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "list", - "collapsible": true, - "key": "family_plugins_mapping", - "label": "Family Plugins Mapping", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Famiies", - "type": "list", - "object_type": "text" - }, - { - "key": "plugins", - "label": "Plugins", - "type": "list", - "object_type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractModelObj", - "label": "Extract Obj", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractModelFbx", - "label": "Extract FBX", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractModelUSD", - "label": "Extract Geometry (USD)", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractModel", - "label": "Extract Geometry (Alembic)", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractMaxSceneRaw", - "label": "Extract Max Scene (Raw)", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - } - ] - } diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_capture.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_capture.json deleted file mode 100644 index 76ad9a3ba2..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_capture.json +++ /dev/null @@ -1,1385 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "ExtractPlayblast", - "label": "Extract Playblast settings", - "children": [ - { - "type": "dict", - "key": "capture_preset", - "label": "DEPRECATED! Please use \"Profiles\" below.", - "collapsed": false, - "children": [ - { - "type": "dict", - "key": "Codec", - "children": [ - { - "type": "label", - "label": "Codec" - }, - { - "type": "text", - "key": "compression", - "label": "Encoding" - }, - { - "type": "text", - "key": "format", - "label": "Format" - }, - { - "type": "number", - "key": "quality", - "label": "Quality", - "decimal": 0, - "minimum": 0, - "maximum": 100 - }, - - { - "type": "splitter" - } - ] - }, - { - "type": "dict", - "key": "Display Options", - "children": [ - { - "type": "label", - "label": "Display Options" - }, - { - "type": "boolean", - "key": "override_display", - "label": "Override display options" - }, - { - "type": "color", - "key": "background", - "label": "Background Color: " - }, - { - "type": "color", - "key": "backgroundBottom", - "label": "Background Bottom: " - }, - { - "type": "color", - "key": "backgroundTop", - "label": "Background Top: " - }, - { - "type": "boolean", - "key": "displayGradient", - "label": "Display background gradient" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "key": "Generic", - "children": [ - { - "type": "label", - "label": "Generic" - }, - { - "type": "boolean", - "key": "isolate_view", - "label": " Isolate view" - }, - { - "type": "boolean", - "key": "off_screen", - "label": " Off Screen" - }, - { - "type": "boolean", - "key": "pan_zoom", - "label": " 2D Pan/Zoom" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "key": "Renderer", - "children": [ - { - "type": "label", - "label": "Renderer" - }, - { - "type": "enum", - "key": "rendererName", - "label": "Renderer name", - "enum_items": [ - { "vp2Renderer": "Viewport 2.0" } - ] - } - ] - }, - { - "type": "dict", - "key": "Resolution", - "children": [ - { - "type": "splitter" - }, - { - "type": "label", - "label": "Resolution" - }, - { - "type": "number", - "key": "width", - "label": " Width", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - }, - { - "type": "number", - "key": "height", - "label": "Height", - "decimal": 0, - "minimum": 0, - "maximum": 99999 - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "collapsible": true, - "key": "Viewport Options", - "label": "Viewport Options", - "children": [ - { - "type": "boolean", - "key": "override_viewport_options", - "label": "Override Viewport Options" - }, - { - "type": "enum", - "key": "displayLights", - "label": "Display Lights", - "enum_items": [ - { "default": "Default Lighting"}, - { "all": "All Lights"}, - { "selected": "Selected Lights"}, - { "flat": "Flat Lighting"}, - { "none": "No Lights"} - ] - }, - { - "type": "boolean", - "key": "displayTextures", - "label": "Display Textures" - }, - { - "type": "number", - "key": "textureMaxResolution", - "label": "Texture Clamp Resolution", - "decimal": 0 - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Display" - }, - { - "type":"boolean", - "key": "renderDepthOfField", - "label": "Depth of Field" - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "shadows", - "label": "Display Shadows" - }, - { - "type": "boolean", - "key": "twoSidedLighting", - "label": "Two Sided Lighting" - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "lineAAEnable", - "label": "Enable Anti-Aliasing" - }, - { - "type": "number", - "key": "multiSample", - "label": "Anti Aliasing Samples", - "decimal": 0, - "minimum": 0, - "maximum": 32 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "loadTextures", - "label": "Load Textures" - }, - { - "type": "boolean", - "key": "useDefaultMaterial", - "label": "Use Default Material" - }, - { - "type": "boolean", - "key": "wireframeOnShaded", - "label": "Wireframe On Shaded" - }, - { - "type": "boolean", - "key": "xray", - "label": "X-Ray" - }, - { - "type": "boolean", - "key": "jointXray", - "label": "X-Ray Joints" - }, - { - "type": "boolean", - "key": "backfaceCulling", - "label": "Backface Culling" - }, - { - "type": "boolean", - "key": "ssaoEnable", - "label": "Screen Space Ambient Occlusion" - }, - { - "type": "number", - "key": "ssaoAmount", - "label": "SSAO Amount" - }, - { - "type": "number", - "key": "ssaoRadius", - "label": "SSAO Radius" - }, - { - "type": "number", - "key": "ssaoFilterRadius", - "label": "SSAO Filter Radius", - "decimal": 0, - "minimum": 1, - "maximum": 32 - }, - { - "type": "number", - "key": "ssaoSamples", - "label": "SSAO Samples", - "decimal": 0, - "minimum": 8, - "maximum": 32 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "fogging", - "label": "Enable Hardware Fog" - }, - { - "type": "enum", - "key": "hwFogFalloff", - "label": "Hardware Falloff", - "enum_items": [ - { "0": "Linear"}, - { "1": "Exponential"}, - { "2": "Exponential Squared"} - ] - }, - { - "type": "number", - "key": "hwFogDensity", - "label": "Fog Density", - "decimal": 2, - "minimum": 0, - "maximum": 1 - }, - { - "type": "number", - "key": "hwFogStart", - "label": "Fog Start" - }, - { - "type": "number", - "key": "hwFogEnd", - "label": "Fog End" - }, - { - "type": "number", - "key": "hwFogAlpha", - "label": "Fog Alpha" - }, - { - "type": "number", - "key": "hwFogColorR", - "label": "Fog Color R", - "decimal": 2, - "minimum": 0, - "maximum": 1 - }, - { - "type": "number", - "key": "hwFogColorG", - "label": "Fog Color G", - "decimal": 2, - "minimum": 0, - "maximum": 1 - }, - { - "type": "number", - "key": "hwFogColorB", - "label": "Fog Color B", - "decimal": 2, - "minimum": 0, - "maximum": 1 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "motionBlurEnable", - "label": "Enable Motion Blur" - }, - { - "type": "number", - "key": "motionBlurSampleCount", - "label": "Motion Blur Sample Count", - "decimal": 0, - "minimum": 8, - "maximum": 32 - }, - { - "type": "number", - "key": "motionBlurShutterOpenFraction", - "label": "Shutter Open Fraction", - "decimal": 3, - "minimum": 0.01, - "maximum": 32 - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Show" - }, - { - "type": "boolean", - "key": "cameras", - "label": "Cameras" - }, - { - "type": "boolean", - "key": "clipGhosts", - "label": "Clip Ghosts" - }, - { - "type": "boolean", - "key": "deformers", - "label": "Deformers" - }, - { - "type": "boolean", - "key": "dimensions", - "label": "Dimensions" - }, - { - "type": "boolean", - "key": "dynamicConstraints", - "label": "Dynamic Constraints" - }, - { - "type": "boolean", - "key": "dynamics", - "label": "Dynamics" - }, - { - "type": "boolean", - "key": "fluids", - "label": "Fluids" - }, - { - "type": "boolean", - "key": "follicles", - "label": "Follicles" - }, - { - "type": "boolean", - "key": "greasePencils", - "label": "Grease Pencil" - }, - { - "type": "boolean", - "key": "grid", - "label": "Grid" - }, - { - "type": "boolean", - "key": "hairSystems", - "label": "Hair Systems" - }, - { - "type": "boolean", - "key": "handles", - "label": "Handles" - }, - { - "type": "boolean", - "key": "headsUpDisplay", - "label": "HUD" - }, - { - "type": "boolean", - "key": "ikHandles", - "label": "IK Handles" - }, - { - "type": "boolean", - "key": "imagePlane", - "label": "Image Planes" - }, - { - "type": "boolean", - "key": "joints", - "label": "Joints" - }, - { - "type": "boolean", - "key": "lights", - "label": "Lights" - }, - { - "type": "boolean", - "key": "locators", - "label": "Locators" - }, - { - "type": "boolean", - "key": "manipulators", - "label": "Manipulators" - }, - { - "type": "boolean", - "key": "motionTrails", - "label": "Motion Trails" - }, - { - "type": "boolean", - "key": "nCloths", - "label": "nCloths" - }, - { - "type": "boolean", - "key": "nParticles", - "label": "nParticles" - }, - { - "type": "boolean", - "key": "nRigids", - "label": "nRigids" - }, - { - "type": "boolean", - "key": "controlVertices", - "label": "NURBS CVs" - }, - { - "type": "boolean", - "key": "nurbsCurves", - "label": "NURBS Curves" - }, - { - "type": "boolean", - "key": "hulls", - "label": "NURBS Hulls" - }, - { - "type": "boolean", - "key": "nurbsSurfaces", - "label": "NURBS Surfaces" - }, - { - "type": "boolean", - "key": "particleInstancers", - "label": "Particle Instancers" - }, - { - "type": "boolean", - "key": "pivots", - "label": "Pivots" - }, - { - "type": "boolean", - "key": "planes", - "label": "Planes" - }, - { - "type": "boolean", - "key": "pluginShapes", - "label": "Plugin Shapes" - }, - { - "type": "boolean", - "key": "polymeshes", - "label": "Polygons" - }, - { - "type": "boolean", - "key": "strokes", - "label": "Strokes" - }, - { - "type": "boolean", - "key": "subdivSurfaces", - "label": "Subdiv Surfaces" - }, - { - "type": "boolean", - "key": "textures", - "label": "Texture Placements" - }, - { - "type": "dict-modifiable", - "key": "pluginObjects", - "label": "Plugin Objects", - "object_type": "boolean" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "Camera Options", - "label": "Camera Options", - "children": [ - { - "type": "boolean", - "key": "displayGateMask", - "label": "Display Gate Mask" - }, - { - "type": "boolean", - "key": "displayResolution", - "label": "Display Resolution" - }, - { - "type": "boolean", - "key": "displayFilmGate", - "label": "Display Film Gate" - }, - { - "type": "boolean", - "key": "displayFieldChart", - "label": "Display Field Chart" - }, - { - "type": "boolean", - "key": "displaySafeAction", - "label": "Display Safe Action" - }, - { - "type": "boolean", - "key": "displaySafeTitle", - "label": "Display Safe Title" - }, - { - "type": "boolean", - "key": "displayFilmPivot", - "label": "Display Film Pivot" - }, - { - "type": "boolean", - "key": "displayFilmOrigin", - "label": "Display Film Origin" - }, - { - "type": "number", - "key": "overscan", - "label": "Overscan", - "decimal": 1, - "minimum": 0, - "maximum": 10 - } - ] - } - ] - }, - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subset names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "dict", - "key": "capture_preset", - "children": [ - { - "type": "dict", - "key": "Codec", - "children": [ - { - "type": "label", - "label": "Codec" - }, - { - "type": "text", - "key": "compression", - "label": "Encoding", - "default": "png" - }, - { - "type": "text", - "key": "format", - "label": "Format", - "default": "image" - }, - { - "type": "number", - "key": "quality", - "label": "Quality", - "decimal": 0, - "minimum": 0, - "maximum": 100, - "default": 95 - }, - { - "type": "splitter" - } - ] - }, - { - "type": "dict", - "key": "Display Options", - "children": [ - { - "type": "label", - "label": "Display Options" - }, - { - "type": "boolean", - "key": "override_display", - "label": "Override display options", - "default": true - }, - { - "type": "color", - "key": "background", - "label": "Background Color: ", - "default": [125, 125, 125, 255] - }, - { - "type": "boolean", - "key": "displayGradient", - "label": "Display background gradient", - "default": true - }, - { - "type": "color", - "key": "backgroundBottom", - "label": "Background Bottom: ", - "default": [125, 125, 125, 255] - }, - { - "type": "color", - "key": "backgroundTop", - "label": "Background Top: ", - "default": [125, 125, 125, 255] - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "key": "Generic", - "children": [ - { - "type": "label", - "label": "Generic" - }, - { - "type": "boolean", - "key": "isolate_view", - "label": " Isolate view", - "default": true - }, - { - "type": "boolean", - "key": "off_screen", - "label": " Off Screen", - "default": true - }, - { - "type": "boolean", - "key": "pan_zoom", - "label": " 2D Pan/Zoom", - "default": false - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "key": "Renderer", - "children": [ - { - "type": "label", - "label": "Renderer" - }, - { - "type": "enum", - "key": "rendererName", - "label": "Renderer name", - "enum_items": [ - { "vp2Renderer": "Viewport 2.0" } - ], - "default": "vp2Renderer" - } - ] - }, - { - "type": "dict", - "key": "Resolution", - "children": [ - { - "type": "splitter" - }, - { - "type": "label", - "label": "Resolution" - }, - { - "type": "number", - "key": "width", - "label": " Width", - "decimal": 0, - "minimum": 0, - "maximum": 99999, - "default": 0 - }, - { - "type": "number", - "key": "height", - "label": "Height", - "decimal": 0, - "minimum": 0, - "maximum": 99999, - "default": 0 - } - ] - }, - { - "type": "splitter" - }, - { - "type": "dict", - "collapsible": true, - "key": "Viewport Options", - "label": "Viewport Options", - "children": [ - { - "type": "boolean", - "key": "override_viewport_options", - "label": "Override Viewport Options", - "default": true - }, - { - "type": "enum", - "key": "displayLights", - "label": "Display Lights", - "enum_items": [ - { "default": "Default Lighting"}, - { "all": "All Lights"}, - { "selected": "Selected Lights"}, - { "flat": "Flat Lighting"}, - { "nolights": "No Lights"} - ], - "default": "default" - }, - { - "type": "boolean", - "key": "displayTextures", - "label": "Display Textures", - "default": true - }, - { - "type": "number", - "key": "textureMaxResolution", - "label": "Texture Clamp Resolution", - "decimal": 0, - "default": 1024 - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Display" - }, - { - "type":"boolean", - "key": "renderDepthOfField", - "label": "Depth of Field", - "default": true - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "shadows", - "label": "Display Shadows", - "default": true - }, - { - "type": "boolean", - "key": "twoSidedLighting", - "label": "Two Sided Lighting", - "default": true - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "lineAAEnable", - "label": "Enable Anti-Aliasing", - "default": true - }, - { - "type": "number", - "key": "multiSample", - "label": "Anti Aliasing Samples", - "decimal": 0, - "minimum": 0, - "maximum": 32, - "default": 8 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "loadTextures", - "label": "Load Textures", - "default": false - }, - { - "type": "boolean", - "key": "useDefaultMaterial", - "label": "Use Default Material", - "default": false - }, - { - "type": "boolean", - "key": "wireframeOnShaded", - "label": "Wireframe On Shaded", - "default": false - }, - { - "type": "boolean", - "key": "xray", - "label": "X-Ray", - "default": false - }, - { - "type": "boolean", - "key": "jointXray", - "label": "X-Ray Joints", - "default": false - }, - { - "type": "boolean", - "key": "backfaceCulling", - "label": "Backface Culling", - "default": false - }, - { - "type": "boolean", - "key": "ssaoEnable", - "label": "Screen Space Ambient Occlusion", - "default": false - }, - { - "type": "number", - "key": "ssaoAmount", - "label": "SSAO Amount", - "default": 1 - }, - { - "type": "number", - "key": "ssaoRadius", - "label": "SSAO Radius", - "default": 16 - }, - { - "type": "number", - "key": "ssaoFilterRadius", - "label": "SSAO Filter Radius", - "decimal": 0, - "minimum": 1, - "maximum": 32, - "default": 16 - }, - { - "type": "number", - "key": "ssaoSamples", - "label": "SSAO Samples", - "decimal": 0, - "minimum": 8, - "maximum": 32, - "default": 16 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "fogging", - "label": "Enable Hardware Fog", - "default": false - }, - { - "type": "enum", - "key": "hwFogFalloff", - "label": "Hardware Falloff", - "enum_items": [ - { "0": "Linear"}, - { "1": "Exponential"}, - { "2": "Exponential Squared"} - ], - "default": "0" - }, - { - "type": "number", - "key": "hwFogDensity", - "label": "Fog Density", - "decimal": 2, - "minimum": 0, - "maximum": 1, - "default": 0 - }, - { - "type": "number", - "key": "hwFogStart", - "label": "Fog Start", - "default": 0 - }, - { - "type": "number", - "key": "hwFogEnd", - "label": "Fog End", - "default": 100 - }, - { - "type": "number", - "key": "hwFogAlpha", - "label": "Fog Alpha", - "default": 0 - }, - { - "type": "number", - "key": "hwFogColorR", - "label": "Fog Color R", - "decimal": 2, - "minimum": 0, - "maximum": 1, - "default": 1 - }, - { - "type": "number", - "key": "hwFogColorG", - "label": "Fog Color G", - "decimal": 2, - "minimum": 0, - "maximum": 1, - "default": 1 - }, - { - "type": "number", - "key": "hwFogColorB", - "label": "Fog Color B", - "decimal": 2, - "minimum": 0, - "maximum": 1, - "default": 1 - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "motionBlurEnable", - "label": "Enable Motion Blur", - "default": false - }, - { - "type": "number", - "key": "motionBlurSampleCount", - "label": "Motion Blur Sample Count", - "decimal": 0, - "minimum": 8, - "maximum": 32, - "default": 8 - }, - { - "type": "number", - "key": "motionBlurShutterOpenFraction", - "label": "Shutter Open Fraction", - "decimal": 3, - "minimum": 0.01, - "maximum": 32, - "default": 0.2 - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Show" - }, - { - "type": "boolean", - "key": "cameras", - "label": "Cameras", - "default": false - }, - { - "type": "boolean", - "key": "clipGhosts", - "label": "Clip Ghosts", - "default": false - }, - { - "type": "boolean", - "key": "deformers", - "label": "Deformers", - "default": false - }, - { - "type": "boolean", - "key": "dimensions", - "label": "Dimensions", - "default": false - }, - { - "type": "boolean", - "key": "dynamicConstraints", - "label": "Dynamic Constraints", - "default": false - }, - { - "type": "boolean", - "key": "dynamics", - "label": "Dynamics", - "default": false - }, - { - "type": "boolean", - "key": "fluids", - "label": "Fluids", - "default": false - }, - { - "type": "boolean", - "key": "follicles", - "label": "Follicles", - "default": false - }, - { - "type": "boolean", - "key": "greasePencils", - "label": "Grease Pencil", - "default": false - }, - { - "type": "boolean", - "key": "grid", - "label": "Grid", - "default": false - }, - { - "type": "boolean", - "key": "hairSystems", - "label": "Hair Systems", - "default": true - }, - { - "type": "boolean", - "key": "handles", - "label": "Handles", - "default": false - }, - { - "type": "boolean", - "key": "headsUpDisplay", - "label": "HUD", - "default": false - }, - { - "type": "boolean", - "key": "ikHandles", - "label": "IK Handles", - "default": false - }, - { - "type": "boolean", - "key": "imagePlane", - "label": "Image Planes", - "default": true - }, - { - "type": "boolean", - "key": "joints", - "label": "Joints", - "default": false - }, - { - "type": "boolean", - "key": "lights", - "label": "Lights", - "default": false - }, - { - "type": "boolean", - "key": "locators", - "label": "Locators", - "default": false - }, - { - "type": "boolean", - "key": "manipulators", - "label": "Manipulators", - "default": false - }, - { - "type": "boolean", - "key": "motionTrails", - "label": "Motion Trails", - "default": false - }, - { - "type": "boolean", - "key": "nCloths", - "label": "nCloths", - "default": false - }, - { - "type": "boolean", - "key": "nParticles", - "label": "nParticles", - "default": false - }, - { - "type": "boolean", - "key": "nRigids", - "label": "nRigids", - "default": false - }, - { - "type": "boolean", - "key": "controlVertices", - "label": "NURBS CVs", - "default": false - }, - { - "type": "boolean", - "key": "nurbsCurves", - "label": "NURBS Curves", - "default": false - }, - { - "type": "boolean", - "key": "hulls", - "label": "NURBS Hulls", - "default": false - }, - { - "type": "boolean", - "key": "nurbsSurfaces", - "label": "NURBS Surfaces", - "default": false - }, - { - "type": "boolean", - "key": "particleInstancers", - "label": "Particle Instancers", - "default": false - }, - { - "type": "boolean", - "key": "pivots", - "label": "Pivots", - "default": false - }, - { - "type": "boolean", - "key": "planes", - "label": "Planes", - "default": false - }, - { - "type": "boolean", - "key": "pluginShapes", - "label": "Plugin Shapes", - "default": false - }, - { - "type": "boolean", - "key": "polymeshes", - "label": "Polygons", - "default": true - }, - { - "type": "boolean", - "key": "strokes", - "label": "Strokes", - "default": false - }, - { - "type": "boolean", - "key": "subdivSurfaces", - "label": "Subdiv Surfaces", - "default": false - }, - { - "type": "boolean", - "key": "textures", - "label": "Texture Placements", - "default": false - }, - { - "type": "dict-modifiable", - "key": "pluginObjects", - "label": "Plugin Objects", - "object_type": "boolean" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "Camera Options", - "label": "Camera Options", - "children": [ - { - "type": "boolean", - "key": "displayGateMask", - "label": "Display Gate Mask", - "default": false - }, - { - "type": "boolean", - "key": "displayResolution", - "label": "Display Resolution", - "default": false - }, - { - "type": "boolean", - "key": "displayFilmGate", - "label": "Display Film Gate", - "default": false - }, - { - "type": "boolean", - "key": "displayFieldChart", - "label": "Display Field Chart", - "default": false - }, - { - "type": "boolean", - "key": "displaySafeAction", - "label": "Display Safe Action", - "default": false - }, - { - "type": "boolean", - "key": "displaySafeTitle", - "label": "Display Safe Title", - "default": false - }, - { - "type": "boolean", - "key": "displayFilmPivot", - "label": "Display Film Pivot", - "default": false - }, - { - "type": "boolean", - "key": "displayFilmOrigin", - "label": "Display Film Origin", - "default": false - }, - { - "type": "number", - "key": "overscan", - "label": "Overscan", - "decimal": 1, - "minimum": 0, - "maximum": 10, - "default": 1 - } - ] - } - ] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json deleted file mode 100644 index b56e381c1d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_create.json +++ /dev/null @@ -1,459 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "create", - "label": "Creator plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "CreateLook", - "label": "Create Look", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "make_tx", - "label": "Make tx files" - }, - { - "type": "boolean", - "key": "rs_tex", - "label": "Make Redshift texture files" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "schema_template", - "name": "template_create_plugin", - "template_data": [ - { - "key": "CreateRender", - "label": "Create Render" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateUnrealStaticMesh", - "label": "Create Unreal - Static Mesh", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "text", - "key": "static_mesh_prefix", - "label": "Static Mesh Prefix" - }, - { - "type": "list", - "key": "collision_prefixes", - "label": "Collision Mesh Prefixes", - "object_type": "text" - } - ] - - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateUnrealSkeletalMesh", - "label": "Create Unreal - Skeletal Mesh", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "text", - "key": "joint_hints", - "label": "Joint root hint" - } - ] - - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateMultiverseLook", - "label": "Create Multiverse Look", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "publish_mip_map", - "label": "Publish Mip Maps" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateAnimation", - "label": "Create Animation", - "children": [ - { - "type": "label", - "label": "This plugin is not optional due to implicit creation through loading the \"rig\" family.\nThis family is also hidden from creation due to complexity in setup." - }, - { - "type": "boolean", - "key": "write_color_sets", - "label": "Write Color Sets" - }, - { - "type": "boolean", - "key": "write_face_sets", - "label": "Write Face Sets" - }, - { - "type": "boolean", - "key": "include_parent_hierarchy", - "label": "Include Parent Hierarchy" - }, - { - "type": "boolean", - "key": "include_user_defined_attributes", - "label": "Include User Defined Attributes" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateModel", - "label": "Create Model", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "write_color_sets", - "label": "Write Color Sets" - }, - { - "type": "boolean", - "key": "write_face_sets", - "label": "Write Face Sets" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreatePointCache", - "label": "Create Point Cache", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "write_color_sets", - "label": "Write Color Sets" - }, - { - "type": "boolean", - "key": "write_face_sets", - "label": "Write Face Sets" - }, - { - "type": "boolean", - "key": "include_user_defined_attributes", - "label": "Include User Defined Attributes" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateProxyAlembic", - "label": "Create Proxy Alembic", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "write_color_sets", - "label": "Write Color Sets" - }, - { - "type": "boolean", - "key": "write_face_sets", - "label": "Write Face Sets" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateReview", - "label": "Create Review", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "boolean", - "key": "useMayaTimeline", - "label": "Use Maya Timeline for Frame Range." - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateAss", - "label": "Create Ass", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - }, - { - "type": "boolean", - "key": "expandProcedurals", - "label": "Expand Procedurals" - }, - { - "type": "boolean", - "key": "motionBlur", - "label": "Motion Blur" - }, - { - "type": "number", - "key": "motionBlurKeys", - "label": "Motion Blur Keys", - "minimum": 0 - }, - { - "type": "number", - "key": "motionBlurLength", - "label": "Motion Blur Length", - "decimal": 3 - }, - { - "type": "boolean", - "key": "maskOptions", - "label": "Export Options" - }, - { - "type": "boolean", - "key": "maskCamera", - "label": "Export Cameras" - }, - { - "type": "boolean", - "key": "maskLight", - "label": "Export Lights" - }, - { - "type": "boolean", - "key": "maskShape", - "label": "Export Shapes" - }, - { - "type": "boolean", - "key": "maskShader", - "label": "Export Shaders" - }, - { - "type": "boolean", - "key": "maskOverride", - "label": "Export Override Nodes" - }, - { - "type": "boolean", - "key": "maskDriver", - "label": "Export Drivers" - }, - { - "type": "boolean", - "key": "maskFilter", - "label": "Export Filters" - }, - { - "type": "boolean", - "key": "maskOperator", - "label": "Export Operators" - }, - { - "type": "boolean", - "key": "maskColor_manager", - "label": "Export Color Managers" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CreateVrayProxy", - "label": "Create VRay Proxy", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "vrmesh", - "label": "VrMesh" - }, - { - "type": "boolean", - "key": "alembic", - "label": "Alembic" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - }, - { - "type": "schema_template", - "name": "template_create_plugin", - "template_data": [ - { - "key": "CreateMultiverseUsd", - "label": "Create Multiverse USD" - }, - { - "key": "CreateMultiverseUsdComp", - "label": "Create Multiverse USD Composition" - }, - { - "key": "CreateMultiverseUsdOver", - "label": "Create Multiverse USD Override" - }, - { - "key": "CreateAssembly", - "label": "Create Assembly" - }, - { - "key": "CreateCamera", - "label": "Create Camera" - }, - { - "key": "CreateLayout", - "label": "Create Layout" - }, - { - "key": "CreateMayaScene", - "label": "Create Maya Scene" - }, - { - "key": "CreateRenderSetup", - "label": "Create Render Setup" - }, - { - "key": "CreateRig", - "label": "Create Rig" - }, - { - "key": "CreateSetDress", - "label": "Create Set Dress" - }, - { - "key": "CreateVRayScene", - "label": "Create VRay Scene" - }, - { - "key": "CreateYetiRig", - "label": "Create Yeti Rig" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_load.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_load.json deleted file mode 100644 index e73d39c06d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_load.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "load", - "label": "Loader plugins", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "colors", - "label": "Loaded Subsets Outliner Colors", - "children": [ - { - "type": "color", - "label": "Model:", - "key": "model" - }, - { - "type": "color", - "label": "Rig:", - "key": "rig" - }, - { - "type": "color", - "label": "Pointcache:", - "key": "pointcache" - }, - { - "type": "color", - "label": "Animation:", - "key": "animation" - }, - { - "type": "color", - "label": "Arnold Standin:", - "key": "ass" - }, - { - "type": "color", - "label": "Camera:", - "key": "camera" - }, - { - "type": "color", - "label": "FBX:", - "key": "fbx" - }, - { - "type": "color", - "label": "Maya Ascii:", - "key": "mayaAscii" - }, - { - "type": "color", - "label": "Maya Scene:", - "key": "mayaScene" - }, - { - "type": "color", - "label": "Set Dress:", - "key": "setdress" - }, - { - "type": "color", - "label": "Layout:", - "key": "layout" - }, - { - "type": "color", - "label": "VDB Cache:", - "key": "vdbcache" - }, - { - "type": "color", - "label": "Vray Proxy:", - "key": "vrayproxy" - }, - { - "type": "color", - "label": "Vray Scene:", - "key": "vrayscene_layer" - }, - { - "type": "color", - "label": "Yeti Cache:", - "key": "yeticache" - }, - { - "type": "color", - "label": "Yeti Rig:", - "key": "yetiRig" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "reference_loader", - "label": "Reference Loader", - "children": [ - { - "type": "text", - "label": "Namespace", - "key": "namespace" - }, - { - "type": "text", - "label": "Group name", - "key": "group_name" - }, - { - "type": "label", - "label": "Here's a link to the doc where you can find explanations about customing the naming of referenced assets: https://openpype.io/docs/admin_hosts_maya#load-plugins" - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "display_handle", - "label": "Display Handle On Load References" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "import_loader", - "label": "Import Loader", - "children": [ - { - "type": "text", - "label": "Namespace", - "key": "namespace" - }, - { - "type": "text", - "label": "Group name", - "key": "group_name" - }, - { - "type": "label", - "label": "Here's a link to the doc where you can find explanations about customing the naming of referenced assets: https://openpype.io/docs/admin_hosts_maya#load-plugins" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json deleted file mode 100644 index d2e7c51e24..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_publish.json +++ /dev/null @@ -1,1187 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Collectors" - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectMayaRender", - "label": "Collect Render Layers", - "children": [ - { - "type": "boolean", - "key": "sync_workfile_version", - "label": "Sync render version with workfile" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectFbxAnimation", - "label": "Collect Fbx Animation", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectFbxCamera", - "label": "Collect Camera for FBX export", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectGLTF", - "label": "Collect Assets for GLTF/GLB export", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Validators" - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateInstanceInContext", - "label": "Validate Instance In Context" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateContainers", - "label": "ValidateContainers" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateFrameRange", - "label": "Validate Frame Range", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "splitter" - }, - { - "key": "exclude_families", - "label": "Exclude Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateShaderName", - "label": "ValidateShaderName", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Shader name regex can use named capture group asset to validate against current asset name.

Example:
^.*(?P=<asset>.+)_SHD

" - }, - { - "type": "text", - "key": "regex", - "label": "Validation regex" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateShadingEngine", - "label": "Validate Look Shading Engine Naming" - }, - { - "key": "ValidateMayaColorSpace", - "label": "ValidateMayaColorSpace" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateAttributes", - "label": "ValidateAttributes", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "raw-json", - "key": "attributes", - "label": "Attributes" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateLoadedPlugin", - "label": "Validate Loaded Plugin", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "whitelist_native_plugins", - "label": "Whitelist Maya Native Plugins" - }, - { - "type": "list", - "key": "authorized_plugins", - "label": "Authorized plugins", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateMayaUnits", - "label": "Validate Maya Units", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "validate_linear_units", - "label": "Validate linear units" - }, - { - "key": "linear_units", - "label": "Linear units", - "type": "enum", - "multiselection": false, - "defaults": "cm", - "enum_items": [ - {"mm": "millimeter"}, - {"cm": "centimeter"}, - {"m": "meter"}, - {"km": "kilometer"}, - {"in": "inch"}, - {"ft": "foot"}, - {"yd": "yard"}, - {"mi": "mile"} - ] - }, - { - "type": "boolean", - "key": "validate_angular_units", - "label": "Validate angular units" - }, - { - "key": "angular_units", - "label": "Angular units", - "type": "enum", - "multiselection": false, - "defaults": "cm", - "enum_items": [ - {"deg": "degree"}, - {"rad": "radian"} - ] - }, - { - "type": "boolean", - "key": "validate_fps", - "label": "Validate fps" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateUnrealStaticMeshName", - "label": "Validate Unreal Static Mesh Name", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "validate_mesh", - "label": "Validate mesh Names " - }, - { - "type": "boolean", - "key": "validate_collision", - "label": "Validate collision names" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateCycleError", - "label": "Validate Cycle Error", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidatePluginPathAttributes", - "label": "Plug-in Path Attributes", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "Fill in the node types and attributes you want to validate.

e.g. AlembicNode.abc_file, the node type is AlembicNode and the node attribute is abc_file" - }, - { - "type": "dict-modifiable", - "collapsible": true, - "key": "attribute", - "label": "File Attribute", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateRenderSettings", - "label": "ValidateRenderSettings", - "children": [ - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "arnold_render_attributes", - "label": "Arnold Render Attributes", - "use_label_wrap": true, - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "vray_render_attributes", - "label": "Vray Render Attributes", - "use_label_wrap": true, - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "redshift_render_attributes", - "label": "Redshift Render Attributes", - "use_label_wrap": true, - "object_type": { - "type": "list", - "object_type": "text" - } - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "renderman_render_attributes", - "label": "Renderman Render Attributes", - "use_label_wrap": true, - "object_type": { - "type": "list", - "object_type": "text" - } - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateResolution", - "label": "Validate Resolution Settings" - }, - { - "key": "ValidateCurrentRenderLayerIsRenderable", - "label": "Validate Current Render Layer Has Renderable Camera" - }, - { - "key": "ValidateGLSLMaterial", - "label": "Validate GLSL Material" - }, - { - "key": "ValidateGLSLPlugin", - "label": "Validate GLSL Plugin" - }, - { - "key": "ValidateRenderImageRule", - "label": "Validate Images File Rule (Workspace)" - }, - { - "key": "ValidateRenderNoDefaultCameras", - "label": "Validate No Default Cameras Renderable" - }, - { - "key": "ValidateRenderSingleCamera", - "label": "Validate Render Single Camera" - }, - { - "key": "ValidateRenderLayerAOVs", - "label": "Validate Render Passes / AOVs Are Registered" - }, - { - "key": "ValidateStepSize", - "label": "Validate Step Size" - }, - { - "key": "ValidateVRayDistributedRendering", - "label": "VRay Distributed Rendering" - }, - { - "key": "ValidateVrayReferencedAOVs", - "label": "VRay Referenced AOVs" - }, - { - "key": "ValidateVRayTranslatorEnabled", - "label": "VRay Translator Settings" - }, - { - "key": "ValidateVrayProxy", - "label": "VRay Proxy Settings" - }, - { - "key": "ValidateVrayProxyMembers", - "label": "VRay Proxy Members" - }, - { - "key": "ValidateYetiRenderScriptCallbacks", - "label": "Yeti Render Script Callbacks" - }, - { - "key": "ValidateYetiRigCacheState", - "label": "Yeti Rig Cache State" - }, - { - "key": "ValidateYetiRigInputShapesInInstance", - "label": "Yeti Rig Input Shapes In Instance" - }, - { - "key": "ValidateYetiRigSettings", - "label": "Yeti Rig Settings" - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Model", - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "ValidateModelName", - "label": "Validate Model Name", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "database", - "label": "Use database shader name definitions" - }, - { - "type": "label", - "label": "Path to material file defining list of material names to check. This is material name per line simple text file.
It will be checked against named group shader in your Validation regex.

For example:
^.*(?P=<shader>.+)_GEO

This is used instead of database definitions if they are disabled." - }, - { - "type": "path", - "key": "material_file", - "label": "Material File", - "multiplatform": true, - "multipath": false - }, - { - "type": "text", - "key": "regex", - "label": "Validation regex" - }, - { - "type": "label", - "label": "Regex for validating name of top level group name.
You can use named capturing groups:
(?P<asset>.*) for Asset name
(?P<subset>.*) for Subset
(?P<project>.*) for project

For example to check for asset in name so *_some_asset_name_GRP is valid, use:
.*?_(?P<asset>.*)_GEO" - }, - { - "type": "text", - "key": "top_level_regex", - "label": "Top level group name regex" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateModelContent", - "label": "Validate Model Content", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "validate_top_group", - "label": "Validate one top group" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateTransformNamingSuffix", - "label": "ValidateTransformNamingSuffix", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "label", - "label": "Validates transform suffix based on the type of its children shapes." - }, - { - "type": "raw-json", - "key": "SUFFIX_NAMING_TABLE", - "label": "Suffix Naming Table" - }, - { - "type": "boolean", - "key": "ALLOW_IF_NOT_IN_SUFFIX_TABLE", - "label": "Allow if suffix not in table" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateColorSets", - "label": "ValidateColorSets" - }, - { - "key": "ValidateMeshHasOverlappingUVs", - "label": "ValidateMeshHasOverlappingUVs" - }, - { - "key": "ValidateMeshArnoldAttributes", - "label": "ValidateMeshArnoldAttributes" - }, - { - "key": "ValidateMeshShaderConnections", - "label": "ValidateMeshShaderConnections" - }, - { - "key": "ValidateMeshSingleUVSet", - "label": "ValidateMeshSingleUVSet" - }, - { - "key": "ValidateMeshHasUVs", - "label": "ValidateMeshHasUVs" - }, - { - "key": "ValidateMeshLaminaFaces", - "label": "ValidateMeshLaminaFaces" - }, - { - "key": "ValidateMeshNgons", - "label": "ValidateMeshNgons" - }, - { - "key": "ValidateMeshNonManifold", - "label": "ValidateMeshNonManifold" - }, - { - "key": "ValidateMeshNoNegativeScale", - "label": "Validate Mesh No Negative Scale" - }, - { - "key": "ValidateMeshNonZeroEdgeLength", - "label": "Validate Mesh Edge Length Non Zero" - }, - { - "key": "ValidateMeshNormalsUnlocked", - "label": "ValidateMeshNormalsUnlocked" - }, - { - "key": "ValidateMeshUVSetMap1", - "label": "ValidateMeshUVSetMap1", - "docstring": "Validate model's default uv set exists and is named 'map1'.

In Maya meshes by default have a uv set named 'map1' that cannot be deleted. It can be renamed, however,
introducing some issues with some renderers. As such we ensure the first (default) UV set index is named 'map1'." - }, - { - "key": "ValidateMeshVerticesHaveEdges", - "label": "ValidateMeshVerticesHaveEdges" - }, - { - "key": "ValidateNoAnimation", - "label": "ValidateNoAnimation", - "docstring": "Ensure no keyframes on nodes in the Instance.
Even though a Model would extract without animCurves correctly this avoids getting different
output from a model when extracted from a different frame than the first frame. (Might be overly restrictive though)." - }, - { - "key": "ValidateNoNamespace", - "label": "ValidateNoNamespace" - }, - { - "key": "ValidateNoNullTransforms", - "label": "ValidateNoNullTransforms" - }, - { - "key": "ValidateNoUnknownNodes", - "label": "ValidateNoUnknownNodes" - }, - { - "key": "ValidateNodeNoGhosting", - "label": "ValidateNodeNoGhosting" - }, - { - "key": "ValidateShapeDefaultNames", - "label": "ValidateShapeDefaultNames" - }, - { - "key": "ValidateShapeRenderStats", - "label": "ValidateShapeRenderStats" - }, - { - "key": "ValidateShapeZero", - "label": "ValidateShapeZero" - }, - { - "key": "ValidateTransformZero", - "label": "ValidateTransformZero" - }, - { - "key": "ValidateUniqueNames", - "label": "ValidateUniqueNames" - }, - { - "key": "ValidateNoVRayMesh", - "label": "Validate No V-Ray Proxies (VRayMesh)" - }, - { - "key": "ValidateUnrealMeshTriangulated", - "label": "Validate if Mesh is Triangulated" - }, - { - "key": "ValidateAlembicVisibleOnly", - "label": "Validate Alembic visible node" - } - ] - }, - { - "type": "label", - "label": "Extractors" - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractProxyAlembic", - "label": "Extract Proxy Alembic", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractAlembic", - "label": "Extract Alembic", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractObj", - "label": "Extract OBJ", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - } - ] - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Rig", - "children": [ - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateRigContents", - "label": "Validate Rig Contents" - }, - { - "key": "ValidateRigJointsHidden", - "label": "Validate Rig Joints Hidden" - }, - { - "key": "ValidateRigControllers", - "label": "Validate Rig Controllers" - }, - { - "key": "ValidateAnimatedReferenceRig", - "label": "Validate Animated Reference Rig" - }, - { - "key": "ValidateAnimationContent", - "label": "Validate Animation Content" - }, - { - "key": "ValidateOutRelatedNodeIds", - "label": "Validate Animation Out Set Related Node Ids" - }, - { - "key": "ValidateRigControllersArnoldAttributes", - "label": "Validate Rig Controllers (Arnold Attributes)" - }, - { - "key": "ValidateSkeletalMeshHierarchy", - "label": "Validate Skeletal Mesh Top Node" - }, - { - "key": "ValidateSkeletonRigContents", - "label": "Validate Skeleton Rig Contents" - }, - { - "key": "ValidateSkeletonRigControllers", - "label": "Validate Skeleton Rig Controllers" - }, - { - "key": "ValidateSkinclusterDeformerSet", - "label": "Validate Skincluster Deformer Relationships" - }, - { - "key": "ValidateSkeletonRigOutputIds", - "label": "Validate Skeleton Rig Output Ids" - }, - { - "key": "ValidateSkeletonTopGroupHierarchy", - "label": "Validate Skeleton Top Group Hierarchy" - } - ] - }, - - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateRigOutSetNodeIds", - "label": "Validate Rig Out Set Node Ids", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "allow_history_only", - "label": "Allow history only" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateSkeletonRigOutSetNodeIds", - "label": "Validate Skeleton Rig Out Set Node Ids", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "allow_history_only", - "label": "Allow history only" - } - ] - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateCameraAttributes", - "label": "Validate Camera Attributes", - "docstring": "" - }, - { - "key": "ValidateAssemblyName", - "label": "Validate Assembly Name" - }, - { - "key": "ValidateAssemblyNamespaces", - "label": "Validate Assembly Namespaces" - }, - { - "key": "ValidateAssemblyModelTransforms", - "label": "Validate Assembly Model Transforms" - }, - { - "key": "ValidateAssRelativePaths", - "label": "ValidateAssRelativePaths" - }, - { - "key": "ValidateInstancerContent", - "label": "Validate Instancer Content" - }, - { - "key": "ValidateInstancerFrameRanges", - "label": "Validate Instancer Cache Frame Ranges" - }, - { - "key": "ValidateNoDefaultCameras", - "label": "Validate No Default Cameras" - }, - { - "key": "ValidateUnrealUpAxis", - "label": "Validate Unreal Up-Axis check" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ValidateCameraContents", - "label": "Validate Camera Content", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "validate_shapes", - "label": "Validate presence of shapes" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Extractors" - }, - { - "type": "schema", - "name": "schema_maya_capture" - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractMayaSceneRaw", - "label": "Maya Scene (Raw)", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Add loaded instances to those published families:" - }, - { - "key": "add_for_families", - "label": "Families", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractCameraAlembic", - "label": "Extract camera to Alembic", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "List of attributes that will be added to the baked alembic camera. Needs to be written in python list syntax.

For example:
[\"attributeName\", \"anotherAttribute\"]

" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "raw-json", - "key": "bake_attributes", - "label": "Bake Attributes", - "is_list": true - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractCameraMayaScene", - "label": "Extract camera to Maya scene", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "boolean", - "key": "keep_image_planes", - "label": "Export Image planes" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractGLB", - "label": "Extract GLB", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "text", - "key": "ogsfx_path", - "label": "GLSL Shader Directory" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractLook", - "label": "Extract Look", - "children": [ - { - "type": "list", - "key": "maketx_arguments", - "label": "Extra arguments for maketx command line", - "object_type": { - "type": "dict", - "children": [ - { - "key": "argument", - "label": "Argument", - "type": "text" - }, - { - "key": "parameters", - "label": "Parameters", - "type": "list", - "object_type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractGPUCache", - "label": "Extract GPU Cache", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "step", - "label": "Step", - "type": "number", - "decimal": 4, - "minimum": 1 - }, - { - "key": "stepSave", - "label": "Step Save", - "type": "number", - "minimum": 1 - }, - { - "key": "optimize", - "label": "Optimize Hierarchy", - "type": "boolean" - }, - { - "key": "optimizationThreshold", - "label": "Optimization Threshold", - "type": "number", - "minimum": 1 - }, - { - "key": "optimizeAnimationsForMotionBlur", - "label": "Optimize Animations For Motion Blur", - "type": "boolean" - }, - { - "key": "writeMaterials", - "label": "Write Materials", - "type": "boolean" - }, - { - "key": "useBaseTessellation", - "label": "User Base Tesselation", - "type": "boolean" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_render_settings.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_render_settings.json deleted file mode 100644 index fc4e750e3b..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_maya_render_settings.json +++ /dev/null @@ -1,515 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "RenderSettings", - "label": "Render Settings", - "children": [ - { - "type": "boolean", - "key": "apply_render_settings", - "label": "Apply Render Settings on creation" - }, - { - "type": "text", - "key": "default_render_image_folder", - "label": "Default render image folder. This setting can be\noverwritten by custom staging directory profile;\n\"project_settings/global/tools/publish\n/custom_staging_dir_profiles\"." - }, - { - "type": "boolean", - "key": "enable_all_lights", - "label": "Include all lights in Render Setup Layers by default" - }, - { - "key": "aov_separator", - "label": "AOV Separator character", - "type": "enum", - "multiselection": false, - "default": "underscore", - "enum_items": [ - {"dash": "- (dash)"}, - {"underscore": "_ (underscore)"}, - {"dot": ". (dot)"} - ] - }, - { - "key": "remove_aovs", - "label": "Remove existing AOVs", - "type": "boolean" - }, - { - "key": "reset_current_frame", - "label": "Reset Current Frame", - "type": "boolean" - }, - { - "type": "dict", - "collapsible": true, - "key": "arnold_renderer", - "label": "Arnold Renderer", - "is_group": true, - "children": [ - { - "key": "image_prefix", - "label": "Image prefix template", - "type": "text" - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"jpeg": "jpeg"}, - {"png": "png"}, - {"deepexr": "deep exr"}, - {"tif": "tif"}, - {"exr": "exr"}, - {"maya": "maya"}, - {"mtoa_shaders": "mtoa_shaders"} - ] - }, - { - "key": "multilayer_exr", - "label": "Multilayer (exr)", - "type": "boolean" - }, - { - "key": "tiled", - "label": "Tiled (tif, exr)", - "type": "boolean" - }, - { - "key": "aov_list", - "label": "AOVs to create", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"empty": "< empty >"}, - {"ID": "ID"}, - {"N": "N"}, - {"P": "P"}, - {"Pref": "Pref"}, - {"RGBA": "RGBA"}, - {"Z": "Z"}, - {"albedo": "albedo"}, - {"background": "background"}, - {"coat": "coat"}, - {"coat_albedo": "coat_albedo"}, - {"coat_direct": "coat_direct"}, - {"coat_indirect": "coat_indirect"}, - {"cputime": "cputime"}, - {"crypto_asset": "crypto_asset"}, - {"crypto_material": "cypto_material"}, - {"crypto_object": "crypto_object"}, - {"diffuse": "diffuse"}, - {"diffuse_albedo": "diffuse_albedo"}, - {"diffuse_direct": "diffuse_direct"}, - {"diffuse_indirect": "diffuse_indirect"}, - {"direct": "direct"}, - {"emission": "emission"}, - {"highlight": "highlight"}, - {"indirect": "indirect"}, - {"motionvector": "motionvector"}, - {"opacity": "opacity"}, - {"raycount": "raycount"}, - {"rim_light": "rim_light"}, - {"shadow": "shadow"}, - {"shadow_diff": "shadow_diff"}, - {"shadow_mask": "shadow_mask"}, - {"shadow_matte": "shadow_matte"}, - {"sheen": "sheen"}, - {"sheen_albedo": "sheen_albedo"}, - {"sheen_direct": "sheen_direct"}, - {"sheen_indirect": "sheen_indirect"}, - {"specular": "specular"}, - {"specular_albedo": "specular_albedo"}, - {"specular_direct": "specular_direct"}, - {"specular_indirect": "specular_indirect"}, - {"sss": "sss"}, - {"sss_albedo": "sss_albedo"}, - {"sss_direct": "sss_direct"}, - {"sss_indirect": "sss_indirect"}, - {"transmission": "transmission"}, - {"transmission_albedo": "transmission_albedo"}, - {"transmission_direct": "transmission_direct"}, - {"transmission_indirect": "transmission_indirect"}, - {"volume": "volume"}, - {"volume_Z": "volume_Z"}, - {"volume_albedo": "volume_albedo"}, - {"volume_direct": "volume_direct"}, - {"volume_indirect": "volume_indirect"}, - {"volume_opacity": "volume_opacity"} - ] - }, - { - "type": "label", - "label": "Add additional options - put attribute and value, like defaultArnoldRenderOptions.AASamples = 4" - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "additional_options", - "label": "Additional Renderer Options", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "vray_renderer", - "label": "V-Ray Renderer", - "is_group": true, - "children": [ - { - "key": "image_prefix", - "label": "Image prefix template", - "type": "text" - }, - { - "key": "engine", - "label": "Production Engine", - "type": "enum", - "multiselection": false, - "defaults": "1", - "enum_items": [ - {"1": "V-Ray"}, - {"2": "V-Ray GPU"} - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"png": "png"}, - {"jpg": "jpg"}, - {"vrimg": "vrimg"}, - {"hdr": "hdr"}, - {"exr": "exr"}, - {"exr (multichannel)": "exr (multichannel)"}, - {"exr (deep)": "exr (deep)"}, - {"tga": "tga"}, - {"bmp": "bmp"}, - {"sgi": "sgi"} - ] - }, - { - "key": "aov_list", - "label": "AOVs to create", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"empty": "< empty >"}, - {"atmosphereChannel": "atmosphereChannel"}, - {"backgroundChannel": "backgroundChannel"}, - {"bumpNormalsChannel": "bumpNormalsChannel"}, - {"causticsChannel": "causticsChannel"}, - {"coatFilterChannel": "coatFilterChannel"}, - {"coatGlossinessChannel": "coatGlossinessChannel"}, - {"coatReflectionChannel": "coatReflectionChannel"}, - {"vrayCoatChannel": "vrayCoatChannel"}, - {"CoverageChannel": "CoverageChannel"}, - {"cryptomatteChannel": "cryptomatteChannel"}, - {"customColor": "customColor"}, - {"drBucketChannel": "drBucketChannel"}, - {"denoiserChannel": "denoiserChannel"}, - {"diffuseChannel": "diffuseChannel"}, - {"ExtraTexElement": "ExtraTexElement"}, - {"giChannel": "giChannel"}, - {"LightMixElement": "LightMixElement"}, - {"LightSelectElement": "LightSelectElement"}, - {"lightingChannel": "lightingChannel"}, - {"LightingAnalysisChannel": "LightingAnalysisChannel"}, - {"materialIDChannel": "materialIDChannel"}, - {"MaterialSelectElement": "MaterialSelectElement"}, - {"matteShadowChannel": "matteShadowChannel"}, - {"metalnessChannel": "metalnessChannel"}, - {"MultiMatteElement": "MultiMatteElement"}, - {"multimatteIDChannel": "multimatteIDChannel"}, - {"noiseLevelChannel": "noiseLevelChannel"}, - {"normalsChannel": "normalsChannel"}, - {"nodeIDChannel": "nodeIDChannel"}, - {"objectSelectChannel": "objectSelectChannel"}, - {"rawCoatFilterChannel": "rawCoatFilterChannel"}, - {"rawCoatReflectionChannel": "rawCoatReflectionChannel"}, - {"rawDiffuseFilterChannel": "rawDiffuseFilterChannel"}, - {"rawGiChannel": "rawGiChannel"}, - {"rawLightChannel": "rawLightChannel"}, - {"rawReflectionChannel": "rawReflectionChannel"}, - {"rawReflectionFilterChannel": "rawReflectionFilterChannel"}, - {"rawRefractionChannel": "rawRefractionChannel"}, - {"rawRefractionFilterChannel": "rawRefractionFilterChannel"}, - {"rawShadowChannel": "rawShadowChannel"}, - {"rawSheenFilterChannel": "rawSheenFilterChannel"}, - {"rawSheenReflectionChannel": "rawSheenReflectionChannel"}, - {"rawTotalLightChannel": "rawTotalLightChannel"}, - {"reflectIORChannel": "reflectIORChannel"}, - {"reflectChannel": "reflectChannel"}, - {"reflectionFilterChannel": "reflectionFilterChannel"}, - {"reflectGlossinessChannel": "reflectGlossinessChannel"}, - {"refractChannel": "refractChannel"}, - {"refractionFilterChannel": "refractionFilterChannel"}, - {"refractGlossinessChannel": "refractGlossinessChannel"}, - {"renderIDChannel": "renderIDChannel"}, - {"FastSSS2Channel": "FastSSS2Channel"}, - {"sampleRateChannel": "sampleRateChannel"}, - {"samplerInfo": "samplerInfo"}, - {"selfIllumChannel": "selfIllumChannel"}, - {"shadowChannel": "shadowChannel"}, - {"sheenFilterChannel": "sheenFilterChannel"}, - {"sheenGlossinessChannel": "sheenGlossinessChannel"}, - {"sheenReflectionChannel": "sheenReflectionChannel"}, - {"vraySheenChannel": "vraySheenChannel"}, - {"specularChannel": "specularChannel"}, - {"Toon": "Toon"}, - {"toonLightingChannel": "toonLightingChannel"}, - {"toonSpecularChannel": "toonSpecularChannel"}, - {"totalLightChannel": "totalLightChannel"}, - {"unclampedColorChannel": "unclampedColorChannel"}, - {"VRScansPaintMaskChannel": "VRScansPaintMaskChannel"}, - {"VRScansZoneMaskChannel": "VRScansZoneMaskChannel"}, - {"velocityChannel": "velocityChannel"}, - {"zdepthChannel": "zdepthChannel"} - ] - }, - { - "type": "label", - "label": "Add additional options - put attribute and value, like vraySettings.aaFilterSize = 1.5" - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "additional_options", - "label": "Additional Renderer Options", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "redshift_renderer", - "label": "Redshift Renderer", - "is_group": true, - "children": [ - { - "key": "image_prefix", - "label": "Image prefix template", - "type": "text" - }, - { - "key": "primary_gi_engine", - "label": "Primary GI Engine", - "type": "enum", - "multiselection": false, - "defaults": "0", - "enum_items": [ - {"0": "None"}, - {"3": "Irradiance Cache"}, - {"4": "Brute Force"} - ] - }, - { - "key": "secondary_gi_engine", - "label": "Secondary GI Engine", - "type": "enum", - "multiselection": false, - "defaults": "0", - "enum_items": [ - {"0": "None"}, - {"2": "Irradiance Point Cloud"}, - {"4": "Brute Force"} - ] - }, - { - "key": "image_format", - "label": "Output Image Format", - "type": "enum", - "multiselection": false, - "defaults": "exr", - "enum_items": [ - {"iff": "Maya IFF"}, - {"exr": "OpenEXR"}, - {"tif": "TIFF"}, - {"png": "PNG"}, - {"tga": "Targa"}, - {"jpg": "JPEG"} - ] - }, - { - "key": "multilayer_exr", - "label": "Multilayer (exr)", - "type": "boolean" - }, - { - "key": "force_combine", - "label": "Force combine beauty and AOVs", - "type": "boolean" - }, - { - "key": "aov_list", - "label": "AOVs to create", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"empty": "< none >"}, - {"Ambient Occlusion": "Ambient Occlusion"}, - {"Background": "Background"}, - {"Beauty": "Beauty"}, - {"Bump Normals": "Bump Normals"}, - {"Caustics": "Caustics"}, - {"Caustics Raw": "Caustics Raw"}, - {"Cryptomatte": "Cryptomatte"}, - {"Custom": "Custom"}, - {"Depth": "Depth"}, - {"Diffuse Filter": "Diffuse Filter"}, - {"Diffuse Lighting": "Diffuse Lighting"}, - {"Diffuse Lighting Raw": "Diffuse Lighting Raw"}, - {"Emission": "Emission"}, - {"Global Illumination": "Global Illumination"}, - {"Global Illumination Raw": "Global Illumination Raw"}, - {"Matte": "Matte"}, - {"Motion Vectors": "Motion Vectors"}, - {"Normals": "Normals"}, - {"ObjectID": "ObjectID"}, - {"Object-Space Bump Normals": "Object-Space Bump Normals"}, - {"Object-Space Positions": "Object-Space Positions"}, - {"Puzzle Matte": "Puzzle Matte"}, - {"Reflections": "Reflections"}, - {"Reflections Filter": "Reflections Filter"}, - {"Reflections Raw": "Reflections Raw"}, - {"Refractions": "Refractions"}, - {"Refractions Filter": "Refractions Filter"}, - {"Refractions Raw": "Refractions Filter"}, - {"Shadows": "Shadows"}, - {"SpecularLighting": "Specular Lighting"}, - {"Sub Surface Scatter": "Sub Surface Scatter"}, - {"Sub Surface Scatter Raw": "Sub Surface Scatter Raw"}, - {"Total Diffuse Lighting Raw": "Total Diffuse Lighting Raw"}, - {"Total Translucency Filter": "Total Translucency Filter"}, - {"Translucency Filter": "Translucency Filter"}, - {"Translucency Lighting Raw": "Translucency Lighting Raw"}, - {"Volume Fog Emission": "Volume Fog Emission"}, - {"Volume Fog Tint": "Volume Fog Tint"}, - {"Volume Lighting": "Volume Lighting"}, - {"World Position": "World Position"} - ] - }, - { - "type": "label", - "label": "Add additional options - put attribute and value, like redshiftOptions.reflectionMaxTraceDepth = 3" - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "additional_options", - "label": "Additional Renderer Options", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "renderman_renderer", - "label": "Renderman Renderer", - "is_group": true, - "children": [ - { - "key": "image_prefix", - "label": "Image prefix template", - "type": "text" - }, - { - "key": "image_dir", - "label": "Image Output Directory", - "type": "text" - }, - { - "key": "display_filters", - "label": "Display Filters", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"PxrBackgroundDisplayFilter": "PxrBackgroundDisplayFilter"}, - {"PxrCopyAOVDisplayFilter": "PxrCopyAOVDisplayFilter"}, - {"PxrEdgeDetect":"PxrEdgeDetect"}, - {"PxrFilmicTonemapperDisplayFilter": "PxrFilmicTonemapperDisplayFilter"}, - {"PxrGradeDisplayFilter": "PxrGradeDisplayFilter"}, - {"PxrHalfBufferErrorFilter": "PxrHalfBufferErrorFilter"}, - {"PxrImageDisplayFilter": "PxrImageDisplayFilter"}, - {"PxrLightSaturation": "PxrLightSaturation"}, - {"PxrShadowDisplayFilter": "PxrShadowDisplayFilter"}, - {"PxrStylizedHatching": "PxrStylizedHatching"}, - {"PxrStylizedLines": "PxrStylizedLines"}, - {"PxrStylizedToon": "PxrStylizedToon"}, - {"PxrWhitePointDisplayFilter": "PxrWhitePointDisplayFilter"} - ] - }, - { - "key": "imageDisplay_dir", - "label": "Image Display Filter Directory", - "type": "text" - }, - { - "key": "sample_filters", - "label": "Sample Filters", - "type": "enum", - "multiselection": true, - "defaults": "empty", - "enum_items": [ - {"PxrBackgroundSampleFilter": "PxrBackgroundSampleFilter"}, - {"PxrCopyAOVSampleFilter": "PxrCopyAOVSampleFilter"}, - {"PxrCryptomatte": "PxrCryptomatte"}, - {"PxrFilmicTonemapperSampleFilter": "PxrFilmicTonemapperSampleFilter"}, - {"PxrGradeSampleFilter": "PxrGradeSampleFilter"}, - {"PxrShadowFilter": "PxrShadowFilter"}, - {"PxrWatermarkFilter": "PxrWatermarkFilter"}, - {"PxrWhitePointSampleFilter": "PxrWhitePointSampleFilter"} - ] - }, - { - "key": "cryptomatte_dir", - "label": "Cryptomatte Output Directory", - "type": "text" - }, - { - "key": "watermark_dir", - "label": "Watermark Filter Directory", - "type": "text" - }, - { - "type": "label", - "label": "Add additional options - put attribute and value, like Ci" - }, - { - "type": "dict-modifiable", - "store_as_list": true, - "key": "additional_options", - "label": "Additional Renderer Options", - "use_label_wrap": true, - "object_type": { - "type": "text" - } - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_imageio.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_imageio.json deleted file mode 100644 index af826fcf46..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_imageio.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "key": "imageio", - "type": "dict", - "label": "Color Management (OCIO managed)", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "template", - "name": "template_host_color_management_ocio" - }, - { - "key": "viewer", - "type": "dict", - "label": "Viewer", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "viewerProcess", - "label": "Viewer Process" - } - ] - }, - { - "key": "baking", - "type": "dict", - "label": "Extract-review baking profile", - "collapsible": false, - "children": [ - { - "type": "text", - "key": "viewerProcess", - "label": "Viewer Process" - } - ] - }, - { - "key": "workfile", - "type": "dict", - "label": "Workfile", - "collapsible": false, - "children": [ - { - "type": "form", - "children": [ - { - "type": "enum", - "key": "colorManagement", - "label": "color management", - "enum_items": [ - { - "Nuke": "Nuke" - }, - { - "OCIO": "OCIO" - } - ] - }, - { - "type": "enum", - "key": "OCIO_config", - "label": "OpenColorIO Config", - "enum_items": [ - { - "nuke-default": "nuke-default" - }, - { - "spi-vfx": "spi-vfx (11)" - }, - { - "spi-anim": "spi-anim (11)" - }, - { - "aces_0.1.1": "aces_0.1.1 (11)" - }, - { - "aces_0.7.1": "aces_0.7.1 (11)" - }, - { - "aces_1.0.1": "aces_1.0.1 (11)" - }, - { - "aces_1.0.3": "aces_1.0.3 (11, 12)" - }, - { - "aces_1.1": "aces_1.1 (12, 13)" - }, - { - "aces_1.2": "aces_1.2 (13, 14)" - }, - { - "studio-config-v1.0.0_aces-v1.3_ocio-v2.1": "studio-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)" - }, - { - "cg-config-v1.0.0_aces-v1.3_ocio-v2.1": "cg-config-v1.0.0_aces-v1.3_ocio-v2.1 (14)" - } - ] - }, - { - "type": "text", - "key": "workingSpaceLUT", - "label": "Working Space" - }, - { - "type": "text", - "key": "monitorLut", - "label": "monitor" - } - ] - } - ] - }, - { - "key": "nodes", - "type": "dict", - "label": "Nodes", - "collapsible": true, - "children": [ - { - "key": "requiredNodes", - "type": "list", - "label": "Plugin required", - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "key": "plugins", - "label": "Used in plugins", - "object_type": { - "type": "text", - "key": "pluginClass" - } - }, - { - "type": "text", - "key": "nukeNodeClass", - "label": "Nuke Node Class" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Knobs", - "key": "knobs" - } - ] - } - - ] - } - }, - { - "type": "splitter" - }, - { - "type": "list", - "key": "overrideNodes", - "label": "Plugin's node overrides", - "object_type": { - "type": "dict", - "children": [ - { - "type": "list", - "key": "plugins", - "label": "Used in plugins", - "object_type": { - "type": "text", - "key": "pluginClass" - } - }, - { - "type": "text", - "key": "nukeNodeClass", - "label": "Nuke Node Class" - }, - { - "key": "subsets", - "label": "Subsets", - "type": "list", - "object_type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Knobs overrides", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "key": "regexInputs", - "type": "dict", - "label": "Colorspace on Inputs by regex detection", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "inputs", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "regex", - "label": "Regex" - }, - { - "type": "text", - "key": "colorspace", - "label": "Colorspace" - } - ] - } - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json deleted file mode 100644 index 805424c632..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "load", - "label": "Loader plugins", - "children": [ - { - "type": "schema_template", - "name": "template_loader_plugin_nuke", - "template_data": [ - { - "key": "LoadImage", - "label": "Image Loader" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "LoadClip", - "label": "Clip Loader", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "_representations", - "label": "Representations", - "object_type": "text" - }, - { - "type": "text", - "key": "node_name_template", - "label": "Node name template" - }, - { - "type": "splitter" - }, - { - "type": "dict", - "collapsible": false, - "key": "options_defaults", - "label": "Loader option defaults", - "children": [ - { - "type": "boolean", - "key": "start_at_workfile", - "label": "Start at worfile beggining" - }, - { - "type": "boolean", - "key": "add_retime", - "label": "Add retime" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json deleted file mode 100644 index 09b67e7d1a..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json +++ /dev/null @@ -1,544 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "publish", - "label": "Publish plugins", - "children": [ - { - "type": "label", - "label": "Collectors" - }, - { - "type": "dict", - "collapsible": true, - "key": "CollectInstanceData", - "label": "CollectInstanceData", - "is_group": true, - "children": [ - { - "type": "enum", - "key": "sync_workfile_version_on_families", - "label": "Sync workfile version for families", - "multiselection": true, - "enum_items": [ - { - "nukenodes": "nukenodes" - }, - { - "model": "model" - }, - { - "camera": "camera" - }, - { - "gizmo": "gizmo" - }, - { - "source": "source" - }, - { - "prerender": "prerender" - }, - { - "render": "render" - }, - { - "write": "write" - } - ] - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Validators" - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateCorrectAssetContext", - "label": "Validate Correct Asset Name" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateContainers", - "label": "Validate Containers" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ValidateKnobs", - "label": "Validate Knobs", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "raw-json", - "key": "knobs", - "label": "Knobs" - } - ] - }, - { - "type": "schema_template", - "name": "template_publish_plugin", - "template_data": [ - { - "key": "ValidateOutputResolution", - "label": "Validate Output Resolution" - }, - { - "key": "ValidateBackdrop", - "label": "Validate Backdrop" - }, - { - "key": "ValidateGizmo", - "label": "Validate Gizmo (Group)" - }, - { - "key": "ValidateScriptAttributes", - "label": "Validate workfile attributes" - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Extractors" - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractReviewData", - "label": "ExtractReviewData", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractReviewDataLut", - "label": "ExtractReviewDataLut", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractReviewDataMov", - "label": "ExtractReviewDataMov", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "viewer_lut_raw", - "label": "Viewer LUT raw" - }, - { - "key": "outputs", - "label": "Output Definitions", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "dict", - "collapsible": false, - "key": "filter", - "label": "Filtering", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subsets", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "read_raw", - "label": "Read colorspace RAW", - "default": false - }, - { - "type": "text", - "key": "viewer_process_override", - "label": "Viewer Process colorspace profile override" - }, - { - "type": "boolean", - "key": "bake_viewer_process", - "label": "Bake Viewer Process" - }, - { - "type": "boolean", - "key": "bake_viewer_input_process", - "label": "Bake Viewer Input Process (LUTs)" - }, - { - "type": "separator" - }, - { - "key": "reformat_nodes_config", - "type": "dict", - "label": "Reformat Nodes", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Reposition knobs supported only.
You can add multiple reformat nodes
and set their knobs. Order of reformat
nodes is important. First reformat node
will be applied first and last reformat
node will be applied last." - }, - { - "key": "reposition_nodes", - "type": "list", - "label": "Reposition nodes", - "object_type": { - "type": "dict", - "children": [ - { - "key": "node_class", - "label": "Node class", - "type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Node knobs", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "extension", - "label": "Write node file type" - }, - { - "key": "add_custom_tags", - "label": "Add custom tags", - "type": "list", - "object_type": "text" - } - ] - } - } - - ] - }, - { - "type": "label", - "label": "^ Settings and for ExtractReviewDataMov is deprecated and will be soon removed.
Please use ExtractReviewIntermediates instead." - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "ExtractReviewIntermediates", - "label": "ExtractReviewIntermediates", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "viewer_lut_raw", - "label": "Viewer LUT raw" - }, - { - "key": "outputs", - "label": "Output Definitions", - "type": "dict-modifiable", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "dict", - "collapsible": false, - "key": "filter", - "label": "Filtering", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "subsets", - "label": "Subsets", - "type": "list", - "object_type": "text" - } - ] - }, - { - "type": "separator" - }, - { - "type": "boolean", - "key": "read_raw", - "label": "Read colorspace RAW", - "default": false - }, - { - "type": "text", - "key": "viewer_process_override", - "label": "Viewer Process colorspace profile override" - }, - { - "type": "boolean", - "key": "bake_viewer_process", - "label": "Bake Viewer Process" - }, - { - "type": "boolean", - "key": "bake_viewer_input_process", - "label": "Bake Viewer Input Process (LUTs)" - }, - { - "type": "separator" - }, - { - "key": "reformat_nodes_config", - "type": "dict", - "label": "Reformat Nodes", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "label", - "label": "Reposition knobs supported only.
You can add multiple reformat nodes
and set their knobs. Order of reformat
nodes is important. First reformat node
will be applied first and last reformat
node will be applied last." - }, - { - "key": "reposition_nodes", - "type": "list", - "label": "Reposition nodes", - "object_type": { - "type": "dict", - "children": [ - { - "key": "node_class", - "label": "Node class", - "type": "text" - }, - { - "type": "schema_template", - "name": "template_nuke_knob_inputs", - "template_data": [ - { - "label": "Node knobs", - "key": "knobs" - } - ] - } - ] - } - } - ] - }, - { - "type": "separator" - }, - { - "type": "text", - "key": "extension", - "label": "Write node file type" - }, - { - "key": "add_custom_tags", - "label": "Add custom tags", - "type": "list", - "object_type": "text" - } - ] - } - } - - ] - }, - { - "type": "dict", - "collapsible": true, - "key": "ExtractSlateFrame", - "label": "ExtractSlateFrame", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "viewer_lut_raw", - "label": "Viewer LUT raw" - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Fill specific slate node values with templates. Uncheck the checkbox to not change the value.", - "word_wrap": true - }, - { - "type": "dict", - "key": "key_value_mapping", - "children": [ - { - "type": "list-strict", - "key": "f_submission_note", - "label": "Submission Note:", - "object_types": [ - { - "type": "boolean" - }, - { - "type": "text" - } - ] - }, - { - "type": "list-strict", - "key": "f_submitting_for", - "label": "Submission For:", - "object_types": [ - { - "type": "boolean" - }, - { - "type": "text" - } - ] - }, - { - "type": "list-strict", - "key": "f_vfx_scope_of_work", - "label": "VFX Scope Of Work:", - "object_types": [ - { - "type": "boolean" - }, - { - "type": "text" - } - ] - } - ] - } - ] - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Integrators" - }, - { - "type": "dict", - "collapsible": true, - "checkbox_key": "enabled", - "key": "IncrementScriptVersion", - "label": "IncrementScriptVersion", - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_scriptsgizmo.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_scriptsgizmo.json deleted file mode 100644 index e4c65177a7..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_nuke_scriptsgizmo.json +++ /dev/null @@ -1,129 +0,0 @@ -{ - "type": "list", - "key": "gizmo", - "label": "Gizmo Menu", - "is_group": true, - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "toolbar_menu_name", - "label": "Toolbar Menu Name" - }, - { - "type": "path", - "key": "gizmo_source_dir", - "label": "Gizmo directory path", - "multipath": true, - "multiplatform": true - }, - { - "type": "collapsible-wrap", - "label": "Options", - "collapsible": true, - "collapsed": true, - "children": [ - { - "type": "path", - "key": "toolbar_icon_path", - "label": "Toolbar Icon Path", - "multipath": false, - "multiplatform": true - }, - { - "type": "splitter" - }, - { - "type": "list", - "key": "gizmo_definition", - "label": "Gizmo definitions", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "gizmo_toolbar_path", - "label": "Gizmo Menu Path" - }, - { - "type": "list", - "key": "sub_gizmo_list", - "label": "Sub Gizmo List", - "use_label_wrap": true, - "object_type": { - "type": "dict-conditional", - "enum_key": "sourcetype", - "enum_label": "Type of usage", - "enum_children": [ - { - "key": "python", - "label": "Python", - "children": [ - { - "type": "text", - "key": "title", - "label": "Title" - }, - { - "type": "text", - "key": "command", - "label": "Python command" - }, - { - "type": "text", - "key": "icon", - "label": "Icon Path" - }, - { - "type": "text", - "key": "shortcut", - "label": "Hotkey" - } - ] - }, - { - "key": "file", - "label": "File", - "children": [ - { - "type": "text", - "key": "title", - "label": "Title" - }, - { - "type": "text", - "key": "file_name", - "label": "Gizmo file name" - }, - { - "type": "text", - "key": "shortcut", - "label": "Hotkey" - } - ] - }, - { - "key": "separator", - "label": "Separator", - "children": [ - { - "type": "text", - "key": "gizmo_toolbar_path", - "label": "Toolbar path" - } - ] - } - ] - } - } - ] - } - } - ] - } - ] - } -} \ No newline at end of file diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_publish_gui_filter.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_publish_gui_filter.json deleted file mode 100644 index f27ca9586f..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_publish_gui_filter.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "type": "dict-modifiable", - "collapsible": true, - "key": "filters", - "label": "Publish GUI Filters", - "object_type": { - "type": "raw-json" - } -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_representation_tags.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_representation_tags.json deleted file mode 100644 index 7046952eef..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_representation_tags.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "key": "tags", - "label": "Tags", - "type": "enum", - "multiselection": true, - "enum_items": [ - { - "burnin": "Add burnins" - }, - { - "review": "Create review" - }, - { - "ftrackreview": "Add review to Ftrack" - }, - { - "shotgridreview": "Add review to Shotgrid" - }, - { - "kitsureview": "Add review to Kitsu" - }, - { - "delete": "Delete output" - }, - { - "slate-frame": "Add slate frame" - }, - { - "no-handles": "Skip handle frames" - }, - { - "sequence": "Output as image sequence" - }, - { - "no-audio": "Do not add audio" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_scriptsmenu.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_scriptsmenu.json deleted file mode 100644 index e841d6ba77..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_scriptsmenu.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "scriptsmenu", - "label": "Scripts Menu Definition", - "children": [ - { - "type": "text", - "key": "name", - "label": "Menu Name" - }, - { - "type": "splitter" - }, - { - "type": "raw-json", - "key": "definition", - "label": "Menu definition", - "is_list": true - } - ] -} \ No newline at end of file diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_templated_workfile_build.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_templated_workfile_build.json deleted file mode 100644 index 7bab28fd88..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_templated_workfile_build.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "templated_workfile_build", - "label": "Templated Workfile Build Settings", - "children": [ - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "task_names", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "key": "path", - "label": "Path to template", - "type": "path", - "multiplatform": false, - "multipath": false - }, - { - "key": "keep_placeholder", - "label": "Keep placeholders", - "type": "boolean", - "default": true - }, - { - "key": "create_first_version", - "label": "Create first version", - "type": "boolean", - "default": true - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json deleted file mode 100644 index 2a3f0ae136..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "type": "dict", - "collapsible": true, - "key": "workfile_build", - "label": "Workfile Build Settings", - "children": [ - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "current_context", - "label": "Current Context", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] - } - }, - { - "key": "linked_assets", - "label": "Linked Assets", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] - } - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_colorspace_remapping.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_colorspace_remapping.json deleted file mode 100644 index acd36ece9d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_colorspace_remapping.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - { - "key": "remapping", - "type": "dict", - "label": "Remapping colorspace names", - "collapsible": true, - "children": [ - { - "type": "list", - "key": "rules", - "object_type": { - "type": "dict", - "children": [ - { - "type": "text", - "key": "host_native_name", - "label": "Application native colorspace name" - }, - { - "type": "text", - "key": "ocio_name", - "label": "OCIO colorspace name" - } - ] - } - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_create_plugin.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_create_plugin.json deleted file mode 100644 index 3d2ed9f3d4..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_create_plugin.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "type": "dict", - "collapsible": true, - "key": "{key}", - "label": "{label}", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "default_variants", - "label": "Default Variants", - "object_type": "text" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_derived.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_derived.json deleted file mode 100644 index a129d470c0..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_derived.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - { - "type": "label", - "label": "The application does not include any built-in color management capabilities, OpenPype offers a solution
to this limitation by deriving valid colorspace names for the OpenColorIO (OCIO) color management
system from file paths, using File Rules feature only during Publishing.

Related documentation." - }, - { - "type": "boolean", - "key": "activate_host_color_management", - "label": "Enable Color Management" - }, - { - "type": "template", - "name": "template_imageio_config" - }, - { - "type": "template", - "name": "template_imageio_file_rules" - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_ocio.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_ocio.json deleted file mode 100644 index 88c22fa762..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_ocio.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - { - "type": "label", - "label": "Colorspace management for the application can be controlled through OpenPype settings.
Specifically, the configured OpenColorIO (OCIO) config path is utilized in the application's workfile.
Additionally, the File Rules feature can be leveraged for both publishing and loading procedures.

Related documentation." - }, - { - "type": "boolean", - "key": "activate_host_color_management", - "label": "Enable Color Management" - }, - { - "type": "template", - "name": "template_imageio_config" - }, - { - "type": "template", - "name": "template_imageio_file_rules" - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_remapped.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_remapped.json deleted file mode 100644 index 780264947f..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_host_color_management_remapped.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "type": "label", - "label": "The application includes internal color management functionality, but it does not offer external control
over this feature. To address this limitation, OpenPype uses mapping rules to remap the native
colorspace names used in the internal color management system to the OpenColorIO (OCIO)
color management system. Remapping feature is used in Publishing and Loading procedures.

Related documentation.." - }, - { - "type": "boolean", - "key": "activate_host_color_management", - "label": "Enable Color Management" - }, - { - "type": "template", - "name": "template_colorspace_remapping" - }, - { - "type": "template", - "name": "template_imageio_config" - }, - { - "type": "template", - "name": "template_imageio_file_rules" - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_config.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_config.json deleted file mode 100644 index 0550e5093c..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_config.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "key": "ocio_config", - "type": "dict", - "label": "OCIO config", - "collapsible": true, - "children": [ - { - "type": "boolean", - "key": "override_global_config", - "label": "Override global OCIO config" - }, - { - "type": "path", - "key": "filepath", - "label": "Config path", - "multiplatform": false, - "multipath": true - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_file_rules.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_file_rules.json deleted file mode 100644 index 5c6c696578..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_imageio_file_rules.json +++ /dev/null @@ -1,42 +0,0 @@ -[ - { - "key": "file_rules", - "type": "dict", - "label": "File Rules (OCIO v1 only)", - "collapsible": true, - "children": [ - { - "type": "boolean", - "key": "activate_host_rules", - "label": "Activate Host File Rules" - }, - { - "key": "rules", - "label": "Rules", - "type": "dict-modifiable", - "highlight_content": true, - "collapsible": false, - "object_type": { - "type": "dict", - "children": [ - { - "key": "pattern", - "label": "Regex pattern", - "type": "text" - }, - { - "key": "colorspace", - "label": "Colorspace name", - "type": "text" - }, - { - "key": "ext", - "label": "File extension", - "type": "text" - } - ] - } - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_loader_plugin_nuke.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_loader_plugin_nuke.json deleted file mode 100644 index 7ee8d0bda0..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_loader_plugin_nuke.json +++ /dev/null @@ -1,27 +0,0 @@ -[ - { - "type": "dict", - "collapsible": true, - "key": "{key}", - "label": "{label}", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "list", - "key": "_representations", - "label": "Representations", - "object_type": "text" - }, - { - "type": "text", - "key": "node_name_template", - "label": "Node name template" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_knob_inputs.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_knob_inputs.json deleted file mode 100644 index 51c78ce8f0..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_knob_inputs.json +++ /dev/null @@ -1,337 +0,0 @@ -[ - { - "type": "collapsible-wrap", - "label": "{label}", - "collapsible": true, - "collapsed": true, - "children": [{ - "type": "list", - "key": "{key}", - "object_type": { - "type": "dict-conditional", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "text", - "label": "Text", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "text", - "key": "value", - "label": "Value" - } - ] - }, - { - "key": "expression", - "label": "Expression", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "text", - "key": "expression", - "label": "Expression" - } - ] - }, - { - "key": "formatable", - "label": "Formate from template", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "text", - "key": "template", - "label": "Template", - "placeholder": "{{key}} or {{key}};{{key}}" - }, - { - "type": "enum", - "key": "to_type", - "label": "Knob type", - "enum_items": [ - { - "text": "Text" - }, - { - "number": "Number" - }, - { - "decimal_number": "Decimal number" - }, - { - "2d_vector": "2D vector" - } - ] - } - ] - }, - { - "key": "color_gui", - "label": "Color GUI", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "color", - "key": "value", - "label": "Value", - "use_alpha": false - } - ] - }, - { - "key": "bool", - "label": "Boolean", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "boolean", - "key": "value", - "label": "Value" - } - ] - }, - { - "key": "number", - "label": "Number", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "number", - "key": "value", - "default": 1, - "decimal": 0, - "maximum": 99999999 - } - - ] - }, - { - "key": "decimal_number", - "label": "Decimal number", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "number", - "key": "value", - "default": 1, - "decimal": 4, - "maximum": 99999999 - } - - ] - }, - { - "key": "2d_vector", - "label": "2D vector", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "list-strict", - "key": "value", - "label": "Value", - "object_types": [ - { - "type": "number", - "key": "x", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "y", - "default": 1, - "decimal": 4, - "maximum": 99999999 - } - ] - } - ] - }, - { - "key": "3d_vector", - "label": "3D vector", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "list-strict", - "key": "value", - "label": "Value", - "object_types": [ - { - "type": "number", - "key": "x", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "y", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "z", - "default": 1, - "decimal": 4, - "maximum": 99999999 - } - ] - } - ] - }, - { - "key": "color", - "label": "Color", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "list-strict", - "key": "value", - "label": "Value", - "object_types": [ - { - "type": "number", - "key": "r", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "g", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "b", - "default": 1, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "a", - "default": 1, - "decimal": 4, - "maximum": 99999999 - } - ] - } - ] - }, - { - "key": "box", - "label": "Box", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "list-strict", - "key": "value", - "label": "Value", - "object_types": [ - { - "type": "number", - "key": "x", - "default": 0, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "y", - "default": 0, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "r", - "default": 1920, - "decimal": 4, - "maximum": 99999999 - }, - { - "type": "number", - "key": "t", - "default": 1080, - "decimal": 4, - "maximum": 99999999 - } - ] - } - ] - }, - { - "key": "__legacy__", - "label": "_ Legacy type _", - "children": [ - { - "type": "text", - "key": "name", - "label": "Name" - }, - { - "type": "text", - "key": "value", - "label": "Value" - } - ] - } - ] - } - }] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_write_attrs.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_write_attrs.json deleted file mode 100644 index 3a34858f4e..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_nuke_write_attrs.json +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "key": "instance_attributes", - "label": "Instance attributes", - "type": "enum", - "multiselection": true, - "enum_items": [ - { - "reviewable": "Reviewable" - }, - { - "farm_rendering": "Farm rendering" - }, - { - "use_range_limit": "Use range limit" - }, - { - "ordered": "Defined order" - }, - { - "channels": "Channels override" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_families.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_families.json deleted file mode 100644 index 43dd74cdf9..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_families.json +++ /dev/null @@ -1,49 +0,0 @@ -[ - { - "__default_values__": { - "multiselection": true - } - }, - { - "key": "{key}", - "label": "{label}", - "multiselection": "{multiselection}", - "type": "enum", - "enum_items": [ - {"action": "action"}, - {"animation": "animation"}, - {"assembly": "assembly"}, - {"audio": "audio"}, - {"backgroundComp": "backgroundComp"}, - {"backgroundLayout": "backgroundLayout"}, - {"camera": "camera"}, - {"editorial": "editorial"}, - {"gizmo": "gizmo"}, - {"image": "image"}, - {"layout": "layout"}, - {"look": "look"}, - {"matchmove": "matchmove"}, - {"mayaScene": "mayaScene"}, - {"model": "model"}, - {"nukenodes": "nukenodes"}, - {"plate": "plate"}, - {"pointcache": "pointcache"}, - {"proxyAbc": "proxyAbc"}, - {"prerender": "prerender"}, - {"redshiftproxy": "redshiftproxy"}, - {"reference": "reference"}, - {"render": "render"}, - {"review": "review"}, - {"rig": "rig"}, - {"setdress": "setdress"}, - {"take": "take"}, - {"usdShade": "usdShade"}, - {"vdbcache": "vdbcache"}, - {"vrayproxy": "vrayproxy"}, - {"workfile": "workfile"}, - {"xgen": "xgen"}, - {"yetiRig": "yetiRig"}, - {"yeticache": "yeticache"} - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_plugin.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_plugin.json deleted file mode 100644 index 5151e4550d..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_publish_plugin.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "__default_values__": { - "docstring": "" - } - }, - { - "type": "dict", - "collapsible": true, - "key": "{key}", - "label": "{label}", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - }, - { - "type": "label", - "label": "{docstring}" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_validate_plugin.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_validate_plugin.json deleted file mode 100644 index b57cad6719..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_validate_plugin.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "type": "dict", - "collapsible": true, - "key": "{key}", - "label": "{label}", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "optional", - "label": "Optional" - }, - { - "type": "boolean", - "key": "active", - "label": "Active" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json deleted file mode 100644 index 49cf9ca94a..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "type": "dict", - "collapsible": true, - "key": "workfile_builder", - "label": "Workfile Builder", - "children": [ - { - "type": "boolean", - "key": "create_first_version", - "label": "Create first workfile", - "default": false - }, - { - "type": "path", - "key": "template_path", - "label": "First workfile template", - "multiplatform": true, - "multipath": false - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json b/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json deleted file mode 100644 index 90fc4fbdd0..0000000000 --- a/client/ayon_core/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json +++ /dev/null @@ -1,150 +0,0 @@ -[{ - "type": "dict", - "collapsible": true, - "key": "workfile_builder", - "label": "Workfile Builder", - "children": [ - { - "type": "boolean", - "key": "create_first_version", - "label": "Create first workfile", - "default": false - }, - { - "type": "list", - "key": "custom_templates", - "label": "Custom templates", - "is_group": true, - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "task-types-enum", - "key": "task_types", - "label": "Task types" - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Absolute path to workfile template or OpenPype Anatomy text is accepted." - }, - { - "type": "path", - "key": "path", - "label": "Path", - "multiplatform": true, - "multipath": false - } - ] - } - }, - { - "type": "boolean", - "key": "builder_on_start", - "label": "Run Builder Profiles on first launch", - "default": false - }, - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "use_label_wrap": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "task_types", - "label": "Task types", - "type": "task-types-enum" - }, - { - "key": "tasks", - "label": "Task names", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "current_context", - "label": "Current Context", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] - } - }, - { - "type": "separator" - }, - { - "key": "linked_assets", - "label": "Linked Assets/Shots", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] - } - } - ] - } - } - ] -} -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/example_infinite_hierarchy.json b/client/ayon_core/settings/entities/schemas/system_schema/example_infinite_hierarchy.json deleted file mode 100644 index a2660e9bf2..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/example_infinite_hierarchy.json +++ /dev/null @@ -1,58 +0,0 @@ -[ - { - "type": "dict-conditional", - "use_label_wrap": true, - "collapsible": true, - "key": "menu_items", - "label": "Menu items", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "command", - "label": "Comand" - } - ] - }, - { - "key": "menu", - "label": "Menu", - "children": [ - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": { - "type": "template", - "name": "example_infinite_hierarchy" - } - } - ] - }, - { - "key": "separator", - "label": "Separator" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/example_schema.json b/client/ayon_core/settings/entities/schemas/system_schema/example_schema.json deleted file mode 100644 index b9747b5f4f..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/example_schema.json +++ /dev/null @@ -1,580 +0,0 @@ -{ - "key": "example_dict", - "label": "Examples", - "type": "dict", - "is_file": true, - "children": [ - { - "key": "color", - "label": "Color input", - "type": "color" - }, - { - "type": "dict-conditional", - "key": "overridden_value", - "label": "Overridden value", - "enum_key": "overridden", - "enum_is_horizontal": true, - "enum_children": [ - { - "key": "overridden", - "label": "Override value", - "children": [ - { - "type": "number", - "key": "value", - "label": "value" - } - ] - }, - { - "key": "inherit", - "label": "Inherit value", - "children": [] - } - ] - }, - { - "type": "dict-conditional", - "use_label_wrap": true, - "collapsible": true, - "key": "menu_items", - "label": "Menu items", - "enum_key": "type", - "enum_label": "Type", - "enum_children": [ - { - "key": "action", - "label": "Action", - "children": [ - { - "type": "text", - "key": "key", - "label": "Key" - }, - { - "type": "text", - "key": "label", - "label": "Label" - }, - { - "type": "text", - "key": "command", - "label": "Comand" - } - ] - }, - { - "key": "menu", - "label": "Menu", - "children": [ - { - "key": "children", - "label": "Children", - "type": "list", - "object_type": "text" - } - ] - }, - { - "key": "separator", - "label": "Separator" - } - ] - }, - { - "type": "list", - "use_label_wrap": true, - "collapsible": true, - "key": "infinite_hierarchy", - "label": "Infinite list template hierarchy", - "object_type": { - "type": "template", - "name": "example_infinite_hierarchy" - } - }, - { - "type": "dict", - "key": "template_exaples", - "label": "Schema template examples", - "children": [ - { - "type": "template", - "name": "example_template", - "template_data": { - "host_label": "Application 1", - "host_name": "app_1", - "multipath_executables": false - } - }, - { - "type": "template", - "name": "example_template", - "template_data": { - "host_label": "Application 2", - "host_name": "app_2" - } - } - ] - }, - { - "key": "dict_wrapper", - "type": "dict", - "children": [ - { - "type": "enum", - "key": "test_enum_singleselection", - "label": "Enum Single Selection", - "enum_items": [ - { "value_1": "Label 1" }, - { "value_2": "Label 2" }, - { "value_3": "Label 3" } - ] - }, - { - "type": "enum", - "key": "test_enum_multiselection", - "label": "Enum Multi Selection", - "multiselection": true, - "enum_items": [ - { "value_1": "Label 1" }, - { "value_2": "Label 2" }, - { "value_3": "Label 3" } - ] - }, - { - "type": "boolean", - "key": "bool", - "label": "Boolean checkbox" - }, - { - "type": "label", - "label": "NOTE: This is label" - }, - { - "type": "splitter" - }, - { - "type": "number", - "key": "integer", - "label": "Integer", - "decimal": 0, - "minimum": 0, - "maximum": 10 - }, - { - "type": "number", - "key": "float", - "label": "Float (2 decimals)", - "decimal": 2, - "minimum": -10, - "maximum": -5 - }, - { - "type": "number", - "key": "number_with_slider", - "label": "Number with slider", - "decimal": 2, - "minimum": 0.0, - "maximum": 1.0, - "show_slider": true - }, - { - "type": "text", - "key": "singleline_text", - "label": "Singleline text" - }, - { - "type": "text", - "key": "multiline_text", - "label": "Multiline text", - "multiline": true - }, - { - "type": "raw-json", - "key": "raw_json", - "label": "Raw json input" - }, - { - "type": "list", - "key": "list_item_of_multiline_texts", - "label": "List of multiline texts", - "object_type": { - "type": "text", - "multiline": true - } - }, - { - "type": "list", - "key": "list_item_of_floats", - "label": "List of floats", - "object_type": { - "type": "number", - "decimal": 3, - "minimum": 1000, - "maximum": 2000 - } - }, - { - "type": "dict-modifiable", - "key": "modifiable_dict_of_integers", - "label": "Modifiable dict of integers", - "object_type": { - "type": "number", - "decimal": 0, - "minimum": 10, - "maximum": 100 - } - }, - { - "type": "dict-modifiable", - "key": "modifiable_dict_with_required_keys", - "label": "Modifiable dict with required keys", - "required_keys": [ - "key_1", - "key_2" - ], - "object_type": "text" - }, - { - "type": "list-strict", - "key": "strict_list_labels_horizontal", - "label": "StrictList-labels-horizontal (color)", - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, - { - "type": "list-strict", - "key": "strict_list_labels_vertical", - "label": "StrictList-labels-vertical (color)", - "horizontal": false, - "object_types": [ - { - "label": "Red", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Green", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Blue", - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "label": "Alpha", - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, - { - "type": "list-strict", - "key": "strict_list_nolabels_horizontal", - "label": "StrictList-nolabels-horizontal (color)", - "object_types": [ - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, - { - "type": "list-strict", - "key": "strict_list_nolabels_vertical", - "label": "StrictList-nolabels-vertical (color)", - "horizontal": false, - "object_types": [ - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 255, - "decimal": 0 - }, - { - "type": "number", - "minimum": 0, - "maximum": 1, - "decimal": 6 - } - ] - }, - { - "type": "list", - "key": "dict_item", - "label": "DictItem in List", - "object_type": { - "type": "dict", - "children": [ - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "hosts", - "label": "Hosts", - "type": "list", - "object_type": "text" - } - ] - } - }, - { - "type": "path", - "key": "single_path_input", - "label": "Single path input", - "multiplatform": false, - "multipath": false - }, - { - "type": "path", - "key": "multi_path_input", - "label": "Multi path input", - "multiplatform": false, - "multipath": true - }, - { - "type": "path", - "key": "single_os_specific_path_input", - "label": "Single OS specific path input", - "multiplatform": true, - "multipath": false - }, - { - "type": "path", - "key": "multi_os_specific_path_input", - "label": "Multi OS specific path input", - "multiplatform": true, - "multipath": true - }, - { - "key": "collapsible", - "type": "dict", - "label": "collapsible dictionary", - "collapsible": true, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, - { - "key": "collapsible_expanded", - "type": "dict", - "label": "collapsible dictionary, expanded on creation", - "collapsible": true, - "collapsed": false, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, - { - "key": "not_collapsible", - "type": "dict", - "label": "Not collapsible", - "collapsible": false, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, - { - "key": "nested_dict_lvl1", - "type": "dict", - "label": "Nested dictionary (level 1)", - "children": [ - { - "key": "nested_dict_lvl2", - "type": "dict", - "label": "Nested dictionary (level 2)", - "is_group": true, - "children": [ - { - "key": "nested_dict_lvl3", - "type": "dict", - "label": "Nested dictionary (level 3)", - "children": [ - { - "type": "boolean", - "key": "_nothing", - "label": "Exmaple input" - } - ] - }, - { - "key": "nested_dict_lvl3_2", - "type": "dict", - "label": "Nested dictionary (level 3) (2)", - "children": [ - { - "type": "text", - "key": "_nothing", - "label": "Exmaple input" - }, - { - "type": "text", - "key": "_nothing2", - "label": "Exmaple input 2" - } - ] - } - ] - } - ] - }, - { - "key": "form_examples", - "type": "dict", - "label": "Form examples", - "children": [ - { - "key": "inputs_without_form_example", - "type": "dict", - "label": "Inputs without form", - "children": [ - { - "type": "text", - "key": "_nothing_1", - "label": "Example label" - }, - { - "type": "text", - "key": "_nothing_2", - "label": "Example label ####" - }, - { - "type": "text", - "key": "_nothing_3", - "label": "Example label ########" - } - ] - }, - { - "key": "inputs_with_form_example", - "type": "dict", - "label": "Inputs with form", - "children": [ - { - "type": "form", - "children": [ - { - "type": "text", - "key": "_nothing_1", - "label": "Example label" - }, - { - "type": "text", - "key": "_nothing_2", - "label": "Example label ####" - }, - { - "type": "text", - "key": "_nothing_3", - "label": "Example label ########" - } - ] - } - ] - } - ] - }, - { - "type": "collapsible-wrap", - "label": "Collapsible Wrapper without key", - "children": [ - { - "type": "text", - "key": "_example_input_collapsible", - "label": "Example input in collapsible wrapper" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/example_template.json b/client/ayon_core/settings/entities/schemas/system_schema/example_template.json deleted file mode 100644 index 9955cf5651..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/example_template.json +++ /dev/null @@ -1,19 +0,0 @@ -[ - { - "__default_values__": { - "multipath_executables": true - } - }, - { - "type": "raw-json", - "label": "{host_label} Environments", - "key": "{host_name}_environments" - }, - { - "type": "path", - "key": "{host_name}_executables", - "label": "{host_label} - Full paths to executables", - "multiplatform": "{multipath_executables}", - "multipath": true - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_3dsmax.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_3dsmax.json deleted file mode 100644 index f7c57298af..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_3dsmax.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "3dsmax", - "label": "Autodesk 3ds Max", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json deleted file mode 100644 index b92a2edf85..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_aftereffects.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "aftereffects", - "label": "Adobe AfterEffects", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_blender.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_blender.json deleted file mode 100644 index 27ead6e6da..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_blender.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "blender", - "label": "Blender", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_celaction.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_celaction.json deleted file mode 100644 index b104e3bb82..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_celaction.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "celaction", - "label": "CelAction2D", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict", - "key": "variants", - "children": [ - { - "type": "schema_template", - "name": "template_host_variant", - "template_data": [ - { - "app_variant_label": "Current", - "app_variant": "current" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_djv.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_djv.json deleted file mode 100644 index d09f038892..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_djv.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "djvview", - "label": "DJV View", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_flame.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_flame.json deleted file mode 100644 index 1a9d8d4716..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_flame.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "flame", - "label": "Autodesk Flame", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_fusion.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_fusion.json deleted file mode 100644 index 5960da7774..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_fusion.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "fusion", - "label": "Blackmagic Fusion", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_harmony.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_harmony.json deleted file mode 100644 index d5d041d0c2..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_harmony.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "harmony", - "label": "Toon Boom Harmony", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_houdini.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_houdini.json deleted file mode 100644 index 5390b9b78f..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_houdini.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "houdini", - "label": "SideFX Houdini", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_maya.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_maya.json deleted file mode 100644 index 97854a3945..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_maya.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "maya", - "label": "Autodesk Maya", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_mayapy.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_mayapy.json deleted file mode 100644 index bbdc7e13b0..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_mayapy.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "mayapy", - "label": "Autodesk MayaPy", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_photoshop.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_photoshop.json deleted file mode 100644 index 0687b9699b..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_photoshop.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "photoshop", - "label": "Adobe Photoshop", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_resolve.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_resolve.json deleted file mode 100644 index 8524c92e86..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_resolve.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "resolve", - "label": "Blackmagic DaVinci Resolve", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict", - "key": "variants", - "children": [ - { - "type": "schema_template", - "name": "template_host_variant", - "template_data": [ - { - "app_variant_label": "stable", - "app_variant": "stable" - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_substancepainter.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_substancepainter.json deleted file mode 100644 index fb3b21e63f..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_substancepainter.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "substancepainter", - "label": "Substance Painter", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_tvpaint.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_tvpaint.json deleted file mode 100644 index ff57d767c4..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_tvpaint.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "dict", - "key": "tvpaint", - "label": "TVPaint", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": ["use_python_2"] - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_unreal.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_unreal.json deleted file mode 100644 index df5ec0e6fa..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/schema_unreal.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "dict", - "key": "unreal", - "label": "Unreal Editor", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_unchangables.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_unchangables.json deleted file mode 100644 index c4d8d89209..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_unchangables.json +++ /dev/null @@ -1,24 +0,0 @@ -[ - { - "type": "text", - "key": "label", - "label": "Label", - "placeholder": "Host label (without any version)", - "roles": ["developer"] - }, - { - "type": "text", - "key": "icon", - "label": "Icon", - "placeholder": "Host icon path template", - "roles": ["developer"] - }, - { - "type": "hosts-enum", - "key": "host_name", - "label": "Host implementation", - "multiselection": false, - "use_empty_value": true, - "roles": ["developer"] - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant.json deleted file mode 100644 index 96a936c27b..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant.json +++ /dev/null @@ -1,32 +0,0 @@ -[ - { - "__default_values__": { - "variant_skip_paths": null - } - }, - { - "type": "dict", - "key": "{app_variant}", - "label": "{app_variant_label}", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "variant_label", - "label": "Variant label", - "placeholder": "< {app_variant} >" - }, - { - "type": "schema_template", - "name": "template_host_variant_items", - "skip_paths": "{variant_skip_paths}" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant_items.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant_items.json deleted file mode 100644 index 409efb006e..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_host_variant_items.json +++ /dev/null @@ -1,51 +0,0 @@ -[ - { - "type": "boolean", - "key": "use_python_2", - "label": "Use Python 2", - "default": false - }, - { - "type": "path", - "key": "executables", - "label": "Executables", - "multiplatform": true, - "multipath": true, - "placeholder": "Executable path" - }, - { - "key": "separator", - "type":"separator" - }, - { - "type": "dict", - "key": "arguments", - "label": "Arguments", - "use_label_wrap": false, - "children": [ - { - "key": "windows", - "label": "Windows", - "type": "list", - "object_type": "text" - }, - { - "key": "darwin", - "label": "MacOS", - "type": "list", - "object_type": "text" - }, - { - "key": "linux", - "label": "Linux", - "type": "list", - "object_type": "text" - } - ] - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_nuke.json b/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_nuke.json deleted file mode 100644 index 22398ba227..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/host_settings/template_nuke.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "type": "dict", - "key": "{nuke_type}", - "label": "Foundry {nuke_label}", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_ftrack.json b/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_ftrack.json deleted file mode 100644 index 7c5774415c..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_ftrack.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "type": "dict", - "key": "ftrack", - "label": "Ftrack", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "ftrack_server", - "label": "Server" - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Additional Ftrack event handlers paths" - }, - { - "type": "path", - "key": "ftrack_actions_path", - "label": "User paths", - "use_label_wrap": true, - "multipath": true, - "multiplatform": true - }, - { - "type": "path", - "key": "ftrack_events_path", - "label": "Server paths", - "use_label_wrap": true, - "multipath": true, - "multiplatform": true - }, - { - "type": "separator" - }, - { - "key": "intent", - "type": "dict", - "label": "Intent", - "collapsible_key": true, - "is_group": true, - "children": [ - { - "type": "boolean", - "key": "allow_empty_intent", - "label": "Allow empty intent" - }, - { - "type": "text", - "key": "empty_intent_label", - "label": "Empty item label", - "placeholder": "< Not set >" - }, - { - "type": "dict-modifiable", - "object_type": "text", - "key": "items" - }, - { - "type": "separator" - }, - { - "key": "default", - "type": "text", - "label": "Default Intent", - "placeholder": "< First available >" - }, - { - "type": "separator" - } - ] - }, - { - "key": "custom_attributes", - "label": "Custom Attributes", - "type": "dict", - "children": [ - { - "type": "dict", - "key": "show", - "label": "Project Custom attributes", - "children": [ - { - "type": "schema_template", - "name": "template_custom_attribute", - "template_data": [ - { - "key": "avalon_auto_sync" - }, - { - "key": "library_project" - }, - { - "key": "applications" - } - ] - } - ] - }, - { - "type": "dict", - "key": "is_hierarchical", - "label": "Hierarchical Attributes", - "children": [ - { - "type": "schema_template", - "name": "template_custom_attribute", - "template_data": [ - { - "key": "tools_env" - }, - { - "key": "avalon_mongo_id" - }, - { - "key": "fps" - }, - { - "key": "frameStart" - }, - { - "key": "frameEnd" - }, - { - "key": "clipIn" - }, - { - "key": "clipOut" - }, - { - "key": "handleStart" - }, - { - "key": "handleEnd" - }, - { - "key": "resolutionWidth" - }, - { - "key": "resolutionHeight" - }, - { - "key": "pixelAspect" - } - ] - } - ] - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_kitsu.json b/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_kitsu.json deleted file mode 100644 index 15a2ccc58d..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/schema_kitsu.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "type": "dict", - "key": "kitsu", - "label": "Kitsu", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "server", - "label": "Server" - }, - { - "type": "splitter" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/template_custom_attribute.json b/client/ayon_core/settings/entities/schemas/system_schema/module_settings/template_custom_attribute.json deleted file mode 100644 index 71b7f2ea53..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/module_settings/template_custom_attribute.json +++ /dev/null @@ -1,21 +0,0 @@ -[ - { - "key": "{key}", - "label": "{key}", - "type": "dict", - "children": [ - { - "key": "write_security_roles", - "label": "Write roles", - "type": "list", - "object_type": "text" - }, - { - "key": "read_security_roles", - "label": "Read roles", - "type": "list", - "object_type": "text" - } - ] - } -] diff --git a/client/ayon_core/settings/entities/schemas/system_schema/schema_applications.json b/client/ayon_core/settings/entities/schemas/system_schema/schema_applications.json deleted file mode 100644 index 7965c344ae..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/schema_applications.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "key": "applications", - "type": "dict", - "label": "Applications", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "schema", - "name": "schema_maya" - }, - { - "type": "schema", - "name": "schema_mayapy" - }, - { - "type": "schema", - "name": "schema_3dsmax" - }, - { - "type": "schema", - "name": "schema_flame" - }, - { - "type": "schema_template", - "name": "template_nuke", - "template_data": { - "nuke_type": "nuke", - "nuke_label": "Nuke" - } - }, - { - "type": "schema_template", - "name": "template_nuke", - "template_data": { - "nuke_type": "nukeassist", - "nuke_label": "Nuke Assist" - } - }, - { - "type": "schema_template", - "name": "template_nuke", - "template_data": { - "nuke_type": "nukex", - "nuke_label": "Nuke X" - } - }, - { - "type": "schema_template", - "name": "template_nuke", - "template_data": { - "nuke_type": "nukestudio", - "nuke_label": "Nuke Studio" - } - }, - { - "type": "schema_template", - "name": "template_nuke", - "template_data": { - "nuke_type": "hiero", - "nuke_label": "Hiero" - } - }, - { - "type": "schema", - "name": "schema_fusion" - }, - { - "type": "schema", - "name": "schema_resolve" - }, - { - "type": "schema", - "name": "schema_houdini" - }, - { - "type": "schema", - "name": "schema_blender" - }, - { - "type": "schema", - "name": "schema_harmony" - }, - { - "type": "schema", - "name": "schema_tvpaint" - }, - { - "type": "schema", - "name": "schema_photoshop" - }, - { - "type": "schema", - "name": "schema_aftereffects" - }, - { - "type": "schema", - "name": "schema_celaction" - }, - { - "type": "schema", - "name": "schema_substancepainter" - }, - { - "type": "schema", - "name": "schema_unreal" - }, - { - "type": "schema", - "name": "schema_djv" - }, - { - "type": "dict-modifiable", - "key": "additional_apps", - "label": "Additional", - "collapsible": true, - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "schema_template", - "name": "template_host_unchangables", - "skip_paths": ["host_name", "label"] - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "use_label_wrap": false, - "object_type": { - "type": "dict", - "collapsible": true, - "children": [ - { - "type": "schema_template", - "name": "template_host_variant_items" - } - ] - } - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/schema_general.json b/client/ayon_core/settings/entities/schemas/system_schema/schema_general.json deleted file mode 100644 index 2609441061..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/schema_general.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "key": "general", - "type": "dict", - "label": "General", - "collapsible": true, - "is_file": true, - "children": [ - { - "key": "studio_name", - "type": "text", - "label": "Studio Name" - }, - { - "key": "studio_code", - "type": "text", - "label": "Studio Short Code" - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "This is NOT a securely stored password! It only acts as a simple barrier to stop users from accessing studio wide settings." - }, - { - "type": "text", - "key": "admin_password", - "label": "Admin password" - }, - { - "type": "splitter" - }, - { - "key": "environment", - "label": "Environment", - "type": "raw-json", - "require_restart": true - }, - { - "type": "splitter" - }, - { - "type": "boolean", - "key": "log_to_server", - "label": "Log to mongo" - }, - { - "type": "dict", - "key": "disk_mapping", - "label": "Disk mapping", - "is_group": true, - "use_label_wrap": false, - "collapsible": false, - "children": [ - { - "key": "windows", - "label": "Windows", - "type": "list", - "object_type": { - "type": "list-strict", - "key": "item", - "object_types": [ - { - "label": "Source", - "type": "path" - }, - { - "label": "Destination", - "type": "path" - } - ] - } - }, - { - "key": "linux", - "label": "Linux", - "type": "list", - "object_type": { - "type": "list-strict", - "key": "item", - "object_types": [ - { - "label": "Source", - "type": "path" - }, - { - "label": "Destination", - "type": "path" - } - ] - } - }, - { - "key": "darwin", - "label": "MacOS", - "type": "list", - "object_type": { - "type": "list-strict", - "key": "item", - "object_types": [ - { - "label": "Source", - "type": "path" - }, - { - "label": "Destination", - "type": "path" - } - ] - } - } - ] - }, - { - "type": "splitter" - }, - { - "type": "list", - "key": "local_env_white_list", - "label": "Local overrides of environment variable keys", - "tooltip": "Environment variable keys that can be changed per machine using Local settings UI.\nKey changes are applied only on applications and tools environments.", - "use_label_wrap": true, - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "type": "collapsible-wrap", - "label": "OpenPype deployment control", - "collapsible": true, - "children": [ - { - "type": "label", - "label": "Define location accessible by artist machine to check for zip updates with Openpype code." - }, - { - "type": "path", - "key": "openpype_path", - "label": "Versions Repository", - "multiplatform": true, - "multipath": true, - "require_restart": true - }, - { - "type": "label", - "label": "Define custom location for artist machine where to unzip versions of Openpype code. By default it is in user app data folder." - }, - { - "type": "path", - "key": "local_openpype_path", - "label": "Custom Local Versions Folder", - "multiplatform": true, - "multipath": false, - "require_restart": true - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Define explicit OpenPype version that should be used. Keep empty to use latest available version." - }, - { - "type": "versions-text", - "key": "production_version", - "label": "Production version" - }, - { - "type": "versions-text", - "key": "staging_version", - "label": "Staging version" - }, - { - "type": "splitter" - }, - { - "type": "label", - "label": "Trigger validation if running OpenPype is using studio defined version each 'n' minutes. Validation happens in OpenPype tray application." - }, - { - "type": "number", - "key": "version_check_interval", - "label": "Version check interval", - "minimum": 0 - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/schema_main.json b/client/ayon_core/settings/entities/schemas/system_schema/schema_main.json deleted file mode 100644 index 31c7a991aa..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/schema_main.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "key": "system", - "type": "dict", - "children": [ - { - "type": "schema", - "name": "schema_general" - }, - { - "type": "schema", - "name": "schema_modules" - }, - { - "type": "schema", - "name": "schema_applications" - }, - { - "type": "schema", - "name": "schema_tools" - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/schema_modules.json b/client/ayon_core/settings/entities/schemas/system_schema/schema_modules.json deleted file mode 100644 index 88ef6f7515..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/schema_modules.json +++ /dev/null @@ -1,343 +0,0 @@ -{ - "key": "modules", - "type": "dict", - "label": "Modules", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "path", - "key": "addon_paths", - "label": "OpenPype AddOn Paths", - "use_label_wrap": true, - "multiplatform": true, - "multipath": true, - "require_restart": true - }, - { - "type": "separator" - }, - { - "type": "dict", - "key": "avalon", - "label": "Avalon", - "collapsible": true, - "require_restart": true, - "children": [ - { - "type": "number", - "key": "AVALON_TIMEOUT", - "minimum": 0, - "label": "Avalon Mongo Timeout (ms)", - "steps": 100 - }, - { - "type": "path", - "label": "Thumbnail Storage Location", - "key": "AVALON_THUMBNAIL_ROOT", - "multiplatform": true, - "multipath": false - } - ] - }, - { - "type": "schema", - "name": "schema_ftrack" - }, - { - "type": "schema", - "name": "schema_kitsu" - }, - { - "type": "dict", - "key": "shotgrid", - "label": "Shotgrid", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "leecher_manager_url", - "label": "Shotgrid Leecher Manager URL" - }, - { - "type": "text", - "key": "leecher_backend_url", - "label": "Shotgrid Leecher Backend URL" - }, - { - "type": "boolean", - "key": "filter_projects_by_login", - "label": "Filter projects by SG login" - }, - { - "type": "dict-modifiable", - "key": "shotgrid_settings", - "label": "Shotgrid Servers", - "object_type": { - "type": "dict", - "children": [ - { - "key": "shotgrid_url", - "label": "Server URL", - "type": "text" - }, - { - "key": "shotgrid_script_name", - "label": "Script Name", - "type": "text" - }, - { - "key": "shotgrid_script_key", - "label": "Script api key", - "type": "text" - } - ] - } - } - ] - }, - { - "type": "dict", - "key": "timers_manager", - "label": "Timers Manager", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "boolean", - "key": "auto_stop", - "label": "Auto stop timer" - }, - { - "type": "number", - "decimal": 2, - "key": "full_time", - "label": "Max idle time" - }, - { - "type": "number", - "decimal": 2, - "key": "message_time", - "label": "When dialog will show" - }, - { - "type": "boolean", - "key": "disregard_publishing", - "label": "Disregard Publishing" - } - ] - }, - { - "type": "dict", - "key": "clockify", - "label": "Clockify", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "text", - "key": "workspace_name", - "label": "Workspace name" - } - ] - }, - { - "type": "dict", - "key": "sync_server", - "label": "Site Sync", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict-modifiable", - "collapsible": true, - "key": "sites", - "label": "Sites", - "collapsible_key": false, - "object_type": - { - "type": "sync-server-providers" - } - } - ] - }, - { - "type": "dict", - "key": "deadline", - "label": "Deadline", - "require_restart": true, - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict-modifiable", - "object_type": "text", - "key": "deadline_urls", - "required_keys": ["default"], - "label": "Deadline Webservice URLs" - } - ] - }, - { - "type": "dict", - "key": "royalrender", - "label": "Royal Render", - "require_restart": true, - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "dict-modifiable", - "object_type": { - "type": "path", - "multiplatform": true - }, - "key": "rr_paths", - "required_keys": ["default"], - "label": "Royal Render Root Paths" - } - ] - }, - { - "type": "dict", - "key": "log_viewer", - "label": "Logging", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "standalonepublish_tool", - "label": "Standalone Publish", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "project_manager", - "label": "Project Manager (beta)", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "slack", - "label": "Slack Notifications", - "collapsible": true, - "require_restart": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - }, - { - "type": "dict", - "key": "job_queue", - "label": "Job Queue", - "require_restart": true, - "collapsible": true, - "children": [ - { - "type": "label", - "label": "Address of machine where job queue server is running." - }, - { - "type": "text", - "key": "server_url", - "label": "Server Rest URL" - }, - { - "type": "separator" - }, - { - "type": "label", - "label": "Jobs root is used as temporary directory for workers where source is copied and render output can be stored." - }, - { - "key": "jobs_root", - "label": "Jobs root", - "type": "path", - "multipath": false, - "multiplatform": true - } - ] - }, - { - "type": "dynamic_schema", - "name": "system_settings/modules" - }, - { - "type": "dict", - "key": "asset_reporter", - "label": "Asset Usage Reporter", - "collapsible": true, - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - } - ] - } - ] -} diff --git a/client/ayon_core/settings/entities/schemas/system_schema/schema_tools.json b/client/ayon_core/settings/entities/schemas/system_schema/schema_tools.json deleted file mode 100644 index 7962fdd465..0000000000 --- a/client/ayon_core/settings/entities/schemas/system_schema/schema_tools.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "type": "dict", - "key": "tools", - "collapsible": true, - "is_file": true, - "children": [ - { - "type": "dict-modifiable", - "label": "Tools", - "key": "tool_groups", - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "environment", - "label": "Environments", - "type": "raw-json" - }, - { - "type": "separator" - }, - { - "type": "dict-modifiable", - "key": "variants", - "collapsible_key": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "host_names", - "label": "Hosts", - "type": "hosts-enum", - "multiselection": true - }, - { - "key": "app_variants", - "label": "Applications", - "type": "apps-enum", - "multiselection": true, - "tooltip": "Applications are not \"live\" and may require to Save and refresh settings UI to update values." - }, - { - "type": "separator" - }, - { - "key": "environment", - "label": "Environments", - "type": "raw-json" - } - ] - } - } - ] - } - } - ] -} diff --git a/client/ayon_core/settings/exceptions.py b/client/ayon_core/settings/exceptions.py deleted file mode 100644 index a06138eeaf..0000000000 --- a/client/ayon_core/settings/exceptions.py +++ /dev/null @@ -1,11 +0,0 @@ -class SaveSettingsValidation(Exception): - pass - - -class SaveWarningExc(SaveSettingsValidation): - def __init__(self, warnings): - if isinstance(warnings, str): - warnings = [warnings] - self.warnings = warnings - msg = " | ".join(warnings) - super(SaveWarningExc, self).__init__(msg) diff --git a/client/ayon_core/settings/handlers.py b/client/ayon_core/settings/handlers.py deleted file mode 100644 index a3ac3e0991..0000000000 --- a/client/ayon_core/settings/handlers.py +++ /dev/null @@ -1,1863 +0,0 @@ -import os -import json -import copy -import collections -import datetime -from abc import ABCMeta, abstractmethod -import six - -import ayon_core.version -from ayon_core.client.mongo import ( - OpenPypeMongoConnection, - get_project_connection, -) -from ayon_core.client.entities import get_project -from ayon_core.lib.pype_info import get_workstation_info - - -from .constants import ( - GLOBAL_SETTINGS_KEY, - SYSTEM_SETTINGS_KEY, - PROJECT_SETTINGS_KEY, - PROJECT_ANATOMY_KEY, - LOCAL_SETTING_KEY, - M_OVERRIDDEN_KEY, - - LEGACY_SETTINGS_VERSION -) - - -class SettingsStateInfo: - """Helper state information about some settings state. - - Is used to hold information about last saved and last opened UI. Keep - information about the time when that happened and on which machine under - which user and on which openpype version. - - To create currrent machine and time information use 'create_new' method. - """ - - timestamp_format = "%Y-%m-%d %H:%M:%S.%f" - - def __init__( - self, - openpype_version, - settings_type, - project_name, - timestamp, - hostname, - hostip, - username, - system_name, - local_id - ): - self.openpype_version = openpype_version - self.settings_type = settings_type - self.project_name = project_name - - timestamp_obj = None - if timestamp: - timestamp_obj = datetime.datetime.strptime( - timestamp, self.timestamp_format - ) - self.timestamp = timestamp - self.timestamp_obj = timestamp_obj - self.hostname = hostname - self.hostip = hostip - self.username = username - self.system_name = system_name - self.local_id = local_id - - def copy(self): - return self.from_data(self.to_data()) - - @classmethod - def create_new( - cls, openpype_version, settings_type=None, project_name=None - ): - """Create information about this machine for current time.""" - - from ayon_core.lib.pype_info import get_workstation_info - - now = datetime.datetime.now() - workstation_info = get_workstation_info() - - return cls( - openpype_version, - settings_type, - project_name, - now.strftime(cls.timestamp_format), - workstation_info["hostname"], - workstation_info["hostip"], - workstation_info["username"], - workstation_info["system_name"], - workstation_info["local_id"] - ) - - @classmethod - def from_data(cls, data): - """Create object from data.""" - - return cls( - data["openpype_version"], - data["settings_type"], - data["project_name"], - data["timestamp"], - data["hostname"], - data["hostip"], - data["username"], - data["system_name"], - data["local_id"] - ) - - def to_data(self): - data = self.to_document_data() - data.update({ - "openpype_version": self.openpype_version, - "settings_type": self.settings_type, - "project_name": self.project_name - }) - return data - - @classmethod - def create_new_empty(cls, openpype_version, settings_type=None): - return cls( - openpype_version, - settings_type, - None, - None, - None, - None, - None, - None, - None - ) - - @classmethod - def from_document(cls, openpype_version, settings_type, document): - document = document or {} - project_name = document.get("project_name") - last_saved_info = document.get("last_saved_info") - if last_saved_info: - copy_last_saved_info = copy.deepcopy(last_saved_info) - copy_last_saved_info.update({ - "openpype_version": openpype_version, - "settings_type": settings_type, - "project_name": project_name, - }) - return cls.from_data(copy_last_saved_info) - return cls( - openpype_version, - settings_type, - project_name, - None, - None, - None, - None, - None, - None - ) - - def to_document_data(self): - return { - "timestamp": self.timestamp, - "hostname": self.hostname, - "hostip": self.hostip, - "username": self.username, - "system_name": self.system_name, - "local_id": self.local_id, - } - - def __eq__(self, other): - if not isinstance(other, SettingsStateInfo): - return False - - if other.timestamp_obj != self.timestamp_obj: - return False - - return ( - self.openpype_version == other.openpype_version - and self.hostname == other.hostname - and self.hostip == other.hostip - and self.username == other.username - and self.system_name == other.system_name - and self.local_id == other.local_id - ) - - -@six.add_metaclass(ABCMeta) -class SettingsHandler(object): - global_keys = { - "openpype_path", - "local_openpype_path", - "admin_password", - "log_to_server", - "disk_mapping", - "production_version", - "staging_version" - } - - @abstractmethod - def save_studio_settings(self, data): - """Save studio overrides of system settings. - - Do not use to store whole system settings data with defaults but only - it's overrides with metadata defining how overrides should be applied - in load function. For loading should be used function - `studio_system_settings`. - - Args: - data(dict): Data of studio overrides with override metadata. - """ - pass - - @abstractmethod - def save_project_settings(self, project_name, overrides): - """Save studio overrides of project settings. - - Data are saved for specific project or as defaults for all projects. - - Do not use to store whole project settings data with defaults but only - it's overrides with metadata defining how overrides should be applied - in load function. For loading should be used function - `get_studio_project_settings_overrides` for global project settings - and `get_project_settings_overrides` for project specific settings. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - pass - - @abstractmethod - def save_project_anatomy(self, project_name, anatomy_data): - """Save studio overrides of project anatomy data. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - pass - - @abstractmethod - def save_change_log(self, project_name, changes, settings_type): - """Stores changes to settings to separate logging collection. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - changes(dict): Data of project overrides with override metadata. - settings_type (str): system|project|anatomy - """ - pass - - @abstractmethod - def get_studio_system_settings_overrides(self, return_version): - """Studio overrides of system settings.""" - pass - - @abstractmethod - def get_studio_project_settings_overrides(self, return_version): - """Studio overrides of default project settings.""" - pass - - @abstractmethod - def get_studio_project_anatomy_overrides(self, return_version): - """Studio overrides of default project anatomy data.""" - pass - - @abstractmethod - def get_project_settings_overrides(self, project_name, return_version): - """Studio overrides of project settings for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - return_version(bool): Version string will be added to output. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - pass - - @abstractmethod - def get_project_anatomy_overrides(self, project_name, return_version): - """Studio overrides of project anatomy for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - return_version(bool): Version string will be added to output. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - pass - - # Getters for specific version overrides - @abstractmethod - def get_studio_system_settings_overrides_for_version(self, version): - """Studio system settings overrides for specific version. - - Args: - version(str): OpenPype version for which settings should be - returned. - - Returns: - None: If the version does not have system settings overrides. - dict: Document with overrides data. - """ - pass - - @abstractmethod - def get_studio_project_anatomy_overrides_for_version(self, version): - """Studio project anatomy overrides for specific version. - - Args: - version(str): OpenPype version for which settings should be - returned. - - Returns: - None: If the version does not have system settings overrides. - dict: Document with overrides data. - """ - pass - - @abstractmethod - def get_studio_project_settings_overrides_for_version(self, version): - """Studio project settings overrides for specific version. - - Args: - version(str): OpenPype version for which settings should be - returned. - - Returns: - None: If the version does not have system settings overrides. - dict: Document with overrides data. - """ - pass - - @abstractmethod - def get_project_settings_overrides_for_version( - self, project_name, version - ): - """Studio project settings overrides for specific project and version. - - Args: - project_name(str): Name of project for which the overrides should - be loaded. - version(str): OpenPype version for which settings should be - returned. - - Returns: - None: If the version does not have system settings overrides. - dict: Document with overrides data. - """ - pass - - @abstractmethod - def get_global_settings(self): - """Studio global settings available across versions. - - Output must contain all keys from 'global_keys'. If value is not set - the output value should be 'None'. - - Returns: - Dict[str, Any]: Global settings same across versions. - """ - - pass - - # Clear methods - per version - # - clearing may be helpfull when a version settings were created for - # testing purposes - @abstractmethod - def clear_studio_system_settings_overrides_for_version(self, version): - """Remove studio system settings overrides for specific version. - - If version is not available then skip processing. - """ - pass - - @abstractmethod - def clear_studio_project_settings_overrides_for_version(self, version): - """Remove studio project settings overrides for specific version. - - If version is not available then skip processing. - """ - pass - - @abstractmethod - def clear_studio_project_anatomy_overrides_for_version(self, version): - """Remove studio project anatomy overrides for specific version. - - If version is not available then skip processing. - """ - pass - - @abstractmethod - def clear_project_settings_overrides_for_version( - self, version, project_name - ): - """Remove studio project settings overrides for project and version. - - If version is not available then skip processing. - """ - pass - - # Get versions that are available for each type of settings - @abstractmethod - def get_available_studio_system_settings_overrides_versions( - self, sorted=None - ): - """OpenPype versions that have any studio system settings overrides. - - Returns: - list: OpenPype versions strings. - """ - pass - - @abstractmethod - def get_available_studio_project_anatomy_overrides_versions( - self, sorted=None - ): - """OpenPype versions that have any studio project anatomy overrides. - - Returns: - List[str]: OpenPype versions strings. - """ - pass - - @abstractmethod - def get_available_studio_project_settings_overrides_versions( - self, sorted=None - ): - """OpenPype versions that have any studio project settings overrides. - - Returns: - List[str]: OpenPype versions strings. - """ - pass - - @abstractmethod - def get_available_project_settings_overrides_versions( - self, project_name, sorted=None - ): - """OpenPype versions that have any project settings overrides. - - Args: - project_name(str): Name of project. - - Returns: - List[str]: OpenPype versions strings. - """ - - pass - - @abstractmethod - def get_system_last_saved_info(self): - """State of last system settings overrides at the moment when called. - - This method must provide most recent data so using cached data is not - the way. - - Returns: - SettingsStateInfo: Information about system settings overrides. - """ - - pass - - @abstractmethod - def get_project_last_saved_info(self, project_name): - """State of last project settings overrides at the moment when called. - - This method must provide most recent data so using cached data is not - the way. - - Args: - project_name (Union[None, str]): Project name for which state - should be returned. - - Returns: - SettingsStateInfo: Information about project settings overrides. - """ - - pass - - # UI related calls - @abstractmethod - def get_last_opened_info(self): - """Get information about last opened UI. - - Last opened UI is empty if there is noone who would have opened UI at - the moment when called. - - Returns: - Union[None, SettingsStateInfo]: Information about machine who had - opened Settings UI. - """ - - pass - - @abstractmethod - def opened_settings_ui(self): - """Callback called when settings UI is opened. - - Information about this machine must be available when - 'get_last_opened_info' is called from anywhere until - 'closed_settings_ui' is called again. - - Returns: - SettingsStateInfo: Object representing information about this - machine. Must be passed to 'closed_settings_ui' when finished. - """ - - pass - - @abstractmethod - def closed_settings_ui(self, info_obj): - """Callback called when settings UI is closed. - - From the moment this method is called the information about this - machine is removed and no more available when 'get_last_opened_info' - is called. - - Callback should validate if this machine is still stored as opened ui - before changing any value. - - Args: - info_obj (SettingsStateInfo): Object created when - 'opened_settings_ui' was called. - """ - - pass - - -@six.add_metaclass(ABCMeta) -class LocalSettingsHandler: - """Handler that should handle about storing and loading of local settings. - - Local settings are "workstation" specific modifications that modify how - system and project settings look on the workstation and only there. - """ - @abstractmethod - def save_local_settings(self, data): - """Save local data of local settings. - - Args: - data(dict): Data of local data with override metadata. - """ - pass - - @abstractmethod - def get_local_settings(self): - """Studio overrides of system settings.""" - pass - - -class CacheValues: - cache_lifetime = 10 - - def __init__(self): - self.data = None - self.creation_time = None - self.version = None - self.last_saved_info = None - - def data_copy(self): - if not self.data: - return {} - return copy.deepcopy(self.data) - - def update_data(self, data, version): - self.data = data - self.creation_time = datetime.datetime.now() - self.version = version - - def update_last_saved_info(self, last_saved_info): - self.last_saved_info = last_saved_info - - def update_from_document(self, document, version): - data = {} - if document: - if "data" in document: - data = document["data"] - elif "value" in document: - value = document["value"] - if value: - data = json.loads(value) - - self.data = data - self.version = version - - def to_json_string(self): - return json.dumps(self.data or {}) - - @property - def is_outdated(self): - if self.creation_time is None: - return True - delta = (datetime.datetime.now() - self.creation_time).seconds - return delta > self.cache_lifetime - - def set_outdated(self): - self.create_time = None - - -class MongoSettingsHandler(SettingsHandler): - """Settings handler that use mongo for storing and loading of settings.""" - key_suffix = "_versioned" - _version_order_key = "versions_order" - _all_versions_keys = "all_versions" - - def __init__(self): - # Get mongo connection - settings_collection = OpenPypeMongoConnection.get_mongo_client() - - self._anatomy_keys = None - self._attribute_keys = None - - self._version_order_checked = False - - self._system_settings_key = SYSTEM_SETTINGS_KEY + self.key_suffix - self._project_settings_key = PROJECT_SETTINGS_KEY + self.key_suffix - self._project_anatomy_key = PROJECT_ANATOMY_KEY + self.key_suffix - self._current_version = ayon_core.version.__version__ - - database_name = os.environ["OPENPYPE_DATABASE_NAME"] - # TODO modify to not use hardcoded keys - collection_name = "settings" - - self.settings_collection = settings_collection - - self.database_name = database_name - self.collection_name = collection_name - - self.collection = settings_collection[database_name][collection_name] - - self.global_settings_cache = CacheValues() - self.system_settings_cache = CacheValues() - self.project_settings_cache = collections.defaultdict(CacheValues) - self.project_anatomy_cache = collections.defaultdict(CacheValues) - - def _prepare_project_settings_keys(self): - from .entities import ProjectSettings - # Prepare anatomy keys and attribute keys - # NOTE this is cached on first import - # - keys may change only on schema change which should not happen - # during production - project_settings_root = ProjectSettings( - reset=False, change_state=False - ) - anatomy_entity = project_settings_root["project_anatomy"] - anatomy_keys = set(anatomy_entity.keys()) - anatomy_keys.remove("attributes") - attribute_keys = set(anatomy_entity["attributes"].keys()) - - self._anatomy_keys = anatomy_keys - self._attribute_keys = attribute_keys - - @property - def anatomy_keys(self): - if self._anatomy_keys is None: - self._prepare_project_settings_keys() - return self._anatomy_keys - - @property - def attribute_keys(self): - if self._attribute_keys is None: - self._prepare_project_settings_keys() - return self._attribute_keys - - def get_global_settings_doc(self): - if self.global_settings_cache.is_outdated: - global_settings_doc = self.collection.find_one({ - "type": GLOBAL_SETTINGS_KEY - }) or {} - self.global_settings_cache.update_data(global_settings_doc, None) - return self.global_settings_cache.data_copy() - - def get_global_settings(self): - global_settings_doc = self.get_global_settings_doc() - global_settings = global_settings_doc.get("data", {}) - return { - key: global_settings[key] - for key in self.global_keys - if key in global_settings - } - - def _extract_global_settings(self, data): - """Extract global settings data from system settings overrides. - - This is now limited to "general" key in system settings which must be - set as group in schemas. - - Returns: - dict: Global settings extracted from system settings data. - """ - output = {} - if "general" not in data: - return output - - general_data = data["general"] - - # Add predefined keys to global settings if are set - for key in self.global_keys: - if key not in general_data: - continue - # Pop key from values - output[key] = general_data.pop(key) - # Pop key from overridden metadata - if ( - M_OVERRIDDEN_KEY in general_data - and key in general_data[M_OVERRIDDEN_KEY] - ): - general_data[M_OVERRIDDEN_KEY].remove(key) - return output - - def _apply_global_settings( - self, system_settings_document, globals_document - ): - """Apply global settings data to system settings. - - Applification is skipped if document with global settings is not - available or does not have set data in. - - System settings document is "faked" like it exists if global document - has set values. - - Args: - system_settings_document (dict): System settings document from - MongoDB. - globals_document (dict): Global settings document from MongoDB. - - Returns: - Merged document which has applied global settings data. - """ - # Skip if globals document is not available - if ( - not globals_document - or "data" not in globals_document - or not globals_document["data"] - ): - return system_settings_document - - globals_data = globals_document["data"] - # Check if data contain any key from predefined keys - any_key_found = False - if globals_data: - for key in self.global_keys: - if key in globals_data: - any_key_found = True - break - - # Skip if any key from predefined key was not found in globals - if not any_key_found: - return system_settings_document - - # "Fake" system settings document if document does not exist - # - global settings document may exist but system settings not yet - if not system_settings_document: - system_settings_document = {} - - if "data" in system_settings_document: - system_settings_data = system_settings_document["data"] - else: - system_settings_data = {} - system_settings_document["data"] = system_settings_data - - if "general" in system_settings_data: - system_general = system_settings_data["general"] - else: - system_general = {} - system_settings_data["general"] = system_general - - overridden_keys = system_general.get(M_OVERRIDDEN_KEY) or [] - for key in self.global_keys: - if key not in globals_data: - continue - - system_general[key] = globals_data[key] - if key not in overridden_keys: - overridden_keys.append(key) - - if overridden_keys: - system_general[M_OVERRIDDEN_KEY] = overridden_keys - - return system_settings_document - - def save_studio_settings(self, data): - """Save studio overrides of system settings. - - Do not use to store whole system settings data with defaults but only - it's overrides with metadata defining how overrides should be applied - in load function. For loading should be used function - `studio_system_settings`. - - Args: - data(dict): Data of studio overrides with override metadata. - """ - # Update cache - self.system_settings_cache.update_data(data, self._current_version) - - last_saved_info = SettingsStateInfo.create_new( - self._current_version, - SYSTEM_SETTINGS_KEY - ) - self.system_settings_cache.update_last_saved_info( - last_saved_info - ) - - # Get copy of just updated cache - system_settings_data = self.system_settings_cache.data_copy() - - # Extract global settings from system settings - global_settings = self._extract_global_settings( - system_settings_data - ) - self.global_settings_cache.update_data( - global_settings, - None - ) - - system_settings_doc = self.collection.find_one( - { - "type": self._system_settings_key, - "version": self._current_version - }, - {"_id": True} - ) - - # Store system settings - new_system_settings_doc = { - "type": self._system_settings_key, - "version": self._current_version, - "data": system_settings_data, - "last_saved_info": last_saved_info.to_document_data() - } - if not system_settings_doc: - self.collection.insert_one(new_system_settings_doc) - else: - self.collection.update_one( - {"_id": system_settings_doc["_id"]}, - {"$set": new_system_settings_doc} - ) - - # Store global settings - self.collection.replace_one( - { - "type": GLOBAL_SETTINGS_KEY - }, - { - "type": GLOBAL_SETTINGS_KEY, - "data": global_settings - }, - upsert=True - ) - - def save_project_settings(self, project_name, overrides): - """Save studio overrides of project settings. - - Data are saved for specific project or as defaults for all projects. - - Do not use to store whole project settings data with defaults but only - it's overrides with metadata defining how overrides should be applied - in load function. For loading should be used function - `get_studio_project_settings_overrides` for global project settings - and `get_project_settings_overrides` for project specific settings. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - data_cache = self.project_settings_cache[project_name] - data_cache.update_data(overrides, self._current_version) - - last_saved_info = SettingsStateInfo.create_new( - self._current_version, - PROJECT_SETTINGS_KEY, - project_name - ) - - data_cache.update_last_saved_info(last_saved_info) - - self._save_project_data( - project_name, - self._project_settings_key, - data_cache, - last_saved_info - ) - - def save_project_anatomy(self, project_name, anatomy_data): - """Save studio overrides of project anatomy data. - - Args: - project_name(str, null): Project name for which overrides are - or None for global settings. - data(dict): Data of project overrides with override metadata. - """ - data_cache = self.project_anatomy_cache[project_name] - data_cache.update_data(anatomy_data, self._current_version) - - if project_name is not None: - self._save_project_anatomy_data(project_name, data_cache) - - else: - last_saved_info = SettingsStateInfo.create_new( - self._current_version, - PROJECT_ANATOMY_KEY, - project_name - ) - self._save_project_data( - project_name, - self._project_anatomy_key, - data_cache, - last_saved_info - ) - - @classmethod - def prepare_mongo_update_dict(cls, in_data): - data = {} - for key, value in in_data.items(): - if not isinstance(value, dict): - data[key] = value - continue - - new_value = cls.prepare_mongo_update_dict(value) - for _key, _value in new_value.items(): - new_key = ".".join((key, _key)) - data[new_key] = _value - - return data - - def save_change_log(self, project_name, changes, settings_type): - """Log all settings changes to separate collection""" - if not changes: - return - - if settings_type == "project" and not project_name: - project_name = "default" - - host_info = get_workstation_info() - - document = { - "local_id": host_info["local_id"], - "username": host_info["username"], - "hostname": host_info["hostname"], - "hostip": host_info["hostip"], - "system_name": host_info["system_name"], - "date_created": datetime.datetime.now(), - "project": project_name, - "settings_type": settings_type, - "changes": changes - } - collection_name = "settings_log" - collection = (self.settings_collection[self.database_name] - [collection_name]) - collection.insert_one(document) - - def _save_project_anatomy_data(self, project_name, data_cache): - # Create copy of data as they will be modified during save - new_data = data_cache.data_copy() - - # Prepare avalon project document - project_doc = get_project(project_name) - if not project_doc: - raise ValueError(( - "Project document of project \"{}\" does not exists." - " Create project first." - ).format(project_name)) - - collection = get_project_connection(project_name) - # Project's data - update_dict_data = {} - project_doc_data = project_doc.get("data") or {} - attributes = new_data.pop("attributes") - _applications = attributes.pop("applications", None) or [] - for key, value in attributes.items(): - if ( - key in project_doc_data - and project_doc_data[key] == value - ): - continue - update_dict_data[key] = value - - update_dict_config = {} - - applications = [] - for application in _applications: - if not application: - continue - if isinstance(application, six.string_types): - applications.append({"name": application}) - - new_data["apps"] = applications - - for key, value in new_data.items(): - project_doc_value = project_doc.get(key) - if key in project_doc and project_doc_value == value: - continue - update_dict_config[key] = value - - if not update_dict_data and not update_dict_config: - return - - data_changes = self.prepare_mongo_update_dict(update_dict_data) - - # Update dictionary of changes that will be changed in mongo - update_dict = {} - for key, value in data_changes.items(): - new_key = "data.{}".format(key) - update_dict[new_key] = value - - for key, value in update_dict_config.items(): - new_key = "config.{}".format(key) - update_dict[new_key] = value - - collection.update_one( - {"type": "project"}, - {"$set": update_dict} - ) - - def _save_project_data( - self, project_name, doc_type, data_cache, last_saved_info - ): - is_default = bool(project_name is None) - query_filter = { - "type": doc_type, - "is_default": is_default, - "version": self._current_version - } - - new_project_settings_doc = { - "type": doc_type, - "data": data_cache.data, - "is_default": is_default, - "version": self._current_version, - "last_saved_info": last_saved_info.to_data() - } - - if not is_default: - query_filter["project_name"] = project_name - new_project_settings_doc["project_name"] = project_name - - project_settings_doc = self.collection.find_one( - query_filter, - {"_id": True} - ) - if project_settings_doc: - self.collection.update_one( - {"_id": project_settings_doc["_id"]}, - {"$set": new_project_settings_doc} - ) - else: - self.collection.insert_one(new_project_settings_doc) - - def _get_versions_order_doc(self, projection=None): - # TODO cache - return self.collection.find_one( - {"type": self._version_order_key}, - projection - ) or {} - - def _check_version_order(self): - """This method will work only in OpenPype process. - - Will create/update mongo document where OpenPype versions are stored - in semantic version order. - - This document can be then used to find closes version of settings in - processes where 'OpenPypeVersion' is not available. - """ - # Do this step only once - if self._version_order_checked: - return - self._version_order_checked = True - - from ayon_core.lib.openpype_version import get_OpenPypeVersion - - OpenPypeVersion = get_OpenPypeVersion() - # Skip if 'OpenPypeVersion' is not available - if OpenPypeVersion is None: - return - - # Query document holding sorted list of version strings - doc = self._get_versions_order_doc() - if not doc: - doc = {"type": self._version_order_key} - - if self._all_versions_keys not in doc: - doc[self._all_versions_keys] = [] - - # Skip if current version is already available - if self._current_version in doc[self._all_versions_keys]: - return - - if self._current_version not in doc[self._all_versions_keys]: - # Add all versions into list - all_objected_versions = [ - OpenPypeVersion(version=self._current_version) - ] - for version_str in doc[self._all_versions_keys]: - all_objected_versions.append( - OpenPypeVersion(version=version_str) - ) - - doc[self._all_versions_keys] = [ - str(version) for version in sorted(all_objected_versions) - ] - - self.collection.replace_one( - {"type": self._version_order_key}, - doc, - upsert=True - ) - - def find_closest_version_for_projects(self, project_names): - output = { - project_name: None - for project_name in project_names - } - from ayon_core.lib.openpype_version import get_OpenPypeVersion - OpenPypeVersion = get_OpenPypeVersion() - if OpenPypeVersion is None: - return output - - versioned_doc = self._get_versions_order_doc() - - settings_ids = [] - for project_name in project_names: - if project_name is None: - doc_filter = {"is_default": True} - else: - doc_filter = {"project_name": project_name} - settings_id = self._find_closest_settings_id( - self._project_settings_key, - PROJECT_SETTINGS_KEY, - doc_filter, - versioned_doc - ) - if settings_id: - settings_ids.append(settings_id) - - if settings_ids: - docs = self.collection.find( - {"_id": {"$in": settings_ids}}, - {"version": True, "project_name": True} - ) - for doc in docs: - project_name = doc.get("project_name") - version = doc.get("version", LEGACY_SETTINGS_VERSION) - output[project_name] = version - return output - - def _find_closest_settings_id( - self, key, legacy_key, additional_filters=None, versioned_doc=None - ): - """Try to find closes available versioned settings for settings key. - - This method should be used only if settings for current OpenPype - version are not available. - - Args: - key(str): Settings key under which are settings stored ("type"). - legacy_key(str): Settings key under which were stored not versioned - settings. - additional_filters(dict): Additional filters of document. Used - for project specific settings. - """ - # Trigger check of versions - self._check_version_order() - - doc_filters = { - "type": {"$in": [key, legacy_key]} - } - if additional_filters: - doc_filters.update(additional_filters) - - # Query base data of each settings doc - other_versions = self.collection.find( - doc_filters, - { - "_id": True, - "version": True, - "type": True - } - ) - # Query doc with list of sorted versions - if versioned_doc is None: - versioned_doc = self._get_versions_order_doc() - - # Separate queried docs - legacy_settings_doc = None - versioned_settings_by_version = {} - for doc in other_versions: - if doc["type"] == legacy_key: - legacy_settings_doc = doc - elif doc["type"] == key: - if doc["version"] == self._current_version: - return doc["_id"] - versioned_settings_by_version[doc["version"]] = doc - - versions_in_doc = versioned_doc.get(self._all_versions_keys) or [] - # Cases when only legacy settings can be used - if ( - # There are not versioned documents yet - not versioned_settings_by_version - # Versioned document is not available at all - # - this can happen only if old build of OpenPype was used - or not versioned_doc - # Current OpenPype version is not available - # - something went really wrong when this happens - or self._current_version not in versions_in_doc - ): - if not legacy_settings_doc: - return None - return legacy_settings_doc["_id"] - - # Separate versions to lower and higher and keep their order - lower_versions = [] - higher_versions = [] - before = True - for version_str in versions_in_doc: - if version_str == self._current_version: - before = False - elif before: - lower_versions.append(version_str) - else: - higher_versions.append(version_str) - - # Use legacy settings doc as source document - src_doc_id = None - if legacy_settings_doc: - src_doc_id = legacy_settings_doc["_id"] - - # Find highest version which has available settings - if lower_versions: - for version_str in reversed(lower_versions): - doc = versioned_settings_by_version.get(version_str) - if doc: - src_doc_id = doc["_id"] - break - - # Use versions with higher version only if there are not legacy - # settings and there are not any versions before - if src_doc_id is None and higher_versions: - for version_str in higher_versions: - doc = versioned_settings_by_version.get(version_str) - if doc: - src_doc_id = doc["_id"] - break - - return src_doc_id - - def _find_closest_settings( - self, key, legacy_key, additional_filters=None, versioned_doc=None - ): - doc_id = self._find_closest_settings_id( - key, legacy_key, additional_filters, versioned_doc - ) - if doc_id is None: - return None - return self.collection.find_one({"_id": doc_id}) - - def _find_closest_system_settings(self): - return self._find_closest_settings( - self._system_settings_key, - SYSTEM_SETTINGS_KEY - ) - - def _find_closest_project_settings(self, project_name): - if project_name is None: - additional_filters = {"is_default": True} - else: - additional_filters = {"project_name": project_name} - - return self._find_closest_settings( - self._project_settings_key, - PROJECT_SETTINGS_KEY, - additional_filters - ) - - def _find_closest_project_anatomy(self): - additional_filters = {"is_default": True} - return self._find_closest_settings( - self._project_anatomy_key, - PROJECT_ANATOMY_KEY, - additional_filters - ) - - def _get_studio_system_settings_overrides_for_version(self, version=None): - # QUESTION cache? - if version == LEGACY_SETTINGS_VERSION: - return self.collection.find_one({ - "type": SYSTEM_SETTINGS_KEY - }) - - if version is None: - version = self._current_version - - return self.collection.find_one({ - "type": self._system_settings_key, - "version": version - }) - - def _get_project_settings_overrides_for_version( - self, project_name, version=None - ): - # QUESTION cache? - if version == LEGACY_SETTINGS_VERSION: - document_filter = { - "type": PROJECT_SETTINGS_KEY - } - - else: - if version is None: - version = self._current_version - - document_filter = { - "type": self._project_settings_key, - "version": version - } - - if project_name is None: - document_filter["is_default"] = True - else: - document_filter["project_name"] = project_name - return self.collection.find_one(document_filter) - - def _get_project_anatomy_overrides_for_version(self, version=None): - # QUESTION cache? - if version == LEGACY_SETTINGS_VERSION: - return self.collection.find_one({ - "type": PROJECT_ANATOMY_KEY, - "is_default": True - }) - - if version is None: - version = self._current_version - - return self.collection.find_one({ - "type": self._project_anatomy_key, - "is_default": True, - "version": version - }) - - def get_studio_system_settings_overrides(self, return_version): - """Studio overrides of system settings.""" - if self.system_settings_cache.is_outdated: - globals_document = self.get_global_settings_doc() - document, version = self._get_system_settings_overrides_doc() - - last_saved_info = SettingsStateInfo.from_document( - version, SYSTEM_SETTINGS_KEY, document - ) - merged_document = self._apply_global_settings( - document, globals_document - ) - - self.system_settings_cache.update_from_document( - merged_document, version - ) - self.system_settings_cache.update_last_saved_info( - last_saved_info - ) - - cache = self.system_settings_cache - data = cache.data_copy() - if return_version: - return data, cache.version - return data - - def _get_system_settings_overrides_doc(self): - document = ( - self._get_studio_system_settings_overrides_for_version() - ) - if document is None: - document = self._find_closest_system_settings() - - version = None - if document: - if document["type"] == self._system_settings_key: - version = document["version"] - else: - version = LEGACY_SETTINGS_VERSION - - return document, version - - def get_system_last_saved_info(self): - # Make sure settings are recaches - self.system_settings_cache.set_outdated() - self.get_studio_system_settings_overrides(False) - - return self.system_settings_cache.last_saved_info.copy() - - def _get_project_settings_overrides(self, project_name, return_version): - if self.project_settings_cache[project_name].is_outdated: - document, version = self._get_project_settings_overrides_doc( - project_name - ) - self.project_settings_cache[project_name].update_from_document( - document, version - ) - last_saved_info = SettingsStateInfo.from_document( - version, PROJECT_SETTINGS_KEY, document - ) - self.project_settings_cache[project_name].update_last_saved_info( - last_saved_info - ) - - cache = self.project_settings_cache[project_name] - data = cache.data_copy() - if return_version: - return data, cache.version - return data - - def _get_project_settings_overrides_doc(self, project_name): - document = self._get_project_settings_overrides_for_version( - project_name - ) - if document is None: - document = self._find_closest_project_settings(project_name) - - version = None - if document: - if document["type"] == self._project_settings_key: - version = document["version"] - else: - version = LEGACY_SETTINGS_VERSION - - return document, version - - def get_project_last_saved_info(self, project_name): - # Make sure settings are recaches - self.project_settings_cache[project_name].set_outdated() - self._get_project_settings_overrides(project_name, False) - - return self.project_settings_cache[project_name].last_saved_info.copy() - - def get_studio_project_settings_overrides(self, return_version): - """Studio overrides of default project settings.""" - return self._get_project_settings_overrides(None, return_version) - - def get_project_settings_overrides(self, project_name, return_version): - """Studio overrides of project settings for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - if not project_name: - if return_version: - return {}, None - return {} - return self._get_project_settings_overrides( - project_name, return_version - ) - - def project_doc_to_anatomy_data(self, project_doc): - """Convert project document to anatomy data. - - Probably should fill missing keys and values. - """ - if not project_doc: - return {} - - attributes = {} - project_doc_data = project_doc.get("data") or {} - for key in self.attribute_keys: - value = project_doc_data.get(key) - if value is not None: - attributes[key] = value - - project_doc_config = project_doc.get("config") or {} - - app_names = set() - if not project_doc_config or "apps" not in project_doc_config: - set_applications = False - else: - set_applications = True - for app_item in project_doc_config["apps"]: - if not app_item: - continue - app_name = app_item.get("name") - if app_name: - app_names.add(app_name) - - if set_applications: - attributes["applications"] = list(app_names) - - output = {"attributes": attributes} - for key in self.anatomy_keys: - value = project_doc_config.get(key) - if value is not None: - output[key] = value - - return output - - def _get_project_anatomy_overrides(self, project_name, return_version): - if self.project_anatomy_cache[project_name].is_outdated: - if project_name is None: - document = self._get_project_anatomy_overrides_for_version() - if document is None: - document = self._find_closest_project_anatomy() - - version = None - if document: - if document["type"] == self._project_anatomy_key: - version = document["version"] - else: - version = LEGACY_SETTINGS_VERSION - self.project_anatomy_cache[project_name].update_from_document( - document, version - ) - - else: - project_doc = get_project(project_name) - self.project_anatomy_cache[project_name].update_data( - self.project_doc_to_anatomy_data(project_doc), - self._current_version - ) - - cache = self.project_anatomy_cache[project_name] - data = cache.data_copy() - if return_version: - return data, cache.version - return data - - def get_studio_project_anatomy_overrides(self, return_version): - """Studio overrides of default project anatomy data.""" - return self._get_project_anatomy_overrides(None, return_version) - - def get_project_anatomy_overrides(self, project_name): - """Studio overrides of project anatomy for specific project. - - Args: - project_name(str): Name of project for which data should be loaded. - - Returns: - dict: Only overrides for entered project, may be empty dictionary. - """ - if not project_name: - return {} - return self._get_project_anatomy_overrides(project_name, False) - - # Implementations of abstract methods to get overrides for version - def get_studio_system_settings_overrides_for_version(self, version): - doc = self._get_studio_system_settings_overrides_for_version(version) - if not doc: - return doc - return doc["data"] - - def get_studio_project_anatomy_overrides_for_version(self, version): - doc = self._get_project_anatomy_overrides_for_version(version) - if not doc: - return doc - return doc["data"] - - def get_studio_project_settings_overrides_for_version(self, version): - doc = self._get_project_settings_overrides_for_version(None, version) - if not doc: - return doc - return doc["data"] - - def get_project_settings_overrides_for_version( - self, project_name, version - ): - doc = self._get_project_settings_overrides_for_version( - project_name, version - ) - if not doc: - return doc - return doc["data"] - - # Implementations of abstract methods to clear overrides for version - def clear_studio_system_settings_overrides_for_version(self, version): - self.collection.delete_one({ - "type": self._system_settings_key, - "version": version - }) - - def clear_studio_project_settings_overrides_for_version(self, version): - self.collection.delete_one({ - "type": self._project_settings_key, - "version": version, - "is_default": True - }) - - def clear_studio_project_anatomy_overrides_for_version(self, version): - self.collection.delete_one({ - "type": self._project_anatomy_key, - "version": version - }) - - def clear_project_settings_overrides_for_version( - self, version, project_name - ): - self.collection.delete_one({ - "type": self._project_settings_key, - "version": version, - "project_name": project_name - }) - - def _sort_versions(self, versions): - """Sort versions. - - WARNING: - This method does not handle all possible issues so it should not be - used in logic which determine which settings are used. Is used for - sorting of available versions. - """ - if not versions: - return [] - - set_versions = set(versions) - contain_legacy = LEGACY_SETTINGS_VERSION in set_versions - if contain_legacy: - set_versions.remove(LEGACY_SETTINGS_VERSION) - - from ayon_core.lib.openpype_version import get_OpenPypeVersion - - OpenPypeVersion = get_OpenPypeVersion() - - # Skip if 'OpenPypeVersion' is not available - if OpenPypeVersion is not None: - obj_versions = sorted( - [OpenPypeVersion(version=version) for version in set_versions] - ) - sorted_versions = [str(version) for version in obj_versions] - if contain_legacy: - sorted_versions.insert(0, LEGACY_SETTINGS_VERSION) - return sorted_versions - - doc = self._get_versions_order_doc() - all_versions = doc.get(self._all_versions_keys) - if not all_versions: - return list(sorted(versions)) - - sorted_versions = [] - for version in all_versions: - if version in set_versions: - set_versions.remove(version) - sorted_versions.append(version) - - for version in sorted(set_versions): - sorted_versions.insert(0, version) - - if contain_legacy: - sorted_versions.insert(0, LEGACY_SETTINGS_VERSION) - return sorted_versions - - # Get available versions for settings type - def get_available_studio_system_settings_overrides_versions( - self, sorted=None - ): - docs = self.collection.find( - {"type": { - "$in": [self._system_settings_key, SYSTEM_SETTINGS_KEY] - }}, - {"type": True, "version": True} - ) - output = set() - for doc in docs: - if doc["type"] == self._system_settings_key: - output.add(doc["version"]) - else: - output.add(LEGACY_SETTINGS_VERSION) - if not sorted: - return output - return self._sort_versions(output) - - def get_available_studio_project_anatomy_overrides_versions( - self, sorted=None - ): - docs = self.collection.find( - {"type": { - "$in": [self._project_anatomy_key, PROJECT_ANATOMY_KEY] - }}, - {"type": True, "version": True} - ) - output = set() - for doc in docs: - if doc["type"] == self._project_anatomy_key: - output.add(doc["version"]) - else: - output.add(LEGACY_SETTINGS_VERSION) - if not sorted: - return output - return self._sort_versions(output) - - def get_available_studio_project_settings_overrides_versions( - self, sorted=None - ): - docs = self.collection.find( - { - "is_default": True, - "type": { - "$in": [self._project_settings_key, PROJECT_SETTINGS_KEY] - } - }, - {"type": True, "version": True} - ) - output = set() - for doc in docs: - if doc["type"] == self._project_settings_key: - output.add(doc["version"]) - else: - output.add(LEGACY_SETTINGS_VERSION) - if not sorted: - return output - return self._sort_versions(output) - - def get_available_project_settings_overrides_versions( - self, project_name, sorted=None - ): - docs = self.collection.find( - { - "project_name": project_name, - "type": { - "$in": [self._project_settings_key, PROJECT_SETTINGS_KEY] - } - }, - {"type": True, "version": True} - ) - output = set() - for doc in docs: - if doc["type"] == self._project_settings_key: - output.add(doc["version"]) - else: - output.add(LEGACY_SETTINGS_VERSION) - if not sorted: - return output - return self._sort_versions(output) - - def get_last_opened_info(self): - doc = self.collection.find_one({ - "type": "last_opened_settings_ui", - "version": self._current_version - }) or {} - info_data = doc.get("info") - if not info_data: - return None - - # Fill not available information - info_data["openpype_version"] = self._current_version - info_data["settings_type"] = None - info_data["project_name"] = None - return SettingsStateInfo.from_data(info_data) - - def opened_settings_ui(self): - doc_filter = { - "type": "last_opened_settings_ui", - "version": self._current_version - } - - opened_info = SettingsStateInfo.create_new(self._current_version) - new_doc_data = copy.deepcopy(doc_filter) - new_doc_data["info"] = opened_info.to_document_data() - - doc = self.collection.find_one( - doc_filter, - {"_id": True} - ) - if doc: - self.collection.update_one( - {"_id": doc["_id"]}, - {"$set": new_doc_data} - ) - else: - self.collection.insert_one(new_doc_data) - return opened_info - - def closed_settings_ui(self, info_obj): - doc_filter = { - "type": "last_opened_settings_ui", - "version": self._current_version - } - doc = self.collection.find_one(doc_filter) or {} - info_data = doc.get("info") - if not info_data: - return - - info_data["openpype_version"] = self._current_version - info_data["settings_type"] = None - info_data["project_name"] = None - current_info = SettingsStateInfo.from_data(info_data) - if current_info == info_obj: - self.collection.update_one( - {"_id": doc["_id"]}, - {"$set": {"info": None}} - ) - - -class MongoLocalSettingsHandler(LocalSettingsHandler): - """Settings handler that use mongo for store and load local settings. - - Data have 2 query criteria. First is key "type" stored in constant - `LOCAL_SETTING_KEY`. Second is key "site_id" which value can be obstained - with `get_local_site_id` function. - """ - - def __init__(self, local_site_id=None): - # Get mongo connection - from ayon_core.lib import get_local_site_id - - if local_site_id is None: - local_site_id = get_local_site_id() - settings_collection = OpenPypeMongoConnection.get_mongo_client() - - # TODO prepare version of pype - # - pype version should define how are settings saved and loaded - - database_name = os.environ["OPENPYPE_DATABASE_NAME"] - # TODO modify to not use hardcoded keys - collection_name = "settings" - - self.settings_collection = settings_collection - - self.database_name = database_name - self.collection_name = collection_name - - self.collection = settings_collection[database_name][collection_name] - - self.local_site_id = local_site_id - - self.local_settings_cache = CacheValues() - - def save_local_settings(self, data): - """Save local settings. - - Args: - data(dict): Data of studio overrides with override metadata. - """ - data = data or {} - - self.local_settings_cache.update_data(data, None) - - self.collection.replace_one( - { - "type": LOCAL_SETTING_KEY, - "site_id": self.local_site_id - }, - { - "type": LOCAL_SETTING_KEY, - "site_id": self.local_site_id, - "data": self.local_settings_cache.data - }, - upsert=True - ) - - def get_local_settings(self): - """Local settings for local site id.""" - if self.local_settings_cache.is_outdated: - document = self.collection.find_one({ - "type": LOCAL_SETTING_KEY, - "site_id": self.local_site_id - }) - - self.local_settings_cache.update_from_document(document, None) - - return self.local_settings_cache.data_copy() diff --git a/client/ayon_core/settings/lib.py b/client/ayon_core/settings/lib.py index 8f85e5fbee..beae376b7c 100644 --- a/client/ayon_core/settings/lib.py +++ b/client/ayon_core/settings/lib.py @@ -1,15 +1,8 @@ import os import json -import functools import logging -import platform import copy -from ayon_core import AYON_SERVER_ENABLED - -from .exceptions import ( - SaveWarningExc -) from .constants import ( M_OVERRIDDEN_KEY, @@ -17,7 +10,6 @@ from .constants import ( SYSTEM_SETTINGS_KEY, PROJECT_SETTINGS_KEY, - PROJECT_ANATOMY_KEY, DEFAULT_PROJECT_KEY ) @@ -41,12 +33,6 @@ DEFAULTS_DIR = os.path.join( # Variable where cache of default settings are stored _DEFAULT_SETTINGS = None -# Handler of studio overrides -_SETTINGS_HANDLER = None - -# Handler of local settings -_LOCAL_SETTINGS_HANDLER = None - def clear_metadata_from_settings(values): """Remove all metadata keys from loaded settings.""" @@ -61,471 +47,7 @@ def clear_metadata_from_settings(values): clear_metadata_from_settings(item) -def calculate_changes(old_value, new_value): - changes = {} - for key, value in new_value.items(): - if key not in old_value: - changes[key] = value - continue - - _value = old_value[key] - if isinstance(value, dict) and isinstance(_value, dict): - _changes = calculate_changes(_value, value) - if _changes: - changes[key] = _changes - continue - - if _value != value: - changes[key] = value - return changes - - -def create_settings_handler(): - if AYON_SERVER_ENABLED: - raise RuntimeError("Mongo settings handler was triggered in AYON mode") - from .handlers import MongoSettingsHandler - # Handler can't be created in global space on initialization but only when - # needed. Plus here may be logic: Which handler is used (in future). - return MongoSettingsHandler() - - -def create_local_settings_handler(): - if AYON_SERVER_ENABLED: - raise RuntimeError("Mongo settings handler was triggered in AYON mode") - from .handlers import MongoLocalSettingsHandler - return MongoLocalSettingsHandler() - - -def require_handler(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - global _SETTINGS_HANDLER - if _SETTINGS_HANDLER is None: - _SETTINGS_HANDLER = create_settings_handler() - return func(*args, **kwargs) - return wrapper - - -def require_local_handler(func): - @functools.wraps(func) - def wrapper(*args, **kwargs): - global _LOCAL_SETTINGS_HANDLER - if _LOCAL_SETTINGS_HANDLER is None: - _LOCAL_SETTINGS_HANDLER = create_local_settings_handler() - return func(*args, **kwargs) - return wrapper - - -@require_handler -def get_system_last_saved_info(): - return _SETTINGS_HANDLER.get_system_last_saved_info() - - -@require_handler -def get_project_last_saved_info(project_name): - return _SETTINGS_HANDLER.get_project_last_saved_info(project_name) - - -@require_handler -def get_last_opened_info(): - return _SETTINGS_HANDLER.get_last_opened_info() - - -@require_handler -def opened_settings_ui(): - return _SETTINGS_HANDLER.opened_settings_ui() - - -@require_handler -def closed_settings_ui(info_obj): - return _SETTINGS_HANDLER.closed_settings_ui(info_obj) - - -@require_handler -def save_studio_settings(data): - """Save studio overrides of system settings. - - Triggers callbacks on modules that want to know about system settings - changes. - - Callbacks are triggered on all modules. They must check if their enabled - value has changed. - - For saving of data cares registered Settings handler. - - Warning messages are not logged as module raising them should log it within - it's logger. - - Args: - data(dict): Overrides data with metadata defying studio overrides. - - Raises: - SaveWarningExc: If any module raises the exception. - """ - # Notify Pype modules - from ayon_core.modules import ModulesManager, ISettingsChangeListener - - old_data = get_system_settings() - default_values = get_default_settings()[SYSTEM_SETTINGS_KEY] - new_data = apply_overrides(default_values, copy.deepcopy(data)) - new_data_with_metadata = copy.deepcopy(new_data) - clear_metadata_from_settings(new_data) - - changes = calculate_changes(old_data, new_data) - modules_manager = ModulesManager(new_data) - - warnings = [] - for module in modules_manager.get_enabled_modules(): - if isinstance(module, ISettingsChangeListener): - try: - module.on_system_settings_save( - old_data, new_data, changes, new_data_with_metadata - ) - except SaveWarningExc as exc: - warnings.extend(exc.warnings) - - _SETTINGS_HANDLER.save_change_log(None, changes, "system") - _SETTINGS_HANDLER.save_studio_settings(data) - if warnings: - raise SaveWarningExc(warnings) - - -@require_handler -def save_project_settings(project_name, overrides): - """Save studio overrides of project settings. - - Old value, new value and changes are passed to enabled modules that want to - know about settings changes. - - For saving of data cares registered Settings handler. - - Warning messages are not logged as module raising them should log it within - it's logger. - - Args: - project_name (str): Project name for which overrides are passed. - Default project's value is None. - overrides(dict): Overrides data with metadata defying studio overrides. - - Raises: - SaveWarningExc: If any module raises the exception. - """ - # Notify Pype modules - from ayon_core.modules import ModulesManager, ISettingsChangeListener - - default_values = get_default_settings()[PROJECT_SETTINGS_KEY] - if project_name: - old_data = get_project_settings(project_name) - - studio_overrides = get_studio_project_settings_overrides() - studio_values = apply_overrides(default_values, studio_overrides) - clear_metadata_from_settings(studio_values) - new_data = apply_overrides(studio_values, copy.deepcopy(overrides)) - - else: - old_data = get_default_project_settings(exclude_locals=True) - new_data = apply_overrides(default_values, copy.deepcopy(overrides)) - - new_data_with_metadata = copy.deepcopy(new_data) - clear_metadata_from_settings(new_data) - - changes = calculate_changes(old_data, new_data) - modules_manager = ModulesManager() - warnings = [] - for module in modules_manager.get_enabled_modules(): - if isinstance(module, ISettingsChangeListener): - try: - module.on_project_settings_save( - old_data, - new_data, - project_name, - changes, - new_data_with_metadata - ) - except SaveWarningExc as exc: - warnings.extend(exc.warnings) - _SETTINGS_HANDLER.save_change_log(project_name, changes, "project") - _SETTINGS_HANDLER.save_project_settings(project_name, overrides) - - if warnings: - raise SaveWarningExc(warnings) - - -@require_handler -def save_project_anatomy(project_name, anatomy_data): - """Save studio overrides of project anatomy. - - Old value, new value and changes are passed to enabled modules that want to - know about settings changes. - - For saving of data cares registered Settings handler. - - Warning messages are not logged as module raising them should log it within - it's logger. - - Args: - project_name (str): Project name for which overrides are passed. - Default project's value is None. - overrides(dict): Overrides data with metadata defying studio overrides. - - Raises: - SaveWarningExc: If any module raises the exception. - """ - # Notify Pype modules - from ayon_core.modules import ModulesManager, ISettingsChangeListener - - default_values = get_default_settings()[PROJECT_ANATOMY_KEY] - if project_name: - old_data = get_anatomy_settings(project_name) - - studio_overrides = get_studio_project_settings_overrides() - studio_values = apply_overrides(default_values, studio_overrides) - clear_metadata_from_settings(studio_values) - new_data = apply_overrides(studio_values, copy.deepcopy(anatomy_data)) - - else: - old_data = get_default_anatomy_settings(exclude_locals=True) - new_data = apply_overrides(default_values, copy.deepcopy(anatomy_data)) - - new_data_with_metadata = copy.deepcopy(new_data) - clear_metadata_from_settings(new_data) - - changes = calculate_changes(old_data, new_data) - modules_manager = ModulesManager() - warnings = [] - for module in modules_manager.get_enabled_modules(): - if isinstance(module, ISettingsChangeListener): - try: - module.on_project_anatomy_save( - old_data, - new_data, - changes, - project_name, - new_data_with_metadata - ) - except SaveWarningExc as exc: - warnings.extend(exc.warnings) - - _SETTINGS_HANDLER.save_change_log(project_name, changes, "anatomy") - _SETTINGS_HANDLER.save_project_anatomy(project_name, anatomy_data) - - if warnings: - raise SaveWarningExc(warnings) - - -def _system_settings_backwards_compatible_conversion(studio_overrides): - # Backwards compatibility of tools 3.9.1 - 3.9.2 to keep - # "tools" environments - if ( - "tools" in studio_overrides - and "tool_groups" in studio_overrides["tools"] - ): - tool_groups = studio_overrides["tools"]["tool_groups"] - for tool_group, group_value in tool_groups.items(): - if tool_group in METADATA_KEYS: - continue - - variants = group_value.get("variants") - if not variants: - continue - - for key in set(variants.keys()): - if key in METADATA_KEYS: - continue - - variant_value = variants[key] - if "environment" not in variant_value: - variants[key] = { - "environment": variant_value - } - - -def _project_anatomy_backwards_compatible_conversion(project_anatomy): - # Backwards compatibility of node settings in Nuke 3.9.x - 3.10.0 - # - source PR - https://github.com/pypeclub/OpenPype/pull/3143 - value = project_anatomy - for key in ("imageio", "nuke", "nodes", "requiredNodes"): - if key not in value: - return - value = value[key] - - for item in value: - for node in item.get("knobs") or []: - if "type" in node: - break - node["type"] = "__legacy__" - - -@require_handler -def get_studio_system_settings_overrides(return_version=False): - output = _SETTINGS_HANDLER.get_studio_system_settings_overrides( - return_version - ) - value = output - if return_version: - value, version = output - _system_settings_backwards_compatible_conversion(value) - return output - - -@require_handler -def get_studio_project_settings_overrides(return_version=False): - return _SETTINGS_HANDLER.get_studio_project_settings_overrides( - return_version - ) - - -@require_handler -def get_studio_project_anatomy_overrides(return_version=False): - return _SETTINGS_HANDLER.get_studio_project_anatomy_overrides( - return_version - ) - - -@require_handler -def get_project_settings_overrides(project_name, return_version=False): - return _SETTINGS_HANDLER.get_project_settings_overrides( - project_name, return_version - ) - - -@require_handler -def get_project_anatomy_overrides(project_name): - output = _SETTINGS_HANDLER.get_project_anatomy_overrides(project_name) - _project_anatomy_backwards_compatible_conversion(output) - return output - - -@require_handler -def get_studio_system_settings_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .get_studio_system_settings_overrides_for_version(version) - ) - - -@require_handler -def get_studio_project_anatomy_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .get_studio_project_anatomy_overrides_for_version(version) - ) - - -@require_handler -def get_studio_project_settings_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .get_studio_project_settings_overrides_for_version(version) - ) - - -@require_handler -def get_project_settings_overrides_for_version( - project_name, version -): - return ( - _SETTINGS_HANDLER - .get_project_settings_overrides_for_version(project_name, version) - ) - - -@require_handler -def get_available_studio_system_settings_overrides_versions(sorted=None): - return ( - _SETTINGS_HANDLER - .get_available_studio_system_settings_overrides_versions( - sorted=sorted - ) - ) - - -@require_handler -def get_available_studio_project_anatomy_overrides_versions(sorted=None): - return ( - _SETTINGS_HANDLER - .get_available_studio_project_anatomy_overrides_versions( - sorted=sorted - ) - ) - - -@require_handler -def get_available_studio_project_settings_overrides_versions(sorted=None): - return ( - _SETTINGS_HANDLER - .get_available_studio_project_settings_overrides_versions( - sorted=sorted - ) - ) - - -@require_handler -def get_available_project_settings_overrides_versions( - project_name, sorted=None -): - return ( - _SETTINGS_HANDLER - .get_available_project_settings_overrides_versions( - project_name, sorted=sorted - ) - ) - - -@require_handler -def find_closest_version_for_projects(project_names): - return ( - _SETTINGS_HANDLER - .find_closest_version_for_projects(project_names) - ) - - -@require_handler -def clear_studio_system_settings_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .clear_studio_system_settings_overrides_for_version(version) - ) - - -@require_handler -def clear_studio_project_settings_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .clear_studio_project_settings_overrides_for_version(version) - ) - - -@require_handler -def clear_studio_project_anatomy_overrides_for_version(version): - return ( - _SETTINGS_HANDLER - .clear_studio_project_anatomy_overrides_for_version(version) - ) - - -@require_handler -def clear_project_settings_overrides_for_version( - version, project_name -): - return _SETTINGS_HANDLER.clear_project_settings_overrides_for_version( - version, project_name - ) - - -@require_local_handler -def save_local_settings(data): - return _LOCAL_SETTINGS_HANDLER.save_local_settings(data) - - -@require_local_handler -def _get_local_settings(): - return _LOCAL_SETTINGS_HANDLER.get_local_settings() - - def get_local_settings(): - if not AYON_SERVER_ENABLED: - return _get_local_settings() # TODO implement ayon implementation return {} @@ -542,42 +64,7 @@ def reset_default_settings(): def _get_default_settings(): - from ayon_core.modules import get_module_settings_defs - - defaults = load_openpype_default_settings() - - module_settings_defs = get_module_settings_defs() - for module_settings_def_cls in module_settings_defs: - module_settings_def = module_settings_def_cls() - system_defaults = module_settings_def.get_defaults( - SYSTEM_SETTINGS_KEY - ) or {} - for path, value in system_defaults.items(): - if not path: - continue - - subdict = defaults["system_settings"] - path_items = list(path.split("/")) - last_key = path_items.pop(-1) - for key in path_items: - subdict = subdict[key] - subdict[last_key] = value - - project_defaults = module_settings_def.get_defaults( - PROJECT_SETTINGS_KEY - ) or {} - for path, value in project_defaults.items(): - if not path: - continue - - subdict = defaults - path_items = list(path.split("/")) - last_key = path_items.pop(-1) - for key in path_items: - subdict = subdict[key] - subdict[last_key] = value - - return defaults + return load_openpype_default_settings() def get_default_settings(): @@ -712,140 +199,6 @@ def merge_overrides(source_dict, override_dict): return source_dict -def apply_overrides(source_data, override_data): - if not override_data: - return source_data - _source_data = copy.deepcopy(source_data) - return merge_overrides(_source_data, override_data) - - -def apply_local_settings_on_system_settings(system_settings, local_settings): - """Apply local settings on studio system settings. - - ATM local settings can modify only application executables. Executable - values are not overridden but prepended. - """ - if not local_settings or "applications" not in local_settings: - return - - current_platform = platform.system().lower() - apps_settings = system_settings["applications"] - additional_apps = apps_settings["additional_apps"] - for app_group_name, value in local_settings["applications"].items(): - if not value: - continue - - if ( - app_group_name not in apps_settings - and app_group_name not in additional_apps - ): - continue - - if app_group_name in apps_settings: - variants = apps_settings[app_group_name]["variants"] - - else: - variants = ( - apps_settings["additional_apps"][app_group_name]["variants"] - ) - - for app_name, app_value in value.items(): - if ( - not app_value - or app_name not in variants - or "executables" not in variants[app_name] - ): - continue - - executable = app_value.get("executable") - if not executable: - continue - platform_executables = variants[app_name]["executables"].get( - current_platform - ) - # TODO This is temporary fix until launch arguments will be stored - # per platform and not per executable. - # - local settings store only executable - new_executables = [executable] - new_executables.extend(platform_executables) - variants[app_name]["executables"] = new_executables - - -def apply_local_settings_on_anatomy_settings( - anatomy_settings, local_settings, project_name, site_name=None -): - """Apply local settings on anatomy settings. - - ATM local settings can modify project roots. Project name is required as - local settings have data stored data by project's name. - - Local settings override root values in this order: - 1.) Check if local settings contain overrides for default project and - apply it's values on roots if there are any. - 2.) If passed `project_name` is not None then check project specific - overrides in local settings for the project and apply it's value on - roots if there are any. - - NOTE: Root values of default project from local settings are always applied - if are set. - - Args: - anatomy_settings (dict): Data for anatomy settings. - local_settings (dict): Data of local settings. - project_name (str): Name of project for which anatomy data are. - """ - if not local_settings: - return - - local_project_settings = local_settings.get("projects") or {} - - # Check for roots existence in local settings first - roots_project_locals = ( - local_project_settings - .get(project_name, {}) - ) - roots_default_locals = ( - local_project_settings - .get(DEFAULT_PROJECT_KEY, {}) - ) - - # 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 - if site_name is None: - if project_name: - project_settings = get_project_settings(project_name) - else: - project_settings = get_default_project_settings() - site_name = ( - project_settings["global"]["sync_server"]["config"]["active_site"] - ) - - # QUESTION should raise an exception? - if not site_name: - return - - # Combine roots from local settings - roots_locals = roots_default_locals.get(site_name) or {} - roots_locals.update(roots_project_locals.get(site_name) or {}) - # Skip processing if roots for current active site are not available in - # local settings - if not roots_locals: - return - - current_platform = platform.system().lower() - - root_data = anatomy_settings["roots"] - for root_name, path in roots_locals.items(): - if root_name not in root_data: - continue - anatomy_settings["roots"][root_name][current_platform] = ( - path - ) - - def get_site_local_overrides(project_name, site_name, local_settings=None): """Site overrides from local settings for passet project and site name. @@ -884,180 +237,6 @@ def get_site_local_overrides(project_name, site_name, local_settings=None): return output -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") - ) - - 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"] = remote_site - - -def _get_system_settings(clear_metadata=True, exclude_locals=None): - """System settings with applied studio overrides.""" - default_values = get_default_settings()[SYSTEM_SETTINGS_KEY] - studio_values = get_studio_system_settings_overrides() - result = apply_overrides(default_values, studio_values) - - # Clear overrides metadata from settings - if clear_metadata: - clear_metadata_from_settings(result) - - # Apply local settings - # Default behavior is based on `clear_metadata` value - if exclude_locals is None: - exclude_locals = not clear_metadata - - if not exclude_locals: - # TODO local settings may be required to apply for environments - local_settings = get_local_settings() - apply_local_settings_on_system_settings(result, local_settings) - - return result - - -def get_default_project_settings(clear_metadata=True, exclude_locals=None): - """Project settings with applied studio's default project overrides.""" - default_values = get_default_settings()[PROJECT_SETTINGS_KEY] - studio_values = get_studio_project_settings_overrides() - result = apply_overrides(default_values, studio_values) - # Clear overrides metadata from settings - if clear_metadata: - clear_metadata_from_settings(result) - - # Apply local settings - if exclude_locals is None: - exclude_locals = not clear_metadata - - if not exclude_locals: - local_settings = get_local_settings() - apply_local_settings_on_project_settings( - result, local_settings, None - ) - return result - - -def get_default_anatomy_settings(clear_metadata=True, exclude_locals=None): - """Project anatomy data with applied studio's default project overrides.""" - default_values = get_default_settings()[PROJECT_ANATOMY_KEY] - studio_values = get_studio_project_anatomy_overrides() - - result = apply_overrides(default_values, studio_values) - # Clear overrides metadata from settings - if clear_metadata: - clear_metadata_from_settings(result) - - # Apply local settings - if exclude_locals is None: - exclude_locals = not clear_metadata - - if not exclude_locals: - local_settings = get_local_settings() - apply_local_settings_on_anatomy_settings( - result, local_settings, None - ) - return result - - -def get_anatomy_settings( - project_name, site_name=None, clear_metadata=True, exclude_locals=None -): - """Project anatomy data with applied studio and project overrides.""" - if not project_name: - raise ValueError( - "Must enter project name. Call " - "`get_default_anatomy_settings` to get project defaults." - ) - - studio_overrides = get_default_anatomy_settings(False) - project_overrides = get_project_anatomy_overrides( - project_name - ) - result = copy.deepcopy(studio_overrides) - if project_overrides: - for key, value in project_overrides.items(): - result[key] = value - - # Clear overrides metadata from settings - if clear_metadata: - clear_metadata_from_settings(result) - - # Apply local settings - if exclude_locals is None: - exclude_locals = not clear_metadata - - if not exclude_locals: - local_settings = get_local_settings() - apply_local_settings_on_anatomy_settings( - result, local_settings, project_name, site_name - ) - - return result - - -def _get_project_settings( - project_name, clear_metadata=True, exclude_locals=None -): - """Project settings with applied studio and project overrides.""" - if not project_name: - raise ValueError( - "Must enter project name." - " Call `get_default_project_settings` to get project defaults." - ) - - studio_overrides = get_default_project_settings(False) - project_overrides = get_project_settings_overrides( - project_name - ) - - result = apply_overrides(studio_overrides, project_overrides) - - # Clear overrides metadata from settings - if clear_metadata: - clear_metadata_from_settings(result) - - # Apply local settings - if exclude_locals is None: - exclude_locals = not clear_metadata - - if not exclude_locals: - local_settings = get_local_settings() - apply_local_settings_on_project_settings( - result, local_settings, project_name - ) - - return result - - def get_current_project_settings(): """Project settings for current context project. @@ -1074,71 +253,21 @@ def get_current_project_settings(): return get_project_settings(project_name) -@require_handler -def _get_global_settings(): - default_settings = load_openpype_default_settings() - default_values = default_settings["system_settings"]["general"] - studio_values = _SETTINGS_HANDLER.get_global_settings() - return { - key: studio_values.get(key, default_values.get(key)) - for key in _SETTINGS_HANDLER.global_keys - } - - def get_global_settings(): - if not AYON_SERVER_ENABLED: - return _get_global_settings() default_settings = load_openpype_default_settings() return default_settings["system_settings"]["general"] -def _get_general_environments(): - """Get general environments. - - Function is implemented to be able load general environments without using - `get_default_settings`. - """ - # Use only openpype defaults. - # - prevent to use `get_system_settings` where `get_default_settings` - # is used - default_values = load_openpype_default_settings() - system_settings = default_values["system_settings"] - studio_overrides = get_studio_system_settings_overrides() - - result = apply_overrides(system_settings, studio_overrides) - environments = result["general"]["environment"] - - clear_metadata_from_settings(environments) - - whitelist_envs = result["general"].get("local_env_white_list") - if whitelist_envs: - local_settings = get_local_settings() - local_envs = local_settings.get("environments") or {} - for key, value in local_envs.items(): - if key in whitelist_envs and key in environments: - environments[key] = value - - return environments - - def get_general_environments(): - if not AYON_SERVER_ENABLED: - return _get_general_environments() value = get_system_settings() return value["general"]["environment"] def get_system_settings(*args, **kwargs): - if not AYON_SERVER_ENABLED: - return _get_system_settings(*args, **kwargs) - default_settings = get_default_settings()[SYSTEM_SETTINGS_KEY] return get_ayon_system_settings(default_settings) def get_project_settings(project_name, *args, **kwargs): - if not AYON_SERVER_ENABLED: - return _get_project_settings(project_name, *args, **kwargs) - default_settings = get_default_settings()[PROJECT_SETTINGS_KEY] return get_ayon_project_settings(default_settings, project_name) diff --git a/client/ayon_core/tools/tray/pype_tray.py b/client/ayon_core/tools/tray/pype_tray.py index 3d13264398..cf42fb3c59 100644 --- a/client/ayon_core/tools/tray/pype_tray.py +++ b/client/ayon_core/tools/tray/pype_tray.py @@ -25,12 +25,7 @@ from ayon_core.lib.openpype_version import ( is_staging_enabled, ) from ayon_core.modules import TrayModulesManager -from ayon_core.settings import ( - get_system_settings, - SystemSettings, - ProjectSettings, - DefaultsNotDefined -) +from ayon_core.settings import get_system_settings from ayon_core.tools.utils import ( WrappedCallbackItem, paint_image_with_color, @@ -509,9 +504,6 @@ class TrayManager: version_check_timer.start() self._version_check_timer = version_check_timer - # For storing missing settings dialog - self._settings_validation_dialog = None - self.execute_in_main_thread(self._startup_validations) def _startup_validations(self): @@ -519,8 +511,6 @@ class TrayManager: # Trigger version validation on start self._version_check_timer.timeout.emit() - self._validate_settings_defaults() - if not op_version_control_available(): dialog = BuildVersionDialog() dialog.exec_() @@ -529,45 +519,6 @@ class TrayManager: dialog = ProductionStagingDialog() dialog.exec_() - def _validate_settings_defaults(self): - valid = True - try: - SystemSettings() - ProjectSettings() - - except DefaultsNotDefined: - valid = False - - if valid: - return - - title = "Settings miss default values" - msg = ( - "Your OpenPype will not work as expected! \n" - "Some default values in settings are missing. \n\n" - "Please contact OpenPype team." - ) - msg_box = QtWidgets.QMessageBox( - QtWidgets.QMessageBox.Warning, - title, - msg, - QtWidgets.QMessageBox.Ok, - flags=QtCore.Qt.Dialog - ) - icon = QtGui.QIcon(resources.get_openpype_icon_filepath()) - msg_box.setWindowIcon(icon) - msg_box.setStyleSheet(style.load_stylesheet()) - msg_box.buttonClicked.connect(self._post_validate_settings_defaults) - - self._settings_validation_dialog = msg_box - - msg_box.show() - - def _post_validate_settings_defaults(self): - widget = self._settings_validation_dialog - self._settings_validation_dialog = None - widget.deleteLater() - def show_tray_message(self, title, message, icon=None, msecs=None): """Show tray message. diff --git a/client/ayon_core/widgets/__init__.py b/client/ayon_core/widgets/__init__.py index b0552c7a0d..e69de29bb2 100644 --- a/client/ayon_core/widgets/__init__.py +++ b/client/ayon_core/widgets/__init__.py @@ -1,6 +0,0 @@ -from .password_dialog import PasswordDialog - - -__all__ = ( - "PasswordDialog", -) diff --git a/client/ayon_core/widgets/password_dialog.py b/client/ayon_core/widgets/password_dialog.py deleted file mode 100644 index 4f8bdedee3..0000000000 --- a/client/ayon_core/widgets/password_dialog.py +++ /dev/null @@ -1,163 +0,0 @@ -from qtpy import QtWidgets, QtCore, QtGui - -from ayon_core import style -from ayon_core.resources import get_resource - -from ayon_core.settings import get_system_settings -from ayon_core.settings.lib import ( - get_local_settings, - save_local_settings -) - - -class PressHoverButton(QtWidgets.QPushButton): - _mouse_pressed = False - _mouse_hovered = False - change_state = QtCore.Signal(bool) - - def mousePressEvent(self, event): - self._mouse_pressed = True - self._mouse_hovered = True - self.change_state.emit(self._mouse_hovered) - super(PressHoverButton, self).mousePressEvent(event) - - def mouseReleaseEvent(self, event): - self._mouse_pressed = False - self._mouse_hovered = False - self.change_state.emit(self._mouse_hovered) - super(PressHoverButton, self).mouseReleaseEvent(event) - - def mouseMoveEvent(self, event): - mouse_pos = self.mapFromGlobal(QtGui.QCursor.pos()) - under_mouse = self.rect().contains(mouse_pos) - if under_mouse != self._mouse_hovered: - self._mouse_hovered = under_mouse - self.change_state.emit(self._mouse_hovered) - - super(PressHoverButton, self).mouseMoveEvent(event) - - -class PasswordDialog(QtWidgets.QDialog): - """Stupidly simple dialog to compare password from general settings.""" - finished = QtCore.Signal(bool) - - def __init__(self, parent=None, allow_remember=True): - super(PasswordDialog, self).__init__(parent) - - self.setWindowTitle("Admin Password") - self.resize(300, 120) - - system_settings = get_system_settings() - - self._expected_result = ( - system_settings["general"].get("admin_password") - ) - self._final_result = None - self._allow_remember = allow_remember - - # Password input - password_widget = QtWidgets.QWidget(self) - - password_label = QtWidgets.QLabel("Password:", password_widget) - - password_input = QtWidgets.QLineEdit(password_widget) - password_input.setEchoMode(QtWidgets.QLineEdit.Password) - - show_password_icon_path = get_resource("icons", "eye.png") - show_password_icon = QtGui.QIcon(show_password_icon_path) - show_password_btn = PressHoverButton(password_widget) - show_password_btn.setObjectName("PasswordBtn") - show_password_btn.setIcon(show_password_icon) - show_password_btn.setFocusPolicy(QtCore.Qt.ClickFocus) - - password_layout = QtWidgets.QHBoxLayout(password_widget) - password_layout.setContentsMargins(0, 0, 0, 0) - password_layout.addWidget(password_label) - password_layout.addWidget(password_input) - password_layout.addWidget(show_password_btn) - - message_label = QtWidgets.QLabel("", self) - - # Buttons - buttons_widget = QtWidgets.QWidget(self) - - remember_checkbox = QtWidgets.QCheckBox("Remember", buttons_widget) - remember_checkbox.setObjectName("RememberCheckbox") - remember_checkbox.setVisible(allow_remember) - - ok_btn = QtWidgets.QPushButton("Ok", buttons_widget) - cancel_btn = QtWidgets.QPushButton("Cancel", buttons_widget) - - buttons_layout = QtWidgets.QHBoxLayout(buttons_widget) - buttons_layout.setContentsMargins(0, 0, 0, 0) - buttons_layout.addWidget(remember_checkbox) - buttons_layout.addStretch(1) - buttons_layout.addWidget(ok_btn) - buttons_layout.addWidget(cancel_btn) - - # Main layout - layout = QtWidgets.QVBoxLayout(self) - layout.addSpacing(10) - layout.addWidget(password_widget, 0) - layout.addWidget(message_label, 0) - layout.addStretch(1) - layout.addWidget(buttons_widget, 0) - - ok_btn.clicked.connect(self._on_ok_click) - cancel_btn.clicked.connect(self._on_cancel_click) - show_password_btn.change_state.connect(self._on_show_password) - - self.password_input = password_input - self.remember_checkbox = remember_checkbox - self.message_label = message_label - - self.setStyleSheet(style.load_stylesheet()) - - def remember_password(self): - if not self._allow_remember: - return False - return self.remember_checkbox.isChecked() - - def result(self): - if self._final_result is None: - return False - return self._final_result == self._expected_result - - def keyPressEvent(self, event): - if event.key() in (QtCore.Qt.Key_Return, QtCore.Qt.Key_Enter): - self._on_ok_click() - return event.accept() - super(PasswordDialog, self).keyPressEvent(event) - - def closeEvent(self, event): - super(PasswordDialog, self).closeEvent(event) - self.finished.emit(self.result()) - - def _on_ok_click(self): - input_value = self.password_input.text() - if input_value != self._expected_result: - self.message_label.setText("Invalid password. Try it again...") - self.password_input.setFocus() - return - - if self.remember_password(): - local_settings = get_local_settings() - if "general" not in local_settings: - local_settings["general"] = {} - - local_settings["general"]["is_admin"] = True - - save_local_settings(local_settings) - - self._final_result = input_value - self.close() - - def _on_show_password(self, show_password): - if show_password: - echo_mode = QtWidgets.QLineEdit.Normal - else: - echo_mode = QtWidgets.QLineEdit.Password - self.password_input.setEchoMode(echo_mode) - - def _on_cancel_click(self): - self.close()