From 73f441abc4d93101d94da05c5e06079ddf5169bd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 25 Jan 2021 19:25:18 +0100 Subject: [PATCH] defaults must be set to be able to change any overrides --- pype/settings/entities/base_entity.py | 2 +- pype/settings/entities/input_entities.py | 16 ++++++- pype/settings/entities/item_entities.py | 59 +++++++++++++++++++++++- pype/settings/entities/lib.py | 6 +++ 4 files changed, 79 insertions(+), 4 deletions(-) diff --git a/pype/settings/entities/base_entity.py b/pype/settings/entities/base_entity.py index 3fcea8088a..afad511e91 100644 --- a/pype/settings/entities/base_entity.py +++ b/pype/settings/entities/base_entity.py @@ -418,7 +418,7 @@ class RootEntity(BaseEntity): value = studio_overrides.get(key, NOT_SET) child_obj.update_studio_values(value) - self.set_override_state(self.override_state) + self.set_override_state(OverrideState.STUDIO) def __getitem__(self, key): return self.non_gui_children[key] diff --git a/pype/settings/entities/input_entities.py b/pype/settings/entities/input_entities.py index 473690545e..d2aa4b1e39 100644 --- a/pype/settings/entities/input_entities.py +++ b/pype/settings/entities/input_entities.py @@ -1,6 +1,9 @@ import copy from .item_entities import ItemEntity -from .lib import NOT_SET +from .lib import ( + NOT_SET, + DefaultsNotDefined +) from .constants import ( OverrideState, METADATA_KEYS, @@ -169,6 +172,11 @@ class InputEntity(ItemEntity): def set_override_state(self, state): self.override_state = state + if ( + not self.has_default_value + and state in (OverrideState.STUDIO, OverrideState.PROJECT) + ): + raise DefaultsNotDefined(self) if state is OverrideState.STUDIO: self.has_studio_override = ( @@ -357,6 +365,11 @@ class RawJsonEntity(InputEntity): def set_override_state(self, state): self.override_state = state + if ( + not self.has_default_value + and state in (OverrideState.STUDIO, OverrideState.PROJECT) + ): + raise DefaultsNotDefined(self) if state is OverrideState.STUDIO: self.has_studio_override = ( @@ -404,6 +417,7 @@ class RawJsonEntity(InputEntity): return value, metadata def update_default_value(self, value): + self.has_default_value = value is not NOT_SET value, metadata = self._prepare_value(value) self.default_value = value self.default_metadata = metadata diff --git a/pype/settings/entities/item_entities.py b/pype/settings/entities/item_entities.py index 5e82abba13..3d04dd0783 100644 --- a/pype/settings/entities/item_entities.py +++ b/pype/settings/entities/item_entities.py @@ -1,7 +1,10 @@ import copy from abc import abstractmethod -from .lib import NOT_SET +from .lib import ( + NOT_SET, + DefaultsNotDefined +) from .constants import ( OverrideState, WRAPPER_TYPES, @@ -319,7 +322,13 @@ class DictImmutableKeysEntity(ItemEntity): def set_override_state(self, state): # Change has/had override states self.override_state = state - if state is OverrideState.STUDIO: + if state is OverrideState.NOT_DEFINED: + pass + + elif state is OverrideState.DEFAULTS: + self.has_default_value = self.default_value is not NOT_SET + + elif state is OverrideState.STUDIO: if self.studio_override_metadata is NOT_SET: self.had_studio_override = False self.has_studio_override = self.had_studio_override @@ -671,6 +680,12 @@ class DictMutableKeysEntity(ItemEntity): def set_override_state(self, state): # TODO change metadata self.override_state = state + if ( + not self.has_default_value + and state in (OverrideState.STUDIO, OverrideState.PROJECT) + ): + raise DefaultsNotDefined(self) + using_overrides = True if ( state is OverrideState.PROJECT @@ -870,6 +885,38 @@ class ListEntity(ItemEntity): raise NotImplementedError(self.__class__.__name__) def set_override_state(self, state): + self.override_state = state + if ( + not self.has_default_value + and state in (OverrideState.STUDIO, OverrideState.PROJECT) + ): + raise DefaultsNotDefined(self) + + while self.children: + self.children.pop(0) + + if self.override_state is OverrideState.NOT_DEFINED: + return + + if self.override_state is OverrideState.PROJECT: + value = self.project_override_value + if value is NOT_SET: + value = self.studio_override_value + if value is NOT_SET: + value = self.default_value + + elif self.override_state is OverrideState.STUDIO: + value = self.studio_override_value + if value is NOT_SET: + value = self.default_value + + elif self.override_state is OverrideState.DEFAULTS: + value = self.default_value + + if value is NOT_SET: + self.has_default_value = False + value = self.value_on_not_set + for child_obj in self.children: child_obj.set_override_state(state) @@ -1140,6 +1187,8 @@ class ListStrictEntity(ItemEntity): # GUI attribute self.is_horizontal = self.schema_data.get("horizontal", True) + if not self.group_item and not self.is_group: + self.is_group = True def get_child_path(self, child_obj): result_idx = None @@ -1160,6 +1209,12 @@ class ListStrictEntity(ItemEntity): def set_override_state(self, state): # TODO use right value as current_value is held here self.override_state = state + if ( + not self.has_default_value + and state in (OverrideState.STUDIO, OverrideState.PROJECT) + ): + raise DefaultsNotDefined(self) + for child_obj in self.children: child_obj.set_override_state(state) diff --git a/pype/settings/entities/lib.py b/pype/settings/entities/lib.py index a4d5f62fdb..446418688e 100644 --- a/pype/settings/entities/lib.py +++ b/pype/settings/entities/lib.py @@ -10,6 +10,12 @@ from .constants import ( from queue import Queue +class DefaultsNotDefined(Exception): + def __init__(self, obj): + msg = "Default values for object are not set. {}".format(obj.path) + super(DefaultsNotDefined, self).__init__(msg) + + # Singleton database of available inputs class TypeToKlass: types = {}