diff --git a/client/ayon_core/hooks/pre_copy_template_workfile.py b/client/ayon_core/hooks/pre_copy_template_workfile.py index df2a0386b2..13f2f64565 100644 --- a/client/ayon_core/hooks/pre_copy_template_workfile.py +++ b/client/ayon_core/hooks/pre_copy_template_workfile.py @@ -60,13 +60,13 @@ class CopyTemplateWorkfile(PreLaunchHook): project_settings = get_project_settings(project_name) - project_doc = self.data.get("project_doc") + project_entity = self.data.get("project_entity") asset_doc = self.data.get("asset_doc") anatomy = self.data.get("anatomy") - if project_doc and asset_doc: + if project_entity and asset_doc: self.log.debug("Started filtering of custom template paths.") template_path = get_custom_workfile_template( - project_doc, + project_entity, asset_doc, task_name, host_name, diff --git a/client/ayon_core/hooks/pre_global_host_data.py b/client/ayon_core/hooks/pre_global_host_data.py index de6d4acc8b..b6cfe2d5d4 100644 --- a/client/ayon_core/hooks/pre_global_host_data.py +++ b/client/ayon_core/hooks/pre_global_host_data.py @@ -1,4 +1,5 @@ -from ayon_core.client import get_project, get_asset_by_name +from ayon_api import get_project, get_folder_by_path + from ayon_core.lib.applications import ( PreLaunchHook, EnvironmentPrepData, @@ -27,7 +28,7 @@ class GlobalHostDataHook(PreLaunchHook): "app": app, - "project_doc": self.data["project_doc"], + "project_entity": self.data["project_entity"], "asset_doc": self.data["asset_doc"], "anatomy": self.data["anatomy"], @@ -59,12 +60,15 @@ class GlobalHostDataHook(PreLaunchHook): return self.log.debug("Project name is set to \"{}\"".format(project_name)) - # Anatomy - self.data["anatomy"] = Anatomy(project_name) - # Project document - project_doc = get_project(project_name) - self.data["project_doc"] = project_doc + # Project Entity + project_entity = get_project(project_name) + self.data["project_entity"] = project_entity + + # Anatomy + self.data["anatomy"] = Anatomy( + project_name, project_entity=project_entity + ) asset_name = self.data.get("folder_path") if not asset_name: @@ -73,5 +77,5 @@ class GlobalHostDataHook(PreLaunchHook): ) return - asset_doc = get_asset_by_name(project_name, asset_name) - self.data["asset_doc"] = asset_doc + folder_entity = get_folder_by_path(project_name, asset_name) + self.data["folder_entity"] = folder_entity diff --git a/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py b/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py index 391332d368..b7fc431352 100644 --- a/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py +++ b/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py @@ -36,8 +36,8 @@ class FlamePrelaunch(PreLaunchHook): self.flame_pythonpath = _env["AYON_FLAME_PYTHONPATH"] """Hook entry method.""" - project_doc = self.data["project_doc"] - project_name = project_doc["name"] + project_entity = self.data["project_entity"] + project_name = project_entity["name"] volume_name = _env.get("FLAME_WIRETAP_VOLUME") # get image io @@ -63,20 +63,22 @@ class FlamePrelaunch(PreLaunchHook): hostname = socket.gethostname() # not returning wiretap host name self.log.debug("Collected user \"{}\"".format(user_name)) - self.log.info(pformat(project_doc)) - _db_p_data = project_doc["data"] - width = _db_p_data["resolutionWidth"] - height = _db_p_data["resolutionHeight"] - fps = float(_db_p_data["fps"]) + self.log.info(pformat(project_entity)) + project_attribs = project_entity["attrib"] + width = project_attribs["resolutionWidth"] + height = project_attribs["resolutionHeight"] + fps = float(project_attribs["fps"]) project_data = { - "Name": project_doc["name"], - "Nickname": _db_p_data["code"], + "Name": project_entity["name"], + "Nickname": project_entity["code"], "Description": "Created by OpenPype", - "SetupDir": project_doc["name"], + "SetupDir": project_entity["name"], "FrameWidth": int(width), "FrameHeight": int(height), - "AspectRatio": float((width / height) * _db_p_data["pixelAspect"]), + "AspectRatio": float( + (width / height) * project_attribs["pixelAspect"] + ), "FrameRate": self._get_flame_fps(fps) } diff --git a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py b/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py index a66ee9f2c0..66b2af7d2b 100644 --- a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py +++ b/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py @@ -219,7 +219,7 @@ class IntegrateBatchGroup(pyblish.api.InstancePlugin): # update task data in anatomy data project_task_types = anatomy_obj["tasks"] - task_code = project_task_types.get(task_type, {}).get("short_name") + task_code = project_task_types.get(task_type, {}).get("shortName") anatomy_data.update({ "task": { "name": task_name, @@ -321,13 +321,13 @@ class IntegrateBatchGroup(pyblish.api.InstancePlugin): )) def _get_shot_task_dir_path(self, instance, task_data): - project_doc = instance.data["projectEntity"] + project_entity = instance.data["projectEntity"] asset_entity = instance.data["assetEntity"] anatomy = instance.context.data["anatomy"] project_settings = instance.context.data["project_settings"] return get_workdir( - project_doc, + project_entity, asset_entity, task_data["name"], "flame", diff --git a/client/ayon_core/hosts/fusion/api/lib.py b/client/ayon_core/hosts/fusion/api/lib.py index b31f812c1b..47cfb284f7 100644 --- a/client/ayon_core/hosts/fusion/api/lib.py +++ b/client/ayon_core/hosts/fusion/api/lib.py @@ -4,18 +4,7 @@ import re import contextlib from ayon_core.lib import Logger -from ayon_core.client import ( - get_asset_by_name, - get_subset_by_name, - get_last_version_by_subset_id, - get_representation_by_id, - get_representation_by_name, - get_representation_parents, -) -from ayon_core.pipeline import ( - switch_container, - get_current_project_name, -) + from ayon_core.pipeline.context_tools import get_current_project_asset self = sys.modules[__name__] diff --git a/client/ayon_core/hosts/hiero/api/lib.py b/client/ayon_core/hosts/hiero/api/lib.py index ef0f9edca9..abf3690f9e 100644 --- a/client/ayon_core/hosts/hiero/api/lib.py +++ b/client/ayon_core/hosts/hiero/api/lib.py @@ -15,12 +15,12 @@ import shutil import hiero from qtpy import QtWidgets, QtCore +import ayon_api try: from PySide import QtXml except ImportError: from PySide2 import QtXml -from ayon_core.client import get_project from ayon_core.settings import get_project_settings from ayon_core.pipeline import ( Anatomy, @@ -654,17 +654,17 @@ def sync_avalon_data_to_workfile(): project.setProjectRoot(active_project_root) # get project data from avalon db - project_doc = get_project(project_name) - project_data = project_doc["data"] + project_entity = ayon_api.get_project(project_name) + project_attribs = project_entity["attrib"] - log.debug("project_data: {}".format(project_data)) + log.debug("project attributes: {}".format(project_attribs)) # get format and fps property from avalon db on project - width = project_data["resolutionWidth"] - height = project_data["resolutionHeight"] - pixel_aspect = project_data["pixelAspect"] - fps = project_data['fps'] - format_name = project_data['code'] + width = project_attribs["resolutionWidth"] + height = project_attribs["resolutionHeight"] + pixel_aspect = project_attribs["pixelAspect"] + fps = project_attribs["fps"] + format_name = project_entity["code"] # create new format in hiero project format = hiero.core.Format(width, height, pixel_aspect, format_name) diff --git a/client/ayon_core/hosts/hiero/api/tags.py b/client/ayon_core/hosts/hiero/api/tags.py index 6491b1f384..5d13dd98c3 100644 --- a/client/ayon_core/hosts/hiero/api/tags.py +++ b/client/ayon_core/hosts/hiero/api/tags.py @@ -3,7 +3,8 @@ import re import os import hiero -from ayon_core.client import get_project, get_assets +import ayon_api +from ayon_core.client import get_assets from ayon_core.lib import Logger from ayon_core.pipeline import get_current_project_name @@ -143,18 +144,19 @@ def add_tags_to_workfile(): # Get project task types. project_name = get_current_project_name() - project_doc = get_project(project_name) - tasks = project_doc["config"]["tasks"] + project_entity = ayon_api.get_project(project_name) + task_types = project_entity["taskType"] nks_pres_tags["[Tasks]"] = {} - log.debug("__ tasks: {}".format(tasks)) - for task_type in tasks.keys(): - nks_pres_tags["[Tasks]"][task_type.lower()] = { + log.debug("__ tasks: {}".format(task_types)) + for task_type in task_types: + task_type_name = task_type["name"] + nks_pres_tags["[Tasks]"][task_type_name.lower()] = { "editable": "1", - "note": task_type, + "note": task_type_name, "icon": "icons:TagGood.png", "metadata": { "productType": "task", - "type": task_type + "type": task_type_name } } diff --git a/client/ayon_core/hosts/hiero/plugins/load/load_effects.py b/client/ayon_core/hosts/hiero/plugins/load/load_effects.py index 809080e87e..39c355ebe0 100644 --- a/client/ayon_core/hosts/hiero/plugins/load/load_effects.py +++ b/client/ayon_core/hosts/hiero/plugins/load/load_effects.py @@ -2,9 +2,7 @@ import json from collections import OrderedDict import six -from ayon_core.client import ( - get_version_by_id -) +from ayon_core.client import get_version_by_id from ayon_core.pipeline import ( AVALON_CONTAINER_ID, diff --git a/client/ayon_core/hosts/houdini/api/lib.py b/client/ayon_core/hosts/houdini/api/lib.py index 9db055779d..ea62a1f0a6 100644 --- a/client/ayon_core/hosts/houdini/api/lib.py +++ b/client/ayon_core/hosts/houdini/api/lib.py @@ -9,9 +9,10 @@ import json from contextlib import contextmanager import six +import ayon_api from ayon_core.lib import StringTemplate -from ayon_core.client import get_project, get_asset_by_name +from ayon_core.client import get_asset_by_name from ayon_core.settings import get_current_project_settings from ayon_core.pipeline import ( Anatomy, @@ -839,8 +840,8 @@ def get_current_context_template_data_with_asset_data(): task_name = context["task_name"] host_name = get_current_host_name() - anatomy = Anatomy(project_name) - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) + anatomy = Anatomy(project_name, project_entity=project_entity) asset_doc = get_asset_by_name(project_name, asset_name) # get context specific vars @@ -858,7 +859,7 @@ def get_current_context_template_data_with_asset_data(): asset_data["frameEndHandle"] = frame_end + handle_end template_data = get_template_data( - project_doc, asset_doc, task_name, host_name + project_entity, asset_doc, task_name, host_name ) template_data["root"] = anatomy.roots template_data["assetData"] = asset_data diff --git a/client/ayon_core/hosts/max/api/lib.py b/client/ayon_core/hosts/max/api/lib.py index 05c3364e4a..5c8395a2ff 100644 --- a/client/ayon_core/hosts/max/api/lib.py +++ b/client/ayon_core/hosts/max/api/lib.py @@ -9,7 +9,9 @@ import six from ayon_core.pipeline import get_current_project_name, colorspace from ayon_core.settings import get_project_settings from ayon_core.pipeline.context_tools import ( - get_current_project, get_current_project_asset) + get_current_project_entity, + get_current_project_asset, +) from ayon_core.style import load_stylesheet from pymxs import runtime as rt @@ -220,16 +222,16 @@ def reset_scene_resolution(): Returns: None """ - data = ["data.resolutionWidth", "data.resolutionHeight"] - project_resolution = get_current_project(fields=data) - project_resolution_data = project_resolution["data"] - asset_resolution = get_current_project_asset(fields=data) - asset_resolution_data = asset_resolution["data"] + fields = ["attrib.resolutionWidth", "attrib.resolutionHeight"] + project_entity = get_current_project_entity(fields=fields) + project_attribs = project_entity["attrib"] + asset_doc = get_current_project_asset(fields=fields) + asset_data = asset_doc["data"] # Set project resolution - project_width = int(project_resolution_data.get("resolutionWidth", 1920)) - project_height = int(project_resolution_data.get("resolutionHeight", 1080)) - width = int(asset_resolution_data.get("resolutionWidth", project_width)) - height = int(asset_resolution_data.get("resolutionHeight", project_height)) + project_width = int(project_attribs.get("resolutionWidth", 1920)) + project_height = int(project_attribs.get("resolutionHeight", 1080)) + width = int(asset_data.get("resolutionWidth", project_width)) + height = int(asset_data.get("resolutionHeight", project_height)) set_scene_resolution(width, height) diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py b/client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py index 0058d3b262..1913e77210 100644 --- a/client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py +++ b/client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py @@ -43,8 +43,8 @@ class ValidateResolutionSetting(pyblish.api.InstancePlugin, def get_db_resolution(self, instance): asset_doc = instance.data["assetEntity"] - project_doc = instance.context.data["projectEntity"] - for data in [asset_doc["data"], project_doc["data"]]: + project_entity = instance.context.data["projectEntity"] + for data in [asset_doc["data"], project_entity["attrib"]]: if "resolutionWidth" in data and "resolutionHeight" in data: width = data["resolutionWidth"] height = data["resolutionHeight"] diff --git a/client/ayon_core/hosts/maya/api/commands.py b/client/ayon_core/hosts/maya/api/commands.py index f69dca97a8..ad669980df 100644 --- a/client/ayon_core/hosts/maya/api/commands.py +++ b/client/ayon_core/hosts/maya/api/commands.py @@ -2,7 +2,9 @@ """OpenPype script commands to be used directly in Maya.""" from maya import cmds -from ayon_core.client import get_asset_by_name, get_project +from ayon_api import get_project + +from ayon_core.client import get_asset_by_name from ayon_core.pipeline import get_current_project_name, get_current_asset_name @@ -39,16 +41,22 @@ class ToolWindows: def _resolution_from_document(doc): - if not doc or "data" not in doc: - print("Entered document is not valid. \"{}\"".format(str(doc))) + if not doc: + print("Entered document is not valid. \"{}\"".format( + str(doc) + )) return None - resolution_width = doc["data"].get("resolutionWidth") - resolution_height = doc["data"].get("resolutionHeight") + attributes = doc.get("attrib") + if attributes is None: + attributes = doc.get("data", {}) + + resolution_width = attributes.get("resolutionWidth") + resolution_height = attributes.get("resolutionHeight") # Backwards compatibility if resolution_width is None or resolution_height is None: - resolution_width = doc["data"].get("resolution_width") - resolution_height = doc["data"].get("resolution_height") + resolution_width = attributes.get("resolution_width") + resolution_height = attributes.get("resolution_height") # Make sure both width and height are set if resolution_width is None or resolution_height is None: @@ -77,8 +85,8 @@ def reset_resolution(): "Asset \"{}\" does not have set resolution." " Trying to get resolution from project" ).format(asset_name)) - project_doc = get_project(project_name) - resolution = _resolution_from_document(project_doc) + project_entity = get_project(project_name) + resolution = _resolution_from_document(project_entity) if resolution is None: msg = "Using default resolution {}x{}" diff --git a/client/ayon_core/hosts/maya/api/lib.py b/client/ayon_core/hosts/maya/api/lib.py index 1aa2244111..dc242ebd15 100644 --- a/client/ayon_core/hosts/maya/api/lib.py +++ b/client/ayon_core/hosts/maya/api/lib.py @@ -19,8 +19,9 @@ from six import string_types from maya import cmds, mel from maya.api import OpenMaya +import ayon_api + from ayon_core.client import ( - get_project, get_asset_by_name, get_subsets, get_last_versions, @@ -2504,8 +2505,10 @@ def get_fps_for_current_context(): ) or {} fps = asset_doc.get("data", {}).get("fps") if not fps: - project_doc = get_project(project_name, fields=["data.fps"]) or {} - fps = project_doc.get("data", {}).get("fps") + project_entity = ayon_api.get_project( + project_name, fields=["attrib.fps"] + ) or {} + fps = project_entity.get("attrib", {}).get("fps") if not fps: fps = 25 @@ -2624,8 +2627,8 @@ def reset_scene_resolution(): """ project_name = get_current_project_name() - project_doc = get_project(project_name) - project_data = project_doc["data"] + project_entity = ayon_api.get_project(project_name) + project_attribs = project_entity["attrib"] asset_data = get_current_project_asset()["data"] # Set project resolution @@ -2633,10 +2636,10 @@ def reset_scene_resolution(): height_key = "resolutionHeight" pixelAspect_key = "pixelAspect" - width = asset_data.get(width_key, project_data.get(width_key, 1920)) - height = asset_data.get(height_key, project_data.get(height_key, 1080)) + width = asset_data.get(width_key, project_attribs.get(width_key, 1920)) + height = asset_data.get(height_key, project_attribs.get(height_key, 1080)) pixelAspect = asset_data.get(pixelAspect_key, - project_data.get(pixelAspect_key, 1)) + project_attribs.get(pixelAspect_key, 1)) set_scene_resolution(width, height, pixelAspect) diff --git a/client/ayon_core/hosts/maya/api/setdress.py b/client/ayon_core/hosts/maya/api/setdress.py index 8d09716bf6..ab2da93d64 100644 --- a/client/ayon_core/hosts/maya/api/setdress.py +++ b/client/ayon_core/hosts/maya/api/setdress.py @@ -296,7 +296,7 @@ def update_package_version(container, version): assert current_representation is not None, "This is a bug" - version_doc, subset_doc, asset_doc, project_doc = ( + version_doc, subset_doc, asset_doc, project_entity = ( get_representation_parents(project_name, current_representation) ) diff --git a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py b/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py index 03ca8661bd..3fd81ceff4 100644 --- a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py +++ b/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py @@ -11,11 +11,13 @@ class PreCopyMel(PreLaunchHook): launch_types = {LaunchTypes.local} def execute(self): - project_doc = self.data["project_doc"] + project_entity = self.data["project_entity"] workdir = self.launch_context.env.get("AYON_WORKDIR") if not workdir: self.log.warning("BUG: Workdir is not filled.") return project_settings = self.data["project_settings"] - create_workspace_mel(workdir, project_doc["name"], project_settings) + create_workspace_mel( + workdir, project_entity["name"], project_settings + ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py b/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py index ff552f566d..1a35f1b764 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py +++ b/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py @@ -85,8 +85,8 @@ class ValidateResolution(pyblish.api.InstancePlugin, @classmethod def get_db_resolution(cls, instance): asset_doc = instance.data["assetEntity"] - project_doc = instance.context.data["projectEntity"] - for data in [asset_doc["data"], project_doc["data"]]: + project_entity = instance.context.data["projectEntity"] + for data in [asset_doc["data"], project_entity["attrib"]]: if ( "resolutionWidth" in data and "resolutionHeight" in data and diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index e304b33dc7..f745d4ff4b 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -12,9 +12,9 @@ from collections import OrderedDict import nuke from qtpy import QtCore, QtWidgets +import ayon_api from ayon_core.client import ( - get_project, get_asset_by_name, get_versions, get_last_versions, @@ -128,7 +128,7 @@ class Context: workfiles_tool_timer = None # Seems unused - _project_doc = None + _project_entity = None def get_main_window(): @@ -1453,14 +1453,14 @@ class WorkfileSettings(object): """ def __init__(self, root_node=None, nodes=None, **kwargs): - project_doc = kwargs.get("project") - if project_doc is None: + project_entity = kwargs.get("project") + if project_entity is None: project_name = get_current_project_name() - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) else: - project_name = project_doc["name"] + project_name = project_entity["name"] - Context._project_doc = project_doc + Context._project_entity = project_entity self._project_name = project_name self._asset = get_current_asset_name() self._asset_entity = get_asset_by_name(project_name, self._asset) diff --git a/client/ayon_core/hosts/traypublisher/api/editorial.py b/client/ayon_core/hosts/traypublisher/api/editorial.py index 6153bc5752..7cdfb0b699 100644 --- a/client/ayon_core/hosts/traypublisher/api/editorial.py +++ b/client/ayon_core/hosts/traypublisher/api/editorial.py @@ -184,7 +184,7 @@ class ShotMetadataSolver: # in case first parent is project then start parents from start if ( _index == 0 - and parent_token_type == "Project" + and parent_token_type == "project" ): project_parent = parents[0] parents = [project_parent] @@ -209,14 +209,14 @@ class ShotMetadataSolver: return "/".join( [ p["entity_name"] for p in parents - if p["entity_type"] != "Project" + if p["entity_type"] != "project" ] ) if parents else "" def _get_parents_from_selected_asset( self, asset_doc, - project_doc + project_entity ): """Returning parents from context on selected asset. @@ -224,12 +224,12 @@ class ShotMetadataSolver: Args: asset_doc (db obj): selected asset doc - project_doc (db obj): actual project doc + project_entity (dict[str, Any]): Project entity. Returns: list: list of dict parent components """ - project_name = project_doc["name"] + project_name = project_entity["name"] visual_hierarchy = [asset_doc] current_doc = asset_doc @@ -242,25 +242,28 @@ class ShotMetadataSolver: visual_parent = get_asset_by_id(project_name, visual_parent_id) if not visual_parent: - visual_hierarchy.append(project_doc) break visual_hierarchy.append(visual_parent) current_doc = visual_parent # add current selection context hierarchy - return [ - { + output = [] + for entity in reversed(visual_hierarchy): + output.append({ "entity_type": entity["data"]["entityType"], "entity_name": entity["name"] - } - for entity in reversed(visual_hierarchy) - ] + }) + output.append({ + "entity_type": "project", + "entity_name": project_name, + }) + return output - def _generate_tasks_from_settings(self, project_doc): + def _generate_tasks_from_settings(self, project_entity): """Convert settings inputs to task data. Args: - project_doc (db obj): actual project doc + project_entity (dict): Project entity. Raises: KeyError: Missing task type in project doc @@ -270,19 +273,23 @@ class ShotMetadataSolver: """ tasks_to_add = {} - project_task_types = project_doc["config"]["tasks"] + project_task_types = project_entity["taskTypes"] + task_type_names = { + task_type["name"] + for task_type in project_task_types + } for task_item in self.shot_add_tasks: task_name = task_item["name"] task_type = task_item["task_type"] # check if task type in project task types - if task_type not in project_task_types.keys(): + if task_type not in task_type_names: raise KeyError( "Missing task type `{}` for `{}` is not" " existing in `{}``".format( task_type, task_name, - list(project_task_types.keys()) + list(task_type_names) ) ) tasks_to_add[task_name] = {"type": task_type} @@ -304,7 +311,7 @@ class ShotMetadataSolver: tasks = {} asset_doc = source_data["selected_asset_doc"] - project_doc = source_data["project_doc"] + project_entity = source_data["project_entity"] # match clip to shot name at start shot_name = clip_name @@ -313,7 +320,9 @@ class ShotMetadataSolver: formatting_data = self._generate_tokens(shot_name, source_data) # generate parents from selected asset - parents = self._get_parents_from_selected_asset(asset_doc, project_doc) + parents = self._get_parents_from_selected_asset( + asset_doc, project_entity + ) if self.shot_rename["enabled"]: shot_name = self._rename_template(formatting_data) @@ -325,7 +334,7 @@ class ShotMetadataSolver: if self.shot_add_tasks: tasks = self._generate_tasks_from_settings( - project_doc) + project_entity) # generate hierarchy path from parents hierarchy_path = self._create_hierarchy_path(parents) diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py index a7abd3e6db..8ef96ed302 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py @@ -1,11 +1,10 @@ import os from copy import deepcopy -import opentimelineio as otio -from ayon_core.client import ( - get_asset_by_name, - get_project -) +import opentimelineio as otio +import ayon_api + +from ayon_core.client import get_asset_by_name from ayon_core.hosts.traypublisher.api.plugin import ( TrayPublishCreator, HiddenTrayPublishCreator @@ -628,7 +627,7 @@ or updating already created. Publishing will create OTIO file. # basic unique asset name clip_name = os.path.splitext(otio_clip.name)[0] - project_doc = get_project(self.project_name) + project_entity = ayon_api.get_project(self.project_name) shot_name, shot_metadata = self._shot_metadata_solver.generate_data( clip_name, @@ -636,14 +635,14 @@ or updating already created. Publishing will create OTIO file. "anatomy_data": { "project": { "name": self.project_name, - "code": project_doc["data"]["code"] + "code": project_entity["code"] }, "parent": parent_asset_name, "app": self.host_name }, "selected_asset_doc": get_asset_by_name( self.project_name, parent_asset_name), - "project_doc": project_doc + "project_entity": project_entity } ) diff --git a/client/ayon_core/hosts/unreal/hooks/pre_workfile_preparation.py b/client/ayon_core/hosts/unreal/hooks/pre_workfile_preparation.py index 0eaa1adb84..a8feaa31d8 100644 --- a/client/ayon_core/hosts/unreal/hooks/pre_workfile_preparation.py +++ b/client/ayon_core/hosts/unreal/hooks/pre_workfile_preparation.py @@ -49,7 +49,7 @@ class UnrealPrelaunchHook(PreLaunchHook): # Prepare data for fill data and for getting workfile template key anatomy = self.data["anatomy"] - project_doc = self.data["project_doc"] + project_entity = self.data["project_entity"] # Use already prepared workdir data workdir_data = copy.deepcopy(self.data["workdir_data"]) @@ -63,7 +63,7 @@ class UnrealPrelaunchHook(PreLaunchHook): workfile_template_key = get_workfile_template_key( task_type, self.host_name, - project_name=project_doc["name"] + project_name=project_entity["name"] ) # Fill templates template_obj = anatomy.templates_obj[workfile_template_key]["file"] diff --git a/client/ayon_core/lib/applications.py b/client/ayon_core/lib/applications.py index 8f1a1d10ea..866a616518 100644 --- a/client/ayon_core/lib/applications.py +++ b/client/ayon_core/lib/applications.py @@ -1381,7 +1381,7 @@ class EnvironmentPrepData(dict): data (dict): Data must contain required keys. """ required_keys = ( - "project_doc", "asset_doc", "task_name", "app", "anatomy" + "project_entity", "asset_doc", "task_name", "app", "anatomy" ) def __init__(self, data): @@ -1395,7 +1395,7 @@ class EnvironmentPrepData(dict): if data.get("env") is None: data["env"] = os.environ.copy() - project_name = data["project_doc"]["name"] + project_name = data["project_entity"]["name"] if "project_settings" not in data: data["project_settings"] = get_project_settings(project_name) @@ -1674,10 +1674,10 @@ def prepare_context_environments(data, env_group=None, addons_manager=None): # Context environments log = data["log"] - project_doc = data["project_doc"] + project_entity = data["project_entity"] asset_doc = data["asset_doc"] task_name = data["task_name"] - if not project_doc: + if not project_entity: log.info( "Skipping context environments preparation." " Launch context does not contain required data." @@ -1685,13 +1685,13 @@ def prepare_context_environments(data, env_group=None, addons_manager=None): return # Load project specific environments - project_name = project_doc["name"] + project_name = project_entity["name"] project_settings = get_project_settings(project_name) data["project_settings"] = project_settings app = data["app"] context_env = { - "AYON_PROJECT_NAME": project_doc["name"], + "AYON_PROJECT_NAME": project_entity["name"], "AYON_APP_NAME": app.full_name } if asset_doc: @@ -1727,7 +1727,7 @@ def prepare_context_environments(data, env_group=None, addons_manager=None): ) workdir_data = get_template_data( - project_doc, asset_doc, task_name, app.host_name, project_settings + project_entity, asset_doc, task_name, app.host_name, project_settings ) data["workdir_data"] = workdir_data diff --git a/client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py b/client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py index 5ef9033ffe..72187c6d28 100644 --- a/client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py +++ b/client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py @@ -1,4 +1,5 @@ -from ayon_core.client import get_projects, get_project +import ayon_api + from openpype_modules.clockify.clockify_api import ClockifyAPI from ayon_core.pipeline import LauncherAction @@ -21,7 +22,7 @@ class ClockifySync(LauncherAction): def is_compatible(self, session): """Check if there's some projects to sync""" try: - next(get_projects()) + next(ayon_api.get_projects()) return True except StopIteration: return False @@ -38,16 +39,18 @@ class ClockifySync(LauncherAction): ) project_name = session.get("AYON_PROJECT_NAME") or "" - projects_to_sync = [] if project_name.strip(): - projects_to_sync = [get_project(project_name)] + projects_to_sync = [ayon_api.get_project(project_name)] else: - projects_to_sync = get_projects() + projects_to_sync = ayon_api.get_projects() - projects_info = {} - for project in projects_to_sync: - task_types = project["config"]["tasks"].keys() - projects_info[project["name"]] = task_types + projects_info = { + project["name"]: { + task_type["name"] + for task_type in project["taskTypes"] + } + for project in projects_to_sync + } clockify_projects = self.clockify_api.get_projects(workspace_id) for project_name, task_types in projects_info.items(): diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index 3e95049e56..ef146b5d79 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -8,9 +8,7 @@ import requests import pyblish.api -from ayon_core.client import ( - get_last_version_by_subset_name, -) +from ayon_core.client import get_last_version_by_subset_name from ayon_core.pipeline import publish from ayon_core.lib import EnumDef, is_in_tests from ayon_core.pipeline.version_start import get_versioning_start diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 7bc13ae4b6..c512dc570c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -9,9 +9,7 @@ import clique import pyblish.api -from ayon_core.client import ( - get_last_version_by_subset_name, -) +from ayon_core.client import get_last_version_by_subset_name from ayon_core.pipeline import publish from ayon_core.lib import EnumDef, is_in_tests from ayon_core.pipeline.version_start import get_versioning_start diff --git a/client/ayon_core/pipeline/anatomy.py b/client/ayon_core/pipeline/anatomy.py index e7833a9a15..6ba5175a2a 100644 --- a/client/ayon_core/pipeline/anatomy.py +++ b/client/ayon_core/pipeline/anatomy.py @@ -4,11 +4,11 @@ import copy import platform import collections import numbers - -import six import time -from ayon_core.client import get_project, get_ayon_server_api_connection +import six +import ayon_api + from ayon_core.lib import Logger, get_local_site_id from ayon_core.lib.path_templates import ( TemplateUnsolved, @@ -50,13 +50,13 @@ class BaseAnatomy(object): root_key_regex = re.compile(r"{(root?[^}]+)}") root_name_regex = re.compile(r"root\[([^]]+)\]") - def __init__(self, project_doc, root_overrides=None): - project_name = project_doc["name"] + def __init__(self, project_entity, root_overrides=None): + project_name = project_entity["name"] self.project_name = project_name - self.project_code = project_doc["data"]["code"] + self.project_code = project_entity["code"] self._data = self._prepare_anatomy_data( - project_doc, root_overrides + project_entity, root_overrides ) self._templates_obj = AnatomyTemplates(self) self._roots_obj = Roots(self) @@ -78,13 +78,13 @@ class BaseAnatomy(object): def items(self): return copy.deepcopy(self._data).items() - def _prepare_anatomy_data(self, project_doc, root_overrides): + def _prepare_anatomy_data(self, project_entity, root_overrides): """Prepare anatomy data for further processing. Method added to replace `{task}` with `{task[name]}` in templates. """ - anatomy_data = self._project_doc_to_anatomy_data(project_doc) + anatomy_data = self._project_entity_to_anatomy_data(project_entity) self._apply_local_settings_on_anatomy_data( anatomy_data, @@ -311,14 +311,21 @@ class BaseAnatomy(object): data = self.root_environmets_fill_data(template) return rootless_path.format(**data) - def _project_doc_to_anatomy_data(self, project_doc): + def _project_entity_to_anatomy_data(self, project_entity): """Convert project document to anatomy data. Probably should fill missing keys and values. """ - output = copy.deepcopy(project_doc["config"]) - output["attributes"] = copy.deepcopy(project_doc["data"]) + output = copy.deepcopy(project_entity["config"]) + # TODO remove AYON convertion + task_types = copy.deepcopy(project_entity["taskTypes"]) + new_task_types = {} + for task_type in task_types: + name = task_type["name"] + new_task_types[name] = task_type + output["tasks"] = new_task_types + output["attributes"] = copy.deepcopy(project_entity["attrib"]) return output @@ -418,7 +425,9 @@ class Anatomy(BaseAnatomy): lambda: collections.defaultdict(CacheItem) ) - def __init__(self, project_name=None, site_name=None): + def __init__( + self, project_name=None, site_name=None, project_entity=None + ): if not project_name: project_name = os.environ.get("AYON_PROJECT_NAME") @@ -428,16 +437,19 @@ class Anatomy(BaseAnatomy): " to load data for specific project." )) - project_doc = self.get_project_doc_from_cache(project_name) - root_overrides = self._get_site_root_overrides(project_name, site_name) + if not project_entity: + project_entity = self.get_project_entity_from_cache(project_name) + root_overrides = self._get_site_root_overrides( + project_name, site_name + ) - super(Anatomy, self).__init__(project_doc, root_overrides) + super(Anatomy, self).__init__(project_entity, root_overrides) @classmethod - def get_project_doc_from_cache(cls, project_name): + def get_project_entity_from_cache(cls, project_name): project_cache = cls._project_cache[project_name] if project_cache.is_outdated: - project_cache.update_data(get_project(project_name)) + project_cache.update_data(ayon_api.get_project(project_name)) return copy.deepcopy(project_cache.data) @classmethod @@ -468,8 +480,7 @@ class Anatomy(BaseAnatomy): """ if not project_name: return - con = get_ayon_server_api_connection() - return con.get_project_roots_for_site( + return ayon_api.get_project_roots_for_site( project_name, get_local_site_id() ) @@ -642,13 +653,76 @@ class AnatomyTemplates(TemplatesDict): return self._solve_dict(value, data) return super(AnatomyTemplates, self)._format_value(value, data) + @staticmethod + def _ayon_template_conversion(templates): + def _convert_template_item(template_item): + # Change 'directory' to 'folder' + if "directory" in template_item: + template_item["folder"] = template_item["directory"] + + if ( + "path" not in template_item + and "file" in template_item + and "folder" in template_item + ): + template_item["path"] = "/".join( + (template_item["folder"], template_item["file"]) + ) + + def _get_default_template_name(templates): + default_template = None + for name, template in templates.items(): + if name == "default": + return "default" + + if default_template is None: + default_template = name + + return default_template + + def _fill_template_category(templates, cat_templates, cat_key): + default_template_name = _get_default_template_name(cat_templates) + for template_name, cat_template in cat_templates.items(): + _convert_template_item(cat_template) + if template_name == default_template_name: + templates[cat_key] = cat_template + else: + new_name = "{}_{}".format(cat_key, template_name) + templates["others"][new_name] = cat_template + + others_templates = templates.pop("others", None) or {} + new_others_templates = {} + templates["others"] = new_others_templates + for name, template in others_templates.items(): + _convert_template_item(template) + new_others_templates[name] = template + + for key in ( + "work", + "publish", + "hero", + ): + cat_templates = templates.pop(key) + _fill_template_category(templates, cat_templates, key) + + delivery_templates = templates.pop("delivery", None) or {} + new_delivery_templates = {} + for name, delivery_template in delivery_templates.items(): + new_delivery_templates[name] = "/".join( + (delivery_template["directory"], delivery_template["file"]) + ) + templates["delivery"] = new_delivery_templates + def set_templates(self, templates): if not templates: self.reset() return - self._raw_templates = copy.deepcopy(templates) templates = copy.deepcopy(templates) + # TODO remove AYON convertion + self._ayon_template_conversion(templates) + + self._raw_templates = copy.deepcopy(templates) v_queue = collections.deque() v_queue.append(templates) while v_queue: @@ -834,7 +908,7 @@ class AnatomyTemplates(TemplatesDict): key_2: "value_2" key_4: "value_3/value_2" """ - default_key_values = templates.pop("defaults", {}) + default_key_values = templates.pop("common", {}) for key, value in tuple(templates.items()): if isinstance(value, dict): continue diff --git a/client/ayon_core/pipeline/context_tools.py b/client/ayon_core/pipeline/context_tools.py index 86b3d770b4..7fa3def33a 100644 --- a/client/ayon_core/pipeline/context_tools.py +++ b/client/ayon_core/pipeline/context_tools.py @@ -6,13 +6,13 @@ import logging import platform import uuid +import ayon_api import pyblish.api from pyblish.lib import MessageHandler from ayon_core import AYON_CORE_ROOT from ayon_core.host import HostBase from ayon_core.client import ( - get_project, get_asset_by_id, get_asset_by_name, version_is_latest, @@ -399,7 +399,7 @@ def get_current_task_name(): return get_global_context()["task_name"] -def get_current_project(fields=None): +def get_current_project_entity(fields=None): """Helper function to get project document based on global Session. This function should be called only in process where host is installed. @@ -410,7 +410,7 @@ def get_current_project(fields=None): """ project_name = get_current_project_name() - return get_project(project_name, fields=fields) + return ayon_api.get_project(project_name, fields=fields) def get_current_project_asset(asset_name=None, asset_id=None, fields=None): @@ -605,10 +605,10 @@ def change_current_context(asset_doc, task_name, template_key=None): project_name = get_current_project_name() workdir = None if asset_doc: - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) host_name = get_current_host_name() workdir = get_workdir( - project_doc, + project_entity, asset_doc, task_name, host_name, diff --git a/client/ayon_core/pipeline/load/utils.py b/client/ayon_core/pipeline/load/utils.py index 056836d712..443dc6df8e 100644 --- a/client/ayon_core/pipeline/load/utils.py +++ b/client/ayon_core/pipeline/load/utils.py @@ -1,15 +1,15 @@ import os import platform import copy -import getpass import logging import inspect import collections import numbers +import ayon_api + from ayon_core.host import ILoadHost from ayon_core.client import ( - get_project, get_assets, get_subsets, get_versions, @@ -165,17 +165,14 @@ def get_contexts_for_repre_docs(project_name, repre_docs): for asset_doc in asset_docs } - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) for repre_id, repre_doc in repre_docs_by_id.items(): version_doc = version_docs_by_id[repre_doc["parent"]] subset_doc = subset_docs_by_id[version_doc["parent"]] asset_doc = asset_docs_by_id[subset_doc["parent"]] context = { - "project": { - "name": project_doc["name"], - "code": project_doc["data"].get("code") - }, + "project": project_entity, "asset": asset_doc, "subset": subset_doc, "version": version_doc, @@ -218,15 +215,12 @@ def get_subset_contexts(subset_ids, project_name=None): for asset_doc in asset_docs } - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) for subset_id, subset_doc in subset_docs_by_id.items(): asset_doc = asset_docs_by_id[subset_doc["parent"]] context = { - "project": { - "name": project_doc["name"], - "code": project_doc["data"].get("code") - }, + "project": project_entity, "asset": asset_doc, "subset": subset_doc } @@ -557,10 +551,13 @@ def get_representation_path_from_context(context): from ayon_core.pipeline import get_current_project_name representation = context["representation"] - project_doc = context.get("project") + project_entity = context.get("project") root = None - if project_doc and project_doc["name"] != get_current_project_name(): - anatomy = Anatomy(project_doc["name"]) + if ( + project_entity + and project_entity["name"] != get_current_project_name() + ): + anatomy = Anatomy(project_entity["name"]) root = anatomy.roots return get_representation_path(representation, root) diff --git a/client/ayon_core/pipeline/template_data.py b/client/ayon_core/pipeline/template_data.py index e9c57521d4..8ecba828a6 100644 --- a/client/ayon_core/pipeline/template_data.py +++ b/client/ayon_core/pipeline/template_data.py @@ -1,4 +1,5 @@ -from ayon_core.client import get_project, get_asset_by_name +import ayon_api +from ayon_core.client import get_asset_by_name from ayon_core.settings import get_studio_settings from ayon_core.lib.local_settings import get_ayon_username @@ -27,13 +28,13 @@ def get_general_template_data(settings=None): } -def get_project_template_data(project_doc=None, project_name=None): +def get_project_template_data(project_entity=None, project_name=None): """Extract data from project document that are used in templates. Project document must have 'name' and (at this moment) optional key 'data.code'. - One of 'project_name' or 'project_doc' must be passed. With prepared + One of 'project_name' or 'project_entity' must be passed. With prepared project document is function much faster because don't have to query. Output contains formatting keys: @@ -41,7 +42,7 @@ def get_project_template_data(project_doc=None, project_name=None): - 'project[code]' - Project code Args: - project_doc (Dict[str, Any]): Queried project document. + project_entity (Dict[str, Any]): Queried project entity. project_name (str): Name of project. Returns: @@ -49,12 +50,12 @@ def get_project_template_data(project_doc=None, project_name=None): """ if not project_name: - project_name = project_doc["name"] + project_name = project_entity["name"] - if not project_doc: - project_doc = get_project(project_name, fields=["data.code"]) + if not project_entity: + project_entity = ayon_api.get_project(project_name, fields=["code"]) - project_code = project_doc.get("data", {}).get("code") + project_code = project_entity["code"] return { "project": { "name": project_name, @@ -120,15 +121,15 @@ def get_task_type(asset_doc, task_name): return asset_tasks_info.get(task_name, {}).get("type") -def get_task_template_data(project_doc, asset_doc, task_name): +def get_task_template_data(project_entity, asset_doc, task_name): """"Extract task specific data from project and asset documents. Required document fields: - Project: 'config.tasks' + Project: 'tasksTypes' Asset: 'data.tasks'. Args: - project_doc (Dict[str, Any]): Queried project document. + project_entity (Dict[str, Any]): Queried project entity. asset_doc (Dict[str, Any]): Queried asset document. task_name (str): Name of task for which data should be returned. @@ -136,9 +137,10 @@ def get_task_template_data(project_doc, asset_doc, task_name): Dict[str, Dict[str, str]]: Template data """ - project_task_types = project_doc["config"]["tasks"] + project_task_types = project_entity["taskTypes"] + task_types_by_name = {task["name"]: task for task in project_task_types} task_type = get_task_type(asset_doc, task_name) - task_code = project_task_types.get(task_type, {}).get("short_name") + task_code = task_types_by_name.get(task_type, {}).get("shortName") return { "task": { @@ -150,7 +152,7 @@ def get_task_template_data(project_doc, asset_doc, task_name): def get_template_data( - project_doc, + project_entity, asset_doc=None, task_name=None, host_name=None, @@ -166,11 +168,11 @@ def get_template_data( and their values won't be added to template data if are not passed. Required document fields: - Project: 'name', 'data.code', 'config.tasks' + Project: 'name', 'code', 'taskTypes.name' Asset: 'name', 'data.parents', 'data.tasks' Args: - project_doc (Dict[str, Any]): Mongo document of project from MongoDB. + project_entity (Dict[str, Any]): Project entity. asset_doc (Dict[str, Any]): Mongo document of asset from MongoDB. task_name (Union[str, None]): Task name under passed asset. host_name (Union[str, None]): Used to fill '{app}' key. @@ -182,14 +184,14 @@ def get_template_data( """ template_data = get_general_template_data(settings) - template_data.update(get_project_template_data(project_doc)) + template_data.update(get_project_template_data(project_entity)) if asset_doc: template_data.update(get_asset_template_data( - asset_doc, project_doc["name"] + asset_doc, project_entity["name"] )) if task_name: template_data.update(get_task_template_data( - project_doc, asset_doc, task_name + project_entity, asset_doc, task_name )) if host_name: @@ -225,9 +227,7 @@ def get_template_data_with_names( Dict[str, Any]: Data prepared for filling workdir template. """ - project_doc = get_project( - project_name, fields=["name", "data.code", "config.tasks"] - ) + project_entity = ayon_api.get_project(project_name) asset_doc = None if asset_name: asset_doc = get_asset_by_name( @@ -236,5 +236,5 @@ def get_template_data_with_names( fields=["name", "data.parents", "data.tasks"] ) return get_template_data( - project_doc, asset_doc, task_name, host_name, settings + project_entity, asset_doc, task_name, host_name, settings ) diff --git a/client/ayon_core/pipeline/usdlib.py b/client/ayon_core/pipeline/usdlib.py index 2a5a317d72..971caa7b87 100644 --- a/client/ayon_core/pipeline/usdlib.py +++ b/client/ayon_core/pipeline/usdlib.py @@ -2,14 +2,16 @@ import os import re import logging +import ayon_api try: from pxr import Usd, UsdGeom, Sdf, Kind except ImportError: # Allow to fall back on Multiverse 6.3.0+ pxr usd library from mvpxr import Usd, UsdGeom, Sdf, Kind -from ayon_core.client import get_project, get_asset_by_name +from ayon_core.client import get_asset_by_name from ayon_core.pipeline import Anatomy, get_current_project_name +from ayon_core.pipeline.template_data import get_template_data log = logging.getLogger(__name__) @@ -142,7 +144,7 @@ def create_model(filename, asset, variant_subsets): ) path = get_usd_master_path( - asset=asset_doc, subset=subset, representation="usd" + asset=asset_doc, product_name=subset, representation="usd" ) variants.append((variant, path)) @@ -195,7 +197,7 @@ def create_shade(filename, asset, variant_subsets): shade_subset = re.sub("^usdModel", "usdShade", subset) path = get_usd_master_path( - asset=asset_doc, subset=shade_subset, representation="usd" + asset=asset_doc, product_name=shade_subset, representation="usd" ) variants.append((variant, path)) @@ -223,7 +225,7 @@ def create_shade_variation(filename, asset, model_variant, shade_variants): model=model_variant, shade=variant ) path = get_usd_master_path( - asset=asset_doc, subset=subset, representation="usd" + asset=asset_doc, product_name=subset, representation="usd" ) variants.append((variant, path)) @@ -306,20 +308,21 @@ def _create_variants_file( return stage -def get_usd_master_path(asset, subset, representation): +def get_usd_master_path(asset, product_name, representation): """Get the filepath for a .usd file of a subset. This will return the path to an unversioned master file generated by `usd_master_file.py`. + Args: + asset (Union[str, dict]): Folder path or asset document. + product_name (str): Product name. + representation (str): Representation name. """ project_name = get_current_project_name() - anatomy = Anatomy(project_name) - project_doc = get_project( - project_name, - fields=["name", "data.code"] - ) + project_entity = ayon_api.get_project(project_name) + anatomy = Anatomy(project_name, project_entity=project_entity) if isinstance(asset, dict) and "name" in asset: # Allow explicitly passing asset document @@ -327,27 +330,23 @@ def get_usd_master_path(asset, subset, representation): else: asset_doc = get_asset_by_name(project_name, asset, fields=["name"]) + template_data = get_template_data(project_entity, asset_doc) + template_data.update({ + "product": { + "name": product_name + }, + "subset": product_name, + "representation": representation, + "version": 0, # stub version zero + }) + template_obj = anatomy.templates_obj["publish"]["path"] - path = template_obj.format_strict( - { - "project": { - "name": project_name, - "code": project_doc.get("data", {}).get("code") - }, - "folder": { - "name": asset_doc["name"], - }, - "asset": asset_doc["name"], - "subset": subset, - "representation": representation, - "version": 0, # stub version zero - } - ) + path = template_obj.format_strict(template_data) # Remove the version folder subset_folder = os.path.dirname(os.path.dirname(path)) master_folder = os.path.join(subset_folder, "master") - fname = "{0}.{1}".format(subset, representation) + fname = "{0}.{1}".format(product_name, representation) return os.path.join(master_folder, fname).replace("\\", "/") diff --git a/client/ayon_core/pipeline/workfile/path_resolving.py b/client/ayon_core/pipeline/workfile/path_resolving.py index 7718e32317..fc0de60b36 100644 --- a/client/ayon_core/pipeline/workfile/path_resolving.py +++ b/client/ayon_core/pipeline/workfile/path_resolving.py @@ -3,7 +3,9 @@ import re import copy import platform -from ayon_core.client import get_project, get_asset_by_name +import ayon_api + +from ayon_core.client import get_asset_by_name from ayon_core.settings import get_project_settings from ayon_core.lib import ( filter_profiles, @@ -141,7 +143,7 @@ def get_workdir_with_workdir_data( def get_workdir( - project_doc, + project_entity, asset_doc, task_name, host_name, @@ -152,14 +154,14 @@ def get_workdir( """Fill workdir path from entered data and project's anatomy. Args: - project_doc (Dict[str, Any]): Mongo document of project from MongoDB. + project_entity (Dict[str, Any]): Project entity. asset_doc (Dict[str, Any]): Mongo document of asset from MongoDB. task_name (str): Task name for which are workdir data preapred. host_name (str): Host which is used to workdir. This is required because workdir template may contain `{app}` key. In `Session` is stored under `AYON_HOST_NAME` key. anatomy (Anatomy): Optional argument. Anatomy object is created using - project name from `project_doc`. It is preferred to pass this + project name from `project_entity`. It is preferred to pass this argument as initialization of a new Anatomy object may be time consuming. template_key (str): Key of work templates in anatomy templates. Default @@ -173,10 +175,12 @@ def get_workdir( """ if not anatomy: - anatomy = Anatomy(project_doc["name"]) + anatomy = Anatomy( + project_entity["name"], project_entity=project_entity + ) workdir_data = get_template_data( - project_doc, asset_doc, task_name, host_name + project_entity, asset_doc, task_name, host_name ) # Output is TemplateResult object which contain useful data return get_workdir_with_workdir_data( @@ -336,7 +340,7 @@ def get_last_workfile( def get_custom_workfile_template( - project_doc, + project_entity, asset_doc, task_name, host_name, @@ -360,7 +364,7 @@ def get_custom_workfile_template( project and asset as parents of processing task name. Args: - project_doc (Dict[str, Any]): Project document from MongoDB. + project_entity (Dict[str, Any]): Project entity. asset_doc (Dict[str, Any]): Asset document from MongoDB. task_name (str): Name of task for which templates are filtered. host_name (str): Name of host. @@ -376,7 +380,7 @@ def get_custom_workfile_template( log = Logger.get_logger("CustomWorkfileResolve") - project_name = project_doc["name"] + project_name = project_entity["name"] if project_settings is None: project_settings = get_project_settings(project_name) @@ -413,7 +417,7 @@ def get_custom_workfile_template( # get project, asset, task anatomy context data anatomy_context_data = get_template_data( - project_doc, asset_doc, task_name, host_name + project_entity, asset_doc, task_name, host_name ) # add root dict anatomy_context_data["root"] = anatomy.roots @@ -457,25 +461,30 @@ def get_custom_workfile_template_by_string_context( `get_custom_workfile_template` for rest of logic. Args: - project_name(str): Project name. - asset_name(str): Asset name. - task_name(str): Task name. + project_name (str): Project name. + asset_name (str): Asset name. + task_name (str): Task name. host_name (str): Name of host. - anatomy(Anatomy): Optionally prepared anatomy object for passed + anatomy (Anatomy): Optionally prepared anatomy object for passed project. - project_settings(Dict[str, Any]): Preloaded project settings. + project_settings (Dict[str, Any]): Preloaded project settings. Returns: - str: Path to template or None if none of profiles match current - context. (Existence of formatted path is not validated.) - None: If no profile is matching context. + Union[str, None]: Path to template or None if none of profiles match + current context. (Existence of formatted path is not validated.) + """ - project_doc = get_project(project_name) + project_entity = ayon_api.get_project(project_name) asset_doc = get_asset_by_name(project_name, asset_name) return get_custom_workfile_template( - project_doc, asset_doc, task_name, host_name, anatomy, project_settings + project_entity, + asset_doc, + task_name, + host_name, + anatomy, + project_settings ) diff --git a/client/ayon_core/plugins/actions/open_file_explorer.py b/client/ayon_core/plugins/actions/open_file_explorer.py index fba3c231a5..c5c34cc4f0 100644 --- a/client/ayon_core/plugins/actions/open_file_explorer.py +++ b/client/ayon_core/plugins/actions/open_file_explorer.py @@ -1,12 +1,11 @@ import os import platform import subprocess - from string import Formatter -from ayon_core.client import ( - get_project, - get_asset_by_name, -) + +import ayon_api + +from ayon_core.client import get_asset_by_name from ayon_core.pipeline import ( Anatomy, LauncherAction, @@ -63,10 +62,10 @@ class OpenTaskPath(LauncherAction): return path def _get_workdir(self, project_name, asset_name, task_name): - project = get_project(project_name) - asset = get_asset_by_name(project_name, asset_name) + project_entity = ayon_api.get_project(project_name) + asset_doc = get_asset_by_name(project_name, asset_name) - data = get_template_data(project, asset, task_name) + data = get_template_data(project_entity, asset_doc, task_name) anatomy = Anatomy(project_name) workdir = anatomy.templates_obj["work"]["folder"].format(data) diff --git a/client/ayon_core/plugins/load/push_to_library.py b/client/ayon_core/plugins/load/push_to_library.py index 39f95d134c..067c652cd9 100644 --- a/client/ayon_core/plugins/load/push_to_library.py +++ b/client/ayon_core/plugins/load/push_to_library.py @@ -40,9 +40,9 @@ class PushToLibraryProject(load.SubsetLoaderPlugin): "main.py" ) - project_doc = context["project"] + project_entity = context["project"] version_doc = context["version"] - project_name = project_doc["name"] + project_name = project_entity["name"] version_id = str(version_doc["_id"]) args = get_ayon_launcher_args( diff --git a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py index b62935dd6a..8ad8a013c2 100644 --- a/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py +++ b/client/ayon_core/plugins/publish/collect_anatomy_instance_data.py @@ -186,8 +186,11 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): def fill_anatomy_data(self, context): self.log.debug("Storing anatomy data to instance data.") - project_doc = context.data["projectEntity"] - project_task_types = project_doc["config"]["tasks"] + project_entity = context.data["projectEntity"] + task_types_by_name = { + task_type["name"]: task_type + for task_type in project_entity["taskTypes"] + } for instance in context: anatomy_data = copy.deepcopy(context.data["anatomyData"]) @@ -202,8 +205,8 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): } }) - self._fill_asset_data(instance, project_doc, anatomy_data) - self._fill_task_data(instance, project_task_types, anatomy_data) + self._fill_asset_data(instance, project_entity, anatomy_data) + self._fill_task_data(instance, task_types_by_name, anatomy_data) # Define version version_number = None @@ -258,7 +261,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): anatomy_data["fps"] = float("{:0.2f}".format(float(fps))) # Store anatomy data - instance.data["projectEntity"] = project_doc + instance.data["projectEntity"] = project_entity instance.data["anatomyData"] = anatomy_data instance.data["version"] = version_number @@ -272,14 +275,14 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): json.dumps(anatomy_data, indent=4) )) - def _fill_asset_data(self, instance, project_doc, anatomy_data): + def _fill_asset_data(self, instance, project_entity, anatomy_data): # QUESTION should we make sure that all asset data are poped if asset # data cannot be found? # - 'asset', 'hierarchy', 'parent', 'folder' asset_doc = instance.data.get("assetEntity") if asset_doc: parents = asset_doc["data"].get("parents") or list() - parent_name = project_doc["name"] + parent_name = project_entity["name"] if parents: parent_name = parents[-1] @@ -298,7 +301,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): hierarchy = instance.data["hierarchy"] anatomy_data["hierarchy"] = hierarchy - parent_name = project_doc["name"] + parent_name = project_entity["name"] if hierarchy: parent_name = hierarchy.split("/")[-1] @@ -312,7 +315,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): }, }) - def _fill_task_data(self, instance, project_task_types, anatomy_data): + def _fill_task_data(self, instance, task_types_by_name, anatomy_data): # QUESTION should we make sure that all task data are poped if task # data cannot be resolved? # - 'task' @@ -325,7 +328,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): # Find task data based on asset entity asset_doc = instance.data.get("assetEntity") task_data = self._get_task_data_from_asset( - asset_doc, task_name, project_task_types + asset_doc, task_name, task_types_by_name ) if task_data: # Fill task data @@ -362,9 +365,9 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): task_info = tasks_info.get(task_name, {}) task_type = task_info.get("type") task_code = ( - project_task_types + task_types_by_name .get(task_type, {}) - .get("short_name") + .get("shortName") ) anatomy_data["task"] = { "name": task_name, @@ -373,14 +376,14 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): } def _get_task_data_from_asset( - self, asset_doc, task_name, project_task_types + self, asset_doc, task_name, task_types_by_name ): """ Args: asset_doc (Union[dict[str, Any], None]): Asset document. task_name (Union[str, None]): Task name. - project_task_types (dict[str, dict[str, Any]]): Project task + task_types_by_name (dict[str, dict[str, Any]]): Project task types. Returns: @@ -393,9 +396,9 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin): asset_tasks = asset_doc["data"]["tasks"] task_type = asset_tasks.get(task_name, {}).get("type") task_code = ( - project_task_types + task_types_by_name .get(task_type, {}) - .get("short_name") + .get("shortName") ) return { "name": task_name, diff --git a/client/ayon_core/plugins/publish/collect_context_entities.py b/client/ayon_core/plugins/publish/collect_context_entities.py index 64ef73e2d9..b5646576d6 100644 --- a/client/ayon_core/plugins/publish/collect_context_entities.py +++ b/client/ayon_core/plugins/publish/collect_context_entities.py @@ -12,8 +12,9 @@ Provides: """ import pyblish.api +import ayon_api -from ayon_core.client import get_project, get_asset_by_name +from ayon_core.client import get_asset_by_name from ayon_core.pipeline import KnownPublishError @@ -28,7 +29,7 @@ class CollectContextEntities(pyblish.api.ContextPlugin): asset_name = context.data["folderPath"] task_name = context.data["task"] - project_entity = get_project(project_name) + project_entity = ayon_api.get_project(project_name) if not project_entity: raise KnownPublishError( "Project '{0}' was not found.".format(project_name) diff --git a/client/ayon_core/plugins/publish/collect_hierarchy.py b/client/ayon_core/plugins/publish/collect_hierarchy.py index 8ba83d582f..3c1d19e827 100644 --- a/client/ayon_core/plugins/publish/collect_hierarchy.py +++ b/client/ayon_core/plugins/publish/collect_hierarchy.py @@ -21,7 +21,7 @@ class CollectHierarchy(pyblish.api.ContextPlugin): project_name = context.data["projectName"] final_context = {} final_context[project_name] = {} - final_context[project_name]['entity_type'] = 'Project' + final_context[project_name]["entity_type"] = "project" for instance in context: self.log.debug("Processing instance: `{}` ...".format(instance)) diff --git a/client/ayon_core/plugins/publish/extract_hierarchy_to_ayon.py b/client/ayon_core/plugins/publish/extract_hierarchy_to_ayon.py index 7ceaf7d2ad..ef8a8b8dfc 100644 --- a/client/ayon_core/plugins/publish/extract_hierarchy_to_ayon.py +++ b/client/ayon_core/plugins/publish/extract_hierarchy_to_ayon.py @@ -48,7 +48,7 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): instance_asset_name = instance.data.get("folderPath") instances_by_asset_name[instance_asset_name].append(instance) - project_doc = context.data["projectEntity"] + project_entity = context.data["projectEntity"] asset_docs = get_assets( project_name, asset_names=instances_by_asset_name.keys() ) @@ -62,7 +62,7 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): for instance in instances: task_name = instance.data.get("task") template_data = get_task_template_data( - project_doc, asset_doc, task_name) + project_entity, asset_doc, task_name) template_data.update(copy.deepcopy(asset_data)) instance.data["anatomyData"].update(template_data) @@ -157,7 +157,7 @@ class ExtractHierarchyToAYON(pyblish.api.ContextPlugin): Output example: { "name": "MyProject", - "entity_type": "Project", + "entity_type": "project", "attributes": {}, "tasks": [], "children": [ diff --git a/client/ayon_core/tools/loader/models/actions.py b/client/ayon_core/tools/loader/models/actions.py index dff15ea16c..70577f6e6c 100644 --- a/client/ayon_core/tools/loader/models/actions.py +++ b/client/ayon_core/tools/loader/models/actions.py @@ -5,8 +5,9 @@ import copy import collections import uuid +import ayon_api + from ayon_core.client import ( - get_project, get_assets, get_subsets, get_versions, @@ -443,8 +444,7 @@ class LoaderActionsModel: _folder_docs = get_assets(project_name, asset_ids=_folder_ids) folder_docs_by_id = {f["_id"]: f for f in _folder_docs} - project_doc = get_project(project_name) - project_doc["code"] = project_doc["data"]["code"] + project_entity = ayon_api.get_project(project_name) for version_doc in version_docs: version_id = version_doc["_id"] @@ -453,7 +453,7 @@ class LoaderActionsModel: folder_id = product_doc["parent"] folder_doc = folder_docs_by_id[folder_id] version_context_by_id[version_id] = { - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, "version": version_doc, @@ -470,7 +470,7 @@ class LoaderActionsModel: folder_doc = folder_docs_by_id[folder_id] repre_context_by_id[repre_doc["_id"]] = { - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, "version": version_doc, @@ -524,14 +524,13 @@ class LoaderActionsModel: f["_id"]: f for f in folder_docs } - project_doc = get_project(project_name) - project_doc["code"] = project_doc["data"]["code"] + project_entity = ayon_api.get_project(project_name) for product_id, product_doc in product_docs_by_id.items(): folder_id = product_doc["parent"] folder_doc = folder_docs_by_id[folder_id] product_context_by_id[product_id] = { - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, } @@ -545,7 +544,7 @@ class LoaderActionsModel: folder_doc = folder_docs_by_id[folder_id] repre_context_by_id[repre_doc["_id"]] = { - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, "version": version_doc, @@ -660,8 +659,7 @@ class LoaderActionsModel: version_ids (Iterable[str]): Version ids. """ - project_doc = get_project(project_name) - project_doc["code"] = project_doc["data"]["code"] + project_entity = ayon_api.get_project(project_name) version_docs = self._get_version_docs(project_name, version_ids) product_ids = {v["parent"] for v in version_docs} @@ -677,7 +675,7 @@ class LoaderActionsModel: folder_id = product_doc["parent"] folder_doc = folder_docs_by_id[folder_id] product_contexts.append({ - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, "version": version_doc, @@ -707,8 +705,7 @@ class LoaderActionsModel: representation_ids (Iterable[str]): Representation ids. """ - project_doc = get_project(project_name) - project_doc["code"] = project_doc["data"]["code"] + project_entity = ayon_api.get_project(project_name) repre_docs = list(get_representations( project_name, representation_ids=representation_ids )) @@ -730,7 +727,7 @@ class LoaderActionsModel: folder_id = product_doc["parent"] folder_doc = folder_docs_by_id[folder_id] repre_contexts.append({ - "project": project_doc, + "project": project_entity, "asset": folder_doc, "subset": product_doc, "version": version_doc, diff --git a/client/ayon_core/tools/push_to_project/models/integrate.py b/client/ayon_core/tools/push_to_project/models/integrate.py index b427f3d226..d0b26d1c03 100644 --- a/client/ayon_core/tools/push_to_project/models/integrate.py +++ b/client/ayon_core/tools/push_to_project/models/integrate.py @@ -8,8 +8,9 @@ import sys import traceback import uuid +import ayon_api + from ayon_core.client import ( - get_project, get_assets, get_asset_by_id, get_subset_by_id, @@ -453,7 +454,7 @@ class ProjectPushItemProcess: self._src_version_doc = None self._src_repre_items = None - self._project_doc = None + self._project_entity = None self._anatomy = None self._asset_doc = None self._created_asset_doc = None @@ -562,8 +563,8 @@ class ProjectPushItemProcess: src_project_name = self._item.src_project_name src_version_id = self._item.src_version_id - project_doc = get_project(src_project_name) - if not project_doc: + project_entity = ayon_api.get_project(src_project_name) + if not project_entity: self._status.set_failed( f"Source project \"{src_project_name}\" was not found" ) @@ -632,8 +633,8 @@ class ProjectPushItemProcess: # --- Destination entities --- dst_project_name = self._item.dst_project_name # Validate project existence - dst_project_doc = get_project(dst_project_name) - if not dst_project_doc: + dst_project_entity = ayon_api.get_project(dst_project_name) + if not dst_project_entity: self._status.set_failed( f"Destination project '{dst_project_name}' was not found" ) @@ -642,8 +643,11 @@ class ProjectPushItemProcess: self._log_debug( f"Destination project '{dst_project_name}' found" ) - self._project_doc = dst_project_doc - self._anatomy = Anatomy(dst_project_name) + self._project_entity = dst_project_entity + self._anatomy = Anatomy( + dst_project_name, + project_entity=dst_project_entity + ) self._project_settings = get_project_settings( self._item.dst_project_name ) @@ -651,7 +655,7 @@ class ProjectPushItemProcess: def _create_asset( self, src_asset_doc, - project_doc, + project_entity, parent_asset_doc, asset_name ): @@ -668,7 +672,8 @@ class ProjectPushItemProcess: asset_name_low = asset_name.lower() other_asset_docs = get_assets( - project_doc["name"], fields=["_id", "name", "data.visualParent"] + project_entity["name"], + fields=["_id", "name", "data.visualParent"] ) for other_asset_doc in other_asset_docs: other_name = other_asset_doc["name"] @@ -687,7 +692,9 @@ class ProjectPushItemProcess: f"Found already existing asset with name \"{other_name}\"" f" which match requested name \"{asset_name}\"" )) - return get_asset_by_id(project_doc["name"], other_asset_doc["_id"]) + return get_asset_by_id( + project_entity["name"], other_asset_doc["_id"] + ) data_keys = ( "clipIn", @@ -714,13 +721,13 @@ class ProjectPushItemProcess: asset_doc = new_asset_document( asset_name, - project_doc["_id"], + project_entity["name"], parent_id, parents, data=asset_data ) self._operations.create_entity( - project_doc["name"], + project_entity["name"], asset_doc["type"], asset_doc ) @@ -759,7 +766,7 @@ class ProjectPushItemProcess: else: asset_doc = self._create_asset( self._src_asset_doc, - self._project_doc, + self._project_entity, parent_asset_doc, new_folder_name ) @@ -785,9 +792,12 @@ class ProjectPushItemProcess: task_info = copy.deepcopy(task_info) task_info["name"] = dst_task_name # Fill rest of task information based on task type - task_type = task_info["type"] - task_type_info = self._project_doc["config"]["tasks"].get( - task_type, {}) + task_type_name = task_info["type"] + task_types_by_name = { + task_type["name"]: task_type + for task_type in self._project_entity["taskTypes"] + } + task_type_info = task_types_by_name.get(task_type_name, {}) task_info.update(task_type_info) self._task_info = task_info @@ -950,7 +960,7 @@ class ProjectPushItemProcess: template_name = self._template_name anatomy = self._anatomy formatting_data = get_template_data( - self._project_doc, + self._project_entity, self._asset_doc, self._task_info.get("name"), self.host_name diff --git a/client/ayon_core/tools/texture_copy/app.py b/client/ayon_core/tools/texture_copy/app.py index 120051060b..2736354cf2 100644 --- a/client/ayon_core/tools/texture_copy/app.py +++ b/client/ayon_core/tools/texture_copy/app.py @@ -1,12 +1,14 @@ import os import re + import click - import speedcopy +import ayon_api -from ayon_core.client import get_project, get_asset_by_name +from ayon_core.client import get_asset_by_name from ayon_core.lib import Terminal from ayon_core.pipeline import Anatomy +from ayon_core.pipeline.template_data import get_template_data t = Terminal() @@ -24,33 +26,21 @@ class TextureCopy: if os.path.splitext(x)[1].lower() in texture_extensions) return textures - def _get_destination_path(self, asset, project): - project_name = project["name"] - hierarchy = "" - parents = asset['data']['parents'] - if parents and len(parents) > 0: - hierarchy = os.path.join(*parents) + def _get_destination_path(self, asset_doc, project_entity): + project_name = project_entity["name"] product_name = "Main" product_type = "texture" - template_data = { - "project": { - "name": project_name, - "code": project['data']['code'] - }, - "asset": asset["name"], + template_data = get_template_data(project_entity, asset_doc) + template_data.update({ "family": product_type, "subset": product_name, - "folder": { - "name": asset["name"], - }, "product": { "name": product_name, "type": product_type, }, - "hierarchy": hierarchy - } - anatomy = Anatomy(project_name) + }) + anatomy = Anatomy(project_name, project_entity=project_entity) template_obj = anatomy.templates_obj["texture"]["path"] return template_obj.format_strict(template_data) @@ -92,20 +82,22 @@ class TextureCopy: else: t.echo(">>> Found {} textures ...".format(len(textures))) - project = get_project(project_name) - if not project: + project_entity = ayon_api.get_project(project_name) + if not project_entity: t.echo("!!! Project name [ {} ] not found.".format(project_name)) exit(1) - asset = get_asset_by_name(project_name, asset_name) - if not asset: + asset_doc = get_asset_by_name(project_name, asset_name) + if not asset_doc: t.echo("!!! Asset [ {} ] not found in project".format(asset_name)) exit(1) - t.echo((">>> Project [ {} ] and " - "asset [ {} ] seems to be OK ...").format(project['name'], - asset['name'])) + t.echo( + ( + ">>> Project [ {} ] and folder [ {} ] seems to be OK ..." + ).format(project_entity['name'], asset_doc['name']) + ) - dst_path = self._get_destination_path(asset, project) + dst_path = self._get_destination_path(asset_doc, project_entity) t.echo("--- Using [ {} ] as destination path".format(dst_path)) if not os.path.exists(dst_path): try: diff --git a/client/ayon_core/tools/utils/assets_widget.py b/client/ayon_core/tools/utils/assets_widget.py index 7c3fd8d97c..2ac30b1ec1 100644 --- a/client/ayon_core/tools/utils/assets_widget.py +++ b/client/ayon_core/tools/utils/assets_widget.py @@ -3,11 +3,9 @@ import collections from qtpy import QtWidgets, QtCore, QtGui import qtawesome +import ayon_api -from ayon_core.client import ( - get_project, - get_assets, -) +from ayon_core.client import get_assets from ayon_core.style import ( get_default_tools_icon_color, get_default_entity_icon_color, @@ -407,8 +405,8 @@ class _AssetModel(QtGui.QStandardItemModel): if not project_name: return [] - project_doc = get_project(project_name, fields=["_id"]) - if not project_doc: + project_entity = ayon_api.get_project(project_name, fields=["name"]) + if not project_entity: return [] # Get all assets sorted by name diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index e785cec390..8c2eb517df 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -240,7 +240,7 @@ def get_default_task_icon(color=None): return get_qta_icon_by_name_and_color("fa.male", color) -def get_task_icon(project_doc, asset_doc, task_name): +def get_task_icon(project_entity, asset_doc, task_name): """Get icon for a task. Icon should be defined by task type which is stored on project. @@ -257,9 +257,12 @@ def get_task_icon(project_doc, asset_doc, task_name): return icon task_type = task_info.get("type") - task_types = project_doc["config"]["tasks"] + task_types_by_name = { + task_type["name"]: task_type + for task_type in project_entity["taskTypes"] + } - task_type_info = task_types.get(task_type) or {} + task_type_info = task_types_by_name.get(task_type) or {} task_type_icon = task_type_info.get("icon") if task_type_icon: icon = get_qta_icon_by_name_and_color(task_icon, color) diff --git a/client/ayon_core/tools/utils/models.py b/client/ayon_core/tools/utils/models.py index a4b6ad7885..92bed16e98 100644 --- a/client/ayon_core/tools/utils/models.py +++ b/client/ayon_core/tools/utils/models.py @@ -3,12 +3,6 @@ import logging import qtpy from qtpy import QtCore, QtGui -from ayon_core.client import get_projects -from .constants import ( - PROJECT_IS_ACTIVE_ROLE, - PROJECT_NAME_ROLE, - DEFAULT_PROJECT_LABEL -) log = logging.getLogger(__name__) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 1e9491b3d7..a0d618c1ae 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -6,7 +6,6 @@ import arrow import ayon_api from ayon_api.operations import OperationsSession -from ayon_core.client import get_project from ayon_core.client.operations import ( prepare_workfile_info_update_data, ) @@ -140,7 +139,9 @@ class WorkareaModel: def _get_base_data(self): if self._base_data is None: - base_data = get_template_data(get_project(self.project_name)) + base_data = get_template_data( + ayon_api.get_project(self.project_name) + ) base_data["app"] = self._controller.get_host_name() self._base_data = base_data return copy.deepcopy(self._base_data)