From 51c3a7e0f7f4eeef5e5b1754fc6b6d9075f152ea Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 25 Jan 2021 11:37:57 +0100 Subject: [PATCH] metadata can't be defined on initialization as not all children are overriden --- pype/settings/entities/item_entities.py | 72 +++++++++++++++---------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/pype/settings/entities/item_entities.py b/pype/settings/entities/item_entities.py index a89631ad3e..e71464d2dd 100644 --- a/pype/settings/entities/item_entities.py +++ b/pype/settings/entities/item_entities.py @@ -204,6 +204,7 @@ class DictImmutableKeysEntity(ItemEntity): ) def on_change(self): + self.update_current_metadata() self.parent.on_child_change(self) def on_child_change(self, _child_obj): @@ -258,15 +259,6 @@ class DictImmutableKeysEntity(ItemEntity): self.gui_wrappers = [] self._add_children(self.schema_data) - if not self.is_group and not self.group_item: - groups = [] - for key, child_obj in self.non_gui_children.items(): - if child_obj.is_group: - groups.append(key) - - if groups: - self.current_metadata[M_OVERRIDEN_KEY] = groups - if self.is_dynamic_item: self.require_key = False @@ -278,8 +270,7 @@ class DictImmutableKeysEntity(ItemEntity): break if result_key is None: - # raise ValueError("Didn't found child {}".format(child_obj)) - print("NOT FOUND CHILD PATH", self.path) + raise ValueError("Didn't found child {}".format(child_obj)) return "/".join([self.path, result_key]) @@ -287,6 +278,47 @@ class DictImmutableKeysEntity(ItemEntity): for _key, _value in value.items(): self.non_gui_children[_key].set_value(_value) + def update_current_metadata(self): + # Define if current metadata are + metadata = NOT_SET + if self.override_state is OverrideState.PROJECT: + # metadata are NOT_SET if project overrides do not override this + # item + metadata = self.project_override_metadata + + if self.override_state is OverrideState.STUDIO or metadata is NOT_SET: + metadata = self.studio_override_metadata + + current_metadata = {} + for key, child_obj in self.non_gui_children.items(): + 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_OVERRIDEN_KEY not in current_metadata: + current_metadata[M_OVERRIDEN_KEY] = [] + current_metadata[M_OVERRIDEN_KEY].append(key) + + if current_metadata: + compare_metadata = current_metadata + else: + compare_metadata = NOT_SET + self.metadata_are_modified = compare_metadata != metadata + if self.metadata_are_modified: + print(self.path, compare_metadata, metadata) + self.current_metadata = current_metadata + def set_override_state(self, state): # Change has/had override states self.override_state = state @@ -300,25 +332,11 @@ class DictImmutableKeysEntity(ItemEntity): self.had_project_override = False self.has_project_override = self.had_project_override - # Define if current metadata are - metadata = NOT_SET - if state is OverrideState.PROJECT: - # metadata are NOT_SET if project overrides do not override this - # item - metadata = self.project_override_metadata - - if state is OverrideState.STUDIO or metadata is NOT_SET: - metadata = self.studio_override_metadata - - # This may happen when defaults are not filled - if metadata is NOT_SET: - self.metadata_are_modified = False - else: - self.metadata_are_modified = self.current_metadata != metadata - for child_obj in self.non_gui_children.values(): child_obj.set_override_state(state) + self.update_current_metadata() + @property def current_value(self): output = {}