added argument ignore_missing_defaults to set_override_state method

This commit is contained in:
iLLiCiTiT 2021-06-29 12:46:10 +02:00
parent 0e0e527741
commit d58c8f1a11
8 changed files with 59 additions and 23 deletions

View file

@ -280,7 +280,7 @@ class BaseItemEntity(BaseEntity):
)
@abstractmethod
def set_override_state(self, state):
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
@ -290,8 +290,15 @@ class BaseItemEntity(BaseEntity):
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

View file

@ -377,7 +377,7 @@ class DictConditionalEntity(ItemEntity):
self._metadata_are_modified = current_metadata != metadata
self._current_metadata = current_metadata
def set_override_state(self, 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)

View file

@ -258,7 +258,7 @@ class DictImmutableKeysEntity(ItemEntity):
self._metadata_are_modified = current_metadata != metadata
self._current_metadata = current_metadata
def set_override_state(self, 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)
@ -268,7 +268,7 @@ class DictImmutableKeysEntity(ItemEntity):
self._override_state = state
for child_obj in self.non_gui_children.values():
child_obj.set_override_state(state)
child_obj.set_override_state(state, ignore_missing_defaults)
self._update_current_metadata()

View file

@ -320,7 +320,7 @@ class DictMutableKeysEntity(EndpointEntity):
def _metadata_for_current_state(self):
return self._get_metadata_for_state(self._override_state)
def set_override_state(self, 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)
@ -331,11 +331,17 @@ class DictMutableKeysEntity(EndpointEntity):
# 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:
if (
not self.has_default_value
and not ignore_missing_defaults
):
raise DefaultsNotDefined(self)
elif state > OverrideState.STUDIO:
if not self.had_studio_override:
if (
not self.had_studio_override
and not ignore_missing_defaults
):
raise StudioDefaultsNotDefined(self)
if state is OverrideState.STUDIO:
@ -426,7 +432,7 @@ class DictMutableKeysEntity(EndpointEntity):
if label:
children_label_by_id[child_entity.id] = label
child_entity.set_override_state(state)
child_entity.set_override_state(state, ignore_missing_defaults)
self.children_label_by_id = children_label_by_id

View file

@ -217,7 +217,7 @@ class InputEntity(EndpointEntity):
return True
return False
def set_override_state(self, 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)
@ -227,11 +227,17 @@ class InputEntity(EndpointEntity):
# 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:
if (
not self.has_default_value
and not ignore_missing_defaults
):
raise DefaultsNotDefined(self)
elif state > OverrideState.STUDIO:
if not self.had_studio_override:
if (
not self.had_studio_override
and not ignore_missing_defaults
):
raise StudioDefaultsNotDefined(self)
if state is OverrideState.STUDIO:

View file

@ -150,14 +150,14 @@ class PathEntity(ItemEntity):
def value(self):
return self.child_obj.value
def set_override_state(self, 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
self._override_state = state
self.child_obj.set_override_state(state)
self.child_obj.set_override_state(state, ignore_missing_defaults)
def update_default_value(self, value):
self.child_obj.update_default_value(value)
@ -344,7 +344,7 @@ class ListStrictEntity(ItemEntity):
return True
return False
def set_override_state(self, 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)
@ -354,15 +354,21 @@ class ListStrictEntity(ItemEntity):
# 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:
if (
not self.has_default_value
and not ignore_missing_defaults
):
raise DefaultsNotDefined(self)
elif state > OverrideState.STUDIO:
if not self.had_studio_override:
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)
child_entity.set_override_state(state, ignore_missing_defaults)
self.initial_value = self.settings_value()

View file

@ -205,7 +205,7 @@ class ListEntity(EndpointEntity):
self._has_project_override = True
self.on_change()
def set_override_state(self, 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)
@ -219,11 +219,17 @@ class ListEntity(EndpointEntity):
# 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:
if (
not self.has_default_value
and not ignore_missing_defaults
):
raise DefaultsNotDefined(self)
elif state > OverrideState.STUDIO:
if not self.had_studio_override:
if (
not self.had_studio_override
and not ignore_missing_defaults
):
raise StudioDefaultsNotDefined(self)
value = NOT_SET
@ -257,7 +263,9 @@ class ListEntity(EndpointEntity):
child_obj.update_studio_value(item)
for child_obj in self.children:
child_obj.set_override_state(self._override_state)
child_obj.set_override_state(
self._override_state, ignore_missing_defaults
)
self.initial_value = self.settings_value()

View file

@ -218,7 +218,7 @@ class RootEntity(BaseItemEntity):
schema_data, *args, **kwargs
)
def set_override_state(self, state):
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
@ -227,9 +227,12 @@ class RootEntity(BaseItemEntity):
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)
child_obj.set_override_state(state, ignore_missing_defaults)
def on_change(self):
"""Trigger callbacks on change."""