diff --git a/openpype/lib/anatomy.py b/openpype/lib/anatomy.py index 3bcd6169e4..3d56c1f1ba 100644 --- a/openpype/lib/anatomy.py +++ b/openpype/lib/anatomy.py @@ -402,7 +402,9 @@ class AnatomyTemplates(TemplatesDict): return self.templates.get(key, default) def reset(self): + self._raw_templates = None self._templates = None + self._objected_templates = None @property def project_name(self): @@ -414,13 +416,21 @@ class AnatomyTemplates(TemplatesDict): @property def templates(self): + self._validate_discovery() + return self._templates + + @property + def objected_templates(self): + self._validate_discovery() + return self._objected_templates + + def _validate_discovery(self): if self.project_name != self.loaded_project: - self._templates = None + self.reset() if self._templates is None: self._discover() self.loaded_project = self.project_name - return self._templates def _format_value(self, value, data): if isinstance(value, RootItem): @@ -434,31 +444,34 @@ class AnatomyTemplates(TemplatesDict): def set_templates(self, templates): if not templates: - self._raw_templates = None - self._templates = None - else: - self._raw_templates = copy.deepcopy(templates) - templates = copy.deepcopy(templates) - v_queue = collections.deque() - v_queue.append(templates) - while v_queue: - item = v_queue.popleft() - if not isinstance(item, dict): - continue + self.reset() + return - for key in tuple(item.keys()): - value = item[key] - if isinstance(value, dict): - v_queue.append(value) + self._raw_templates = copy.deepcopy(templates) + templates = copy.deepcopy(templates) + v_queue = collections.deque() + v_queue.append(templates) + while v_queue: + item = v_queue.popleft() + if not isinstance(item, dict): + continue - elif ( - isinstance(value, StringType) - and "{task}" in value - ): - item[key] = value.replace("{task}", "{task[name]}") + for key in tuple(item.keys()): + value = item[key] + if isinstance(value, dict): + v_queue.append(value) - solved_templates = self.solve_template_inner_links(templates) - self._templates = self.create_ojected_templates(solved_templates) + elif ( + isinstance(value, StringType) + and "{task}" in value + ): + item[key] = value.replace("{task}", "{task[name]}") + + solved_templates = self.solve_template_inner_links(templates) + self._templates = solved_templates + self._objected_templates = self.create_ojected_templates( + solved_templates + ) def default_templates(self): """Return default templates data with solved inner keys.""" diff --git a/openpype/lib/path_templates.py b/openpype/lib/path_templates.py index 3b0e9ad3cc..370ffdd27c 100644 --- a/openpype/lib/path_templates.py +++ b/openpype/lib/path_templates.py @@ -227,15 +227,18 @@ class TemplatesDict(object): def __init__(self, templates=None): self._raw_templates = None self._templates = None + self._objected_templates = None self.set_templates(templates) def set_templates(self, templates): if templates is None: self._raw_templates = None self._templates = None + self._objected_templates = None elif isinstance(templates, dict): self._raw_templates = copy.deepcopy(templates) - self._templates = self.create_ojected_templates(templates) + self._templates = templates + self._objected_templates = self.create_ojected_templates(templates) else: raise TypeError("<{}> argument must be a dict, not {}.".format( self.__class__.__name__, str(type(templates)) @@ -255,6 +258,10 @@ class TemplatesDict(object): def templates(self): return self._templates + @property + def objected_templates(self): + return self._objected_templates + @classmethod def create_ojected_templates(cls, templates): if not isinstance(templates, dict): @@ -325,7 +332,7 @@ class TemplatesDict(object): if env_key not in data: data[env_key] = val - solved = self._solve_dict(self.templates, data) + solved = self._solve_dict(self.objected_templates, data) output = TemplatesResultDict(solved) output.strict = strict diff --git a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py index 8bbef9ad73..d15a865124 100644 --- a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py +++ b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py @@ -97,7 +97,6 @@ class CreateFolders(BaseAction): all_entities = self.get_notask_children(entity) anatomy = Anatomy(project_name) - project_settings = get_project_settings(project_name) work_keys = ["work", "folder"] work_template = anatomy.templates