Merge pull request #2956 from pypeclub/bugfix/conditional_dict_invalid_logs

Settings: Conditional dictionary avoid invalid logs
This commit is contained in:
Jakub Trllo 2022-03-28 11:44:26 +02:00 committed by GitHub
commit 50550c5550
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 266 additions and 127 deletions

View file

@ -173,6 +173,10 @@ class BaseItemEntity(BaseEntity):
# 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 = []
@ -419,7 +423,7 @@ class BaseItemEntity(BaseEntity):
raise InvalidValueType(self.valid_value_types, type(value), self.path)
# TODO convert to private method
def _check_update_value(self, value, value_source):
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
@ -447,16 +451,17 @@ class BaseItemEntity(BaseEntity):
if new_value is not NOT_SET:
return new_value
# 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)
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):
@ -985,7 +990,7 @@ class ItemEntity(BaseItemEntity):
return self.root_item.get_entity_from_path(path)
@abstractmethod
def update_default_value(self, parent_values):
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
@ -995,11 +1000,13 @@ class ItemEntity(BaseItemEntity):
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):
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
@ -1008,11 +1015,13 @@ class ItemEntity(BaseItemEntity):
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):
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
@ -1021,5 +1030,7 @@ class ItemEntity(BaseItemEntity):
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

View file

