applications launch context has folder and task entity

This commit is contained in:
Jakub Trllo 2024-03-04 15:38:33 +01:00
parent e25856eb03
commit 43a96ceb2a
8 changed files with 58 additions and 38 deletions

View file

@ -54,21 +54,22 @@ class CopyTemplateWorkfile(PreLaunchHook):
self.log.info("Last workfile does not exist.")
project_name = self.data["project_name"]
asset_name = self.data["folder_path"]
folder_path = self.data["folder_path"]
task_name = self.data["task_name"]
host_name = self.application.host_name
project_settings = get_project_settings(project_name)
project_entity = self.data.get("project_entity")
asset_doc = self.data.get("asset_doc")
folder_entity = self.data.get("folder_entity")
task_entity = self.data.get("task_entity")
anatomy = self.data.get("anatomy")
if project_entity and asset_doc:
if project_entity and folder_entity and task_entity:
self.log.debug("Started filtering of custom template paths.")
template_path = get_custom_workfile_template(
project_entity,
asset_doc,
task_name,
folder_entity,
task_entity,
host_name,
anatomy,
project_settings
@ -81,7 +82,7 @@ class CopyTemplateWorkfile(PreLaunchHook):
))
template_path = get_custom_workfile_template_by_string_context(
project_name,
asset_name,
folder_path,
task_name,
host_name,
anatomy,

View file

@ -1,4 +1,4 @@
from ayon_api import get_project, get_folder_by_path
from ayon_api import get_project, get_folder_by_path, get_task_by_name
from ayon_core.lib.applications import (
PreLaunchHook,
@ -17,7 +17,7 @@ class GlobalHostDataHook(PreLaunchHook):
"""Prepare global objects to `data` that will be used for sure."""
self.prepare_global_data()
if not self.data.get("asset_doc"):
if not self.data.get("folder_entity"):
return
app = self.launch_context.application
@ -29,7 +29,8 @@ class GlobalHostDataHook(PreLaunchHook):
"app": app,
"project_entity": self.data["project_entity"],
"asset_doc": self.data["asset_doc"],
"folder_entity": self.data["folder_entity"],
"task_entity": self.data["task_entity"],
"anatomy": self.data["anatomy"],
@ -70,12 +71,27 @@ class GlobalHostDataHook(PreLaunchHook):
project_name, project_entity=project_entity
)
asset_name = self.data.get("folder_path")
if not asset_name:
folder_path = self.data.get("folder_path")
if not folder_path:
self.log.warning(
"Asset name was not set. Skipping asset document query."
"Folder path is not set. Skipping folder query."
)
return
folder_entity = get_folder_by_path(project_name, asset_name)
folder_entity = get_folder_by_path(project_name, folder_path)
self.data["folder_entity"] = folder_entity
task_name = self.data.get("task_name")
if not task_name:
self.log.warning(
"Task name is not set. Skipping task query."
)
return
if not folder_entity:
return
task_entity = get_task_by_name(
project_name, folder_entity["id"], task_name
)
self.data["task_entity"] = task_entity

View file

@ -28,7 +28,7 @@ class OCIOEnvHook(PreLaunchHook):
template_data = get_template_data_with_names(
project_name=self.data["project_name"],
asset_name=self.data["folder_path"],
folder_path=self.data["folder_path"],
task_name=self.data["task_name"],
host_name=self.host_name,
settings=self.data["project_settings"]

View file

@ -16,9 +16,9 @@ class CelactionPrelaunchHook(PreLaunchHook):
launch_types = {LaunchTypes.local}
def execute(self):
asset_doc = self.data["asset_doc"]
width = asset_doc["data"]["resolutionWidth"]
height = asset_doc["data"]["resolutionHeight"]
folder_attributes = self.data["folder_entity"]["attrib"]
width = folder_attributes["resolutionWidth"]
height = folder_attributes["resolutionHeight"]
# Add workfile path to launch arguments
workfile_path = self.workfile_path()

View file

@ -61,9 +61,9 @@ class UnrealPrelaunchHook(PreLaunchHook):
# Get workfile template key for current context
workfile_template_key = get_workfile_template_key(
project_entity["name"],
task_type,
self.host_name,
project_name=project_entity["name"]
)
# Fill templates
template_obj = anatomy.templates_obj[workfile_template_key]["file"]

View file

@ -12,7 +12,6 @@ from abc import ABCMeta, abstractmethod
import six
from ayon_core import AYON_CORE_ROOT
from ayon_core.client import get_asset_name_identifier
from ayon_core.settings import get_project_settings, get_studio_settings
from .log import Logger
from .profiles_filtering import filter_profiles
@ -1381,7 +1380,7 @@ class EnvironmentPrepData(dict):
data (dict): Data must contain required keys.
"""
required_keys = (
"project_entity", "asset_doc", "task_name", "app", "anatomy"
"project_entity", "folder_entity", "task_name", "app", "anatomy"
)
def __init__(self, data):
@ -1546,13 +1545,13 @@ def prepare_app_environments(
app.environment
]
asset_doc = data.get("asset_doc")
folder_entity = data.get("folder_entity")
# Add tools environments
groups_by_name = {}
tool_by_group_name = collections.defaultdict(dict)
if asset_doc:
if folder_entity:
# Make sure each tool group can be added only once
for key in asset_doc["data"].get("tools_env") or []:
for key in folder_entity["attrib"].get("tools") or []:
tool = app.manager.tools.get(key)
if not tool or not tool.is_valid_for_app(app):
continue
@ -1675,8 +1674,8 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
log = data["log"]
project_entity = data["project_entity"]
asset_doc = data["asset_doc"]
task_name = data["task_name"]
folder_entity = data["folder_entity"]
task_entity = data["task_entity"]
if not project_entity:
log.info(
"Skipping context environments preparation."
@ -1694,12 +1693,12 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
"AYON_PROJECT_NAME": project_entity["name"],
"AYON_APP_NAME": app.full_name
}
if asset_doc:
asset_name = get_asset_name_identifier(asset_doc)
context_env["AYON_FOLDER_PATH"] = asset_name
if folder_entity:
folder_path = folder_entity["path"]
context_env["AYON_FOLDER_PATH"] = folder_path
if task_name:
context_env["AYON_TASK_NAME"] = task_name
if task_entity:
context_env["AYON_TASK_NAME"] = task_entity["name"]
log.debug(
"Context environments set:\n{}".format(
@ -1719,15 +1718,19 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
data["env"]["AYON_HOST_NAME"] = app.host_name
if not asset_doc or not task_name:
if not folder_entity or not task_entity:
# QUESTION replace with log.info and skip workfile discovery?
# - technically it should be possible to launch host without context
raise ApplicationLaunchFailed(
"Host launch require asset and task context."
"Host launch require folder and task context."
)
workdir_data = get_template_data(
project_entity, asset_doc, task_name, app.host_name, project_settings
project_entity,
folder_entity,
task_entity,
app.host_name,
project_settings
)
data["workdir_data"] = workdir_data
@ -1853,9 +1856,9 @@ def _prepare_last_workfile(data, workdir, addons_manager):
project_settings = data["project_settings"]
task_type = workdir_data["task"]["type"]
template_key = get_workfile_template_key(
project_name,
task_type,
app.host_name,
project_name,
project_settings=project_settings
)
# Find last workfile

View file

@ -78,7 +78,7 @@ def collect_frames(files):
files(list) or (set with single value): list of source paths
Returns:
(dict): {'/asset/subset_v001.0001.png': '0001', ....}
dict: {'/folder/subset_v001.0001.png': '0001', ....}
"""
patterns = [clique.PATTERNS["frames"]]

View file

@ -11,13 +11,13 @@ class PostStartTimerHook(PostLaunchHook):
def execute(self):
project_name = self.data.get("project_name")
asset_name = self.data.get("folder_path")
folder_path = self.data.get("folder_path")
task_name = self.data.get("task_name")
missing_context_keys = set()
if not project_name:
missing_context_keys.add("project_name")
if not asset_name:
if not folder_path:
missing_context_keys.add("folder_path")
if not task_name:
missing_context_keys.add("task_name")
@ -40,5 +40,5 @@ class PostStartTimerHook(PostLaunchHook):
return
timers_manager.start_timer_with_webserver(
project_name, asset_name, task_name, logger=self.log
project_name, folder_path, task_name, logger=self.log
)