From 16ae2913863602b003c548eb7e126c2e741a3ac8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 16 Dec 2021 15:46:45 +0100 Subject: [PATCH] adde abstract method to be able know if entity has children by a path key --- openpype/settings/entities/base_entity.py | 5 +++++ .../settings/entities/dict_conditional.py | 3 +++ .../entities/dict_immutable_keys_entity.py | 3 +++ .../entities/dict_mutable_keys_entity.py | 3 +++ openpype/settings/entities/input_entities.py | 3 +++ openpype/settings/entities/item_entities.py | 21 +++++++++++++++++++ openpype/settings/entities/list_entity.py | 16 ++++++++++++++ openpype/settings/entities/root_entities.py | 3 +++ 8 files changed, 57 insertions(+) diff --git a/openpype/settings/entities/base_entity.py b/openpype/settings/entities/base_entity.py index 341968bd75..cbc042d29d 100644 --- a/openpype/settings/entities/base_entity.py +++ b/openpype/settings/entities/base_entity.py @@ -235,6 +235,11 @@ class BaseItemEntity(BaseEntity): """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. diff --git a/openpype/settings/entities/dict_conditional.py b/openpype/settings/entities/dict_conditional.py index 5f1c172f31..92512a6668 100644 --- a/openpype/settings/entities/dict_conditional.py +++ b/openpype/settings/entities/dict_conditional.py @@ -107,6 +107,9 @@ class DictConditionalEntity(ItemEntity): 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 diff --git a/openpype/settings/entities/dict_immutable_keys_entity.py b/openpype/settings/entities/dict_immutable_keys_entity.py index 6131fa2ac7..c477a0eb0f 100644 --- a/openpype/settings/entities/dict_immutable_keys_entity.py +++ b/openpype/settings/entities/dict_immutable_keys_entity.py @@ -205,6 +205,9 @@ class DictImmutableKeysEntity(ItemEntity): ) 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: diff --git a/openpype/settings/entities/dict_mutable_keys_entity.py b/openpype/settings/entities/dict_mutable_keys_entity.py index cff346e9ea..97af9e5c81 100644 --- a/openpype/settings/entities/dict_mutable_keys_entity.py +++ b/openpype/settings/entities/dict_mutable_keys_entity.py @@ -191,6 +191,9 @@ class DictMutableKeysEntity(EndpointEntity): 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 = {} diff --git a/openpype/settings/entities/input_entities.py b/openpype/settings/entities/input_entities.py index a0598d405e..16893747a6 100644 --- a/openpype/settings/entities/input_entities.py +++ b/openpype/settings/entities/input_entities.py @@ -118,6 +118,9 @@ class InputEntity(EndpointEntity): 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__ diff --git a/openpype/settings/entities/item_entities.py b/openpype/settings/entities/item_entities.py index ff0a982900..9c6f428b97 100644 --- a/openpype/settings/entities/item_entities.py +++ b/openpype/settings/entities/item_entities.py @@ -1,3 +1,7 @@ +import re + +import six + from .lib import ( NOT_SET, STRING_TYPE, @@ -48,6 +52,9 @@ class PathEntity(ItemEntity): 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 @@ -197,6 +204,7 @@ class PathEntity(ItemEntity): class ListStrictEntity(ItemEntity): schema_types = ["list-strict"] + _key_regex = re.compile(r"[0-9]+") def __getitem__(self, idx): if not isinstance(idx, int): @@ -216,6 +224,19 @@ class ListStrictEntity(ItemEntity): 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 diff --git a/openpype/settings/entities/list_entity.py b/openpype/settings/entities/list_entity.py index 5d89a81351..0268c208bb 100644 --- a/openpype/settings/entities/list_entity.py +++ b/openpype/settings/entities/list_entity.py @@ -1,4 +1,6 @@ import copy +import six +import re from . import ( BaseEntity, EndpointEntity @@ -21,6 +23,7 @@ class ListEntity(EndpointEntity): "collapsible": True, "collapsed": False } + _key_regex = re.compile(r"[0-9]+") def __iter__(self): for item in self.children: @@ -144,6 +147,19 @@ class ListEntity(EndpointEntity): ) 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) diff --git a/openpype/settings/entities/root_entities.py b/openpype/settings/entities/root_entities.py index b8baed8a93..687784a359 100644 --- a/openpype/settings/entities/root_entities.py +++ b/openpype/settings/entities/root_entities.py @@ -127,6 +127,9 @@ class RootEntity(BaseItemEntity): 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()