@ -518,12 +518,18 @@ class DictConditionalEntity(ItemEntity):
output.update(self._current_metadata)
return output
def _prepare_value(self, value):
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
@ -551,22 +557,25 @@ class DictConditionalEntity(ItemEntity):
return value, metadata
def update_default_value(self, value):
def update_default_value(self, value, log_invalid_types=True):
"""Update default values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "default")
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)
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)
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)
child_obj.update_default_value(value, log_invalid_types)
return
value_keys = set(value.keys())
@ -574,7 +583,7 @@ class DictConditionalEntity(ItemEntity):
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:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in default values: {}".format(
self.path,
@ -582,28 +591,37 @@ class DictConditionalEntity(ItemEntity):
)
)
self.enum_entity.update_default_value(enum_value)
for children_by_key in self.non_gui_children.values():
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)
child_obj.update_default_value(child_value, _log_invalid_types)
def update_studio_value(self, value):
def update_studio_value(self, value, log_invalid_types=True):
"""Update studio override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "studio override")
value, metadata = self._prepare_value(value)
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)
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)
child_obj.update_studio_value(value, log_invalid_types)
return
value_keys = set(value.keys())
@ -611,7 +629,7 @@ class DictConditionalEntity(ItemEntity):
expected_keys = set(self.non_gui_children[enum_value])
expected_keys.add(self.enum_key)
unknown_keys = value_keys - expected_keys
if unknown_keys:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in studio overrides: {}".format(
self.path,
@ -619,28 +637,36 @@ class DictConditionalEntity(ItemEntity):
)
)
self.enum_entity.update_studio_value(enum_value)
for children_by_key in self.non_gui_children.values():
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)
child_obj.update_studio_value(child_value, _log_invalid_types)
def update_project_value(self, value):
def update_project_value(self, value, log_invalid_types=True):
"""Update project override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "project override")
value, metadata = self._prepare_value(value)
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)
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)
child_obj.update_project_value(value, log_invalid_types)
return
value_keys = set(value.keys())
@ -648,7 +674,7 @@ class DictConditionalEntity(ItemEntity):
expected_keys = set(self.non_gui_children[enum_value])
expected_keys.add(self.enum_key)
unknown_keys = value_keys - expected_keys
if unknown_keys:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in project overrides: {}".format(
self.path,
@ -656,12 +682,16 @@ class DictConditionalEntity(ItemEntity):
)
)
self.enum_entity.update_project_value(enum_value)
for children_by_key in self.non_gui_children.values():
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)
child_obj.update_project_value(child_value, _log_invalid_types)
def _discard_changes(self, on_change_trigger):
self._ignore_child_changes = True

View file

@ -414,12 +414,16 @@ class DictImmutableKeysEntity(ItemEntity):
return value, metadata
def update_default_value(self, value):
def update_default_value(self, value, log_invalid_types=True):
"""Update default values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "default")
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)
@ -427,13 +431,13 @@ class DictImmutableKeysEntity(ItemEntity):
if value is NOT_SET:
for child_obj in self.non_gui_children.values():
child_obj.update_default_value(value)
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:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in default values: {}".format(
self.path,
@ -443,27 +447,31 @@ class DictImmutableKeysEntity(ItemEntity):
for key, child_obj in self.non_gui_children.items():
child_value = value.get(key, NOT_SET)
child_obj.update_default_value(child_value)
child_obj.update_default_value(child_value, log_invalid_types)
def update_studio_value(self, value):
def update_studio_value(self, value, log_invalid_types=True):
"""Update studio override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "studio override")
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)
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:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in studio overrides: {}".format(
self.path,
@ -472,27 +480,31 @@ class DictImmutableKeysEntity(ItemEntity):
)
for key, child_obj in self.non_gui_children.items():
child_value = value.get(key, NOT_SET)
child_obj.update_studio_value(child_value)
child_obj.update_studio_value(child_value, log_invalid_types)
def update_project_value(self, value):
def update_project_value(self, value, log_invalid_types=True):
"""Update project override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "project override")
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)
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:
if unknown_keys and log_invalid_types:
self.log.warning(
"{} Unknown keys in project overrides: {}".format(
self.path,
@ -502,7 +514,7 @@ class DictImmutableKeysEntity(ItemEntity):
for key, child_obj in self.non_gui_children.items():
child_value = value.get(key, NOT_SET)
child_obj.update_project_value(child_value)
child_obj.update_project_value(child_value, log_invalid_types)
def _discard_changes(self, on_change_trigger):
self._ignore_child_changes = True
@ -694,37 +706,48 @@ class RootsDictEntity(DictImmutableKeysEntity):
self._metadata_are_modified = False
self._current_metadata = {}
def update_default_value(self, value):
def update_default_value(self, value, log_invalid_types=True):
"""Update default values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "default")
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):
def update_studio_value(self, value, log_invalid_types=True):
"""Update studio override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "studio override")
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):
def update_project_value(self, value, log_invalid_types=True):
"""Update project override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "project override")
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
@ -886,37 +909,48 @@ class SyncServerSites(DictImmutableKeysEntity):
self._metadata_are_modified = False
self._current_metadata = {}
def update_default_value(self, value):
def update_default_value(self, value, log_invalid_types=True):
"""Update default values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "default")
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):
def update_studio_value(self, value, log_invalid_types=True):
"""Update studio override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "studio override")
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):
def update_project_value(self, value, log_invalid_types=True):
"""Update project override values.
Not an api method, should be called by parent.
"""
value = self._check_update_value(value, "project override")
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

View file

@ -393,11 +393,15 @@ class DictMutableKeysEntity(EndpointEntity):
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)
@ -437,11 +441,11 @@ class DictMutableKeysEntity(EndpointEntity):
if not label:
label = metadata_labels.get(new_key)
child_entity.update_default_value(_value)
child_entity.update_default_value(_value, log_invalid_types)
if using_project_overrides:
child_entity.update_project_value(_value)
child_entity.update_project_value(_value, log_invalid_types)
elif using_studio_overrides:
child_entity.update_studio_value(_value)
child_entity.update_studio_value(_value, log_invalid_types)
if label:
children_label_by_id[child_entity.id] = label
@ -598,8 +602,11 @@ class DictMutableKeysEntity(EndpointEntity):
metadata[key] = value.pop(key)
return value, metadata
def update_default_value(self, value):
value = self._check_update_value(value, "default")
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:
@ -611,15 +618,21 @@ class DictMutableKeysEntity(EndpointEntity):
self._default_value = value
self._default_metadata = metadata
def update_studio_value(self, value):
value = self._check_update_value(value, "studio override")
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):
value = self._check_update_value(value, "project override")
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
@ -686,9 +699,12 @@ class DictMutableKeysEntity(EndpointEntity):
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
@ -709,9 +725,9 @@ class DictMutableKeysEntity(EndpointEntity):
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)
child_entity.update_default_value(_value, log_invalid_types)
if self._has_studio_override:
child_entity.update_studio_value(_value)
child_entity.update_studio_value(_value, log_invalid_types)
label = metadata_labels.get(_key)
if label:

View file

@ -90,18 +90,27 @@ class EndpointEntity(ItemEntity):
def require_restart(self):
return self.has_unsaved_changes
def update_default_value(self, value):
value = self._check_update_value(value, "default")
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):
value = self._check_update_value(value, "studio override")
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):
value = self._check_update_value(value, "project override")
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)
@ -590,22 +599,26 @@ class RawJsonEntity(InputEntity):
metadata[key] = value.pop(key)
return value, metadata
def update_default_value(self, value):
value = self._check_update_value(value, "default")
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):
value = self._check_update_value(value, "studio override")
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):
value = self._check_update_value(value, "project override")
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

View file

@ -173,14 +173,17 @@ class PathEntity(ItemEntity):
self._ignore_missing_defaults = ignore_missing_defaults
self.child_obj.set_override_state(state, ignore_missing_defaults)
def update_default_value(self, value):
self.child_obj.update_default_value(value)
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):
self.child_obj.update_project_value(value)
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):
self.child_obj.update_studio_value(value)
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)
@ -472,9 +475,9 @@ class ListStrictEntity(ItemEntity):
self._has_project_override = False
def _check_update_value(self, value, value_type):
def _check_update_value(self, value, value_type, log_invalid_types=True):
value = super(ListStrictEntity, self)._check_update_value(
value, value_type
value, value_type, log_invalid_types
)
if value is NOT_SET:
return value
@ -484,15 +487,16 @@ class ListStrictEntity(ItemEntity):
if value_len == child_len:
return value
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 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
@ -504,36 +508,51 @@ class ListStrictEntity(ItemEntity):
value.pop(child_len)
return value
def update_default_value(self, value):
value = self._check_update_value(value, "default")
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)
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)
self.children[idx].update_default_value(
item_value, log_invalid_types
)
def update_studio_value(self, value):
value = self._check_update_value(value, "studio override")
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)
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)
self.children[idx].update_studio_value(
item_value, log_invalid_types
)
def update_project_value(self, value):
value = self._check_update_value(value, "project override")
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)
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)
self.children[idx].update_project_value(
item_value, log_invalid_types
)
def reset_callbacks(self):
super(ListStrictEntity, self).reset_callbacks()

View file

@ -325,16 +325,24 @@ class ListEntity(EndpointEntity):
for item in value:
child_obj = self._add_new_item()
child_obj.update_default_value(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)
child_obj.update_project_value(
item, self._project_log_invalid_types
)
elif self.had_studio_override:
child_obj.update_studio_value(item)
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)
child_obj.update_studio_value(
item, self._studio_log_invalid_types
)
for child_obj in self.children:
child_obj.set_override_state(
@ -466,16 +474,24 @@ class ListEntity(EndpointEntity):
for item in value:
child_obj = self._add_new_item()
child_obj.update_default_value(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)
child_obj.update_project_value(
item, self._project_log_invalid_types
)
elif self.had_studio_override:
child_obj.update_studio_value(item)
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)
child_obj.update_studio_value(
item, self._studio_log_invalid_types
)
child_obj.set_override_state(
self._override_state, self._ignore_missing_defaults