Merge branch 'develop' into bugfix/OP-8210-houdini_redshift_render_aovs_one_layer

This commit is contained in:
MustafaJafar 2024-02-19 13:54:43 +02:00
commit ec55ad53ea
101 changed files with 615 additions and 616 deletions

View file

@ -73,6 +73,20 @@ class Commands:
import pyblish.api
import pyblish.util
# Fix older jobs
for src_key, dst_key in (
("AVALON_PROJECT", "AYON_PROJECT_NAME"),
("AVALON_ASSET", "AYON_FOLDER_PATH"),
("AVALON_TASK", "AYON_TASK_NAME"),
("AVALON_WORKDIR", "AYON_WORKDIR"),
("AVALON_APP_NAME", "AYON_APP_NAME"),
("AVALON_APP", "AYON_HOST_NAME"),
):
if src_key in os.environ and dst_key not in os.environ:
os.environ[dst_key] = os.environ[src_key]
# Remove old keys, so we're sure they're not used
os.environ.pop(src_key, None)
log = Logger.get_logger("CLI-publish")
install_ayon_plugins()
@ -87,7 +101,7 @@ class Commands:
if not any(paths):
raise RuntimeError("No publish paths specified")
app_full_name = os.getenv("AVALON_APP_NAME")
app_full_name = os.getenv("AYON_APP_NAME")
if app_full_name:
context = get_global_context()
env = get_app_environments_for_context(

View file

@ -21,7 +21,7 @@ class CreateWorkdirExtraFolders(PreLaunchHook):
return
env = self.data.get("env") or {}
workdir = env.get("AVALON_WORKDIR")
workdir = env.get("AYON_WORKDIR")
if not workdir or not os.path.exists(workdir):
return

View file

@ -106,7 +106,7 @@ class HostBase(object):
Union[str, None]: Current project name.
"""
return os.environ.get("AVALON_PROJECT")
return os.environ.get("AYON_PROJECT_NAME")
def get_current_asset_name(self):
"""
@ -114,7 +114,7 @@ class HostBase(object):
Union[str, None]: Current asset name.
"""
return os.environ.get("AVALON_ASSET")
return os.environ.get("AYON_FOLDER_PATH")
def get_current_task_name(self):
"""
@ -122,7 +122,7 @@ class HostBase(object):
Union[str, None]: Current task name.
"""
return os.environ.get("AVALON_TASK")
return os.environ.get("AYON_TASK_NAME")
def get_current_context(self):
"""Get current context information.

View file

@ -234,7 +234,7 @@ class IWorkfileHost:
str: Path to new workdir.
"""
return session["AVALON_WORKDIR"]
return session["AYON_WORKDIR"]
# --- Deprecated method names ---
def file_extensions(self):

View file

@ -297,11 +297,11 @@ class AfterEffectsRoute(WebSocketRoute):
log.info("Setting context change")
log.info("project {} asset {} ".format(project, asset))
if project:
os.environ["AVALON_PROJECT"] = project
os.environ["AYON_PROJECT_NAME"] = project
if asset:
os.environ["AVALON_ASSET"] = asset
os.environ["AYON_FOLDER_PATH"] = asset
if task:
os.environ["AVALON_TASK"] = task
os.environ["AYON_TASK_NAME"] = task
async def read(self):
log.debug("aftereffects.read client calls server server calls "

View file

@ -272,7 +272,7 @@ def set_resolution(data):
def on_new():
project = os.environ.get("AVALON_PROJECT")
project = os.environ.get("AYON_PROJECT_NAME")
settings = get_project_settings(project).get("blender")
set_resolution_startup = settings.get("set_resolution_startup")
@ -293,7 +293,7 @@ def on_new():
def on_open():
project = os.environ.get("AVALON_PROJECT")
project = os.environ.get("AYON_PROJECT_NAME")
settings = get_project_settings(project).get("blender")
set_resolution_startup = settings.get("set_resolution_startup")
@ -379,7 +379,7 @@ def _on_task_changed():
# `directory` attribute, so it opens in that directory (does it?).
# https://docs.blender.org/api/blender2.8/bpy.types.Operator.html#calling-a-file-selector
# https://docs.blender.org/api/blender2.8/bpy.types.WindowManager.html#bpy.types.WindowManager.fileselect_add
workdir = os.getenv("AVALON_WORKDIR")
workdir = os.getenv("AYON_WORKDIR")
log.debug("New working directory: %s", workdir)

View file

@ -82,7 +82,7 @@ def file_extensions() -> List[str]:
def work_root(session: dict) -> str:
"""Return the default root to browse for work files."""
work_dir = session["AVALON_WORKDIR"]
work_dir = session["AYON_WORKDIR"]
scene_dir = session.get("AVALON_SCENEDIR")
if scene_dir:
return str(Path(work_dir, scene_dir))

View file

@ -34,4 +34,4 @@ def current_file():
def work_root(session):
return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/")
return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/")

View file

@ -70,7 +70,7 @@ class LoadClip(opfapi.ClipLoader):
self.log.info("Loading with colorspace: `{}`".format(colorspace))
# create workfile path
workfile_dir = os.environ["AVALON_WORKDIR"]
workfile_dir = os.environ["AYON_WORKDIR"]
openclip_dir = os.path.join(
workfile_dir, clip_name
)

View file

@ -80,7 +80,7 @@ class LoadClipBatch(opfapi.ClipLoader):
self.log.info("Loading with colorspace: `{}`".format(colorspace))
# create workfile path
workfile_dir = options.get("workdir") or os.environ["AVALON_WORKDIR"]
workfile_dir = options.get("workdir") or os.environ["AYON_WORKDIR"]
openclip_dir = os.path.join(
workfile_dir, clip_name
)

View file

@ -22,7 +22,7 @@ def get_fusion_version(app_name):
The function is triggered by the prelaunch hooks to get the fusion version.
`app_name` is obtained by prelaunch hooks from the
`launch_context.env.get("AVALON_APP_NAME")`.
`launch_context.env.get("AYON_APP_NAME")`.
To get a correct Fusion version, a version number should be present
in the `applications/fusion/variants` key

View file

@ -135,7 +135,7 @@ class FusionHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
return current_filepath
def work_root(self, session):
work_dir = session["AVALON_WORKDIR"]
work_dir = session["AYON_WORKDIR"]
scene_dir = session.get("AVALON_SCENEDIR")
if scene_dir:
return os.path.join(work_dir, scene_dir)

View file

@ -135,7 +135,7 @@ class GenericCreateSaver(Creator):
ext = data["creator_attributes"]["image_format"]
# Subset change detected
workdir = os.path.normpath(os.getenv("AVALON_WORKDIR"))
workdir = os.path.normpath(os.getenv("AYON_WORKDIR"))
formatting_data.update({
"workdir": workdir,
"frame": "0" * frame_padding,

View file

@ -131,7 +131,7 @@ class FusionCopyPrefsPrelaunch(PreLaunchHook):
) = self.get_copy_fusion_prefs_settings()
# Get launched application context and return correct app version
app_name = self.launch_context.env.get("AVALON_APP_NAME")
app_name = self.launch_context.env.get("AYON_APP_NAME")
app_version = get_fusion_version(app_name)
if app_version is None:
version_names = ", ".join(str(x) for x in FUSION_VERSIONS_DICT)

View file

@ -28,7 +28,7 @@ class FusionPrelaunch(PreLaunchHook):
def execute(self):
# making sure python 3 is installed at provided path
# Py 3.3-3.10 for Fusion 18+ or Py 3.6 for Fu 16-17
app_data = self.launch_context.env.get("AVALON_APP_NAME")
app_data = self.launch_context.env.get("AYON_APP_NAME")
app_version = get_fusion_version(app_data)
if not app_version:
raise ApplicationLaunchFailed(

View file

@ -74,4 +74,4 @@ def current_file():
def work_root(session):
return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/")
return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/")

View file

@ -77,7 +77,7 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin):
expected_settings.pop("resolutionWidth")
expected_settings.pop("resolutionHeight")
if (any(re.search(pattern, os.getenv('AVALON_TASK'))
if (any(re.search(pattern, os.getenv('AYON_TASK_NAME'))
for pattern in self.skip_timelines_check)):
self.log.info("Skipping frames check because of "
"task name and pattern {}".format(

View file

@ -70,4 +70,4 @@ def current_file():
def work_root(session):
return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/")
return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/")

View file

@ -10,7 +10,7 @@ class SetPath(PreLaunchHook):
launch_types = {LaunchTypes.local}
def execute(self):
workdir = self.launch_context.env.get("AVALON_WORKDIR", "")
workdir = self.launch_context.env.get("AYON_WORKDIR", "")
if not workdir:
self.log.warning("BUG: Workdir is not filled.")
return

View file

@ -10,7 +10,7 @@ class SetPath(PreLaunchHook):
launch_types = {LaunchTypes.local}
def execute(self):
workdir = self.launch_context.env.get("AVALON_WORKDIR", "")
workdir = self.launch_context.env.get("AYON_WORKDIR", "")
if not workdir:
self.log.warning("BUG: Workdir is not filled.")
return

View file

@ -246,7 +246,7 @@ def _set_project():
None
"""
workdir = os.getenv("AVALON_WORKDIR")
workdir = os.getenv("AYON_WORKDIR")
try:
os.makedirs(workdir)
@ -628,7 +628,7 @@ def on_task_changed():
# Run
menu.update_menu_task_label()
workdir = os.getenv("AVALON_WORKDIR")
workdir = os.getenv("AYON_WORKDIR")
if os.path.exists(workdir):
log.info("Updating Maya workspace for task change to %s", workdir)
_set_project()
@ -677,7 +677,7 @@ def workfile_save_before_xgen(event):
import xgenm
current_work_dir = os.getenv("AVALON_WORKDIR").replace("\\", "/")
current_work_dir = os.getenv("AYON_WORKDIR").replace("\\", "/")
expected_work_dir = event.data["workdir_path"].replace("\\", "/")
if current_work_dir == expected_work_dir:
return

View file

@ -612,7 +612,7 @@ def get_load_color_for_family(family, settings=None):
else:
raise ValueError("Invalid color definition {}".format(str(color)))
if type(red, int):
if isinstance(red, int):
red = red / 255.0
green = green / 255.0
blue = blue / 255.0

View file

@ -12,7 +12,7 @@ import gridfs
DEFINITION_FILENAME = "{}/maya/shader_definition.txt".format(
os.getenv("AVALON_PROJECT"))
os.getenv("AYON_PROJECT_NAME"))
class ShaderDefinitionsEditor(QtWidgets.QWidget):

View file

@ -35,7 +35,7 @@ def current_file():
def work_root(session):
work_dir = session["AVALON_WORKDIR"]
work_dir = session["AYON_WORKDIR"]
scene_dir = None
# Query scene file rule from workspace.mel if it exists in WORKDIR

View file

@ -12,7 +12,7 @@ class PreCopyMel(PreLaunchHook):
def execute(self):
project_doc = self.data["project_doc"]
workdir = self.launch_context.env.get("AVALON_WORKDIR")
workdir = self.launch_context.env.get("AYON_WORKDIR")
if not workdir:
self.log.warning("BUG: Workdir is not filled.")
return

View file

@ -8,13 +8,12 @@ publishing on farm.
Requires:
instance -> families
instance -> setMembers
instance -> asset
context -> currentFile
context -> workspaceDir
context -> user
session -> AVALON_ASSET
Optional:
Provides:

View file

@ -38,7 +38,7 @@ if explicit_plugins_loading["enabled"]:
key = "AYON_OPEN_WORKFILE_POST_INITIALIZATION"
if bool(int(os.environ.get(key, "0"))):
def _log_and_open():
path = os.environ["AVALON_LAST_WORKFILE"]
path = os.environ["AYON_LAST_WORKFILE"]
print("Opening \"{}\"".format(path))
cmds.file(path, open=True, force=True)
cmds.evalDeferred(

View file

@ -120,7 +120,7 @@ def deprecated(new_destination):
class Context:
main_window = None
context_action_item = None
project_name = os.getenv("AVALON_PROJECT")
project_name = os.getenv("AYON_PROJECT_NAME")
# Workfile related code
workfiles_launched = False
workfiles_tool_timer = None
@ -2605,7 +2605,7 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies.
def set_favorites(self):
from .utils import set_context_favorites
work_dir = os.getenv("AVALON_WORKDIR")
work_dir = os.getenv("AYON_WORKDIR")
asset = get_current_asset_name()
favorite_items = OrderedDict()
@ -2953,7 +2953,7 @@ def process_workfile_builder():
create_fv_on = workfile_builder.get("create_first_version") or None
builder_on = workfile_builder.get("builder_on_start") or None
last_workfile_path = os.environ.get("AVALON_LAST_WORKFILE")
last_workfile_path = os.environ.get("AYON_LAST_WORKFILE")
# generate first version in file not existing and feature is enabled
if create_fv_on and not os.path.exists(last_workfile_path):
@ -3203,7 +3203,7 @@ class DirmapCache:
@classmethod
def project_name(cls):
if cls._project_name is None:
cls._project_name = os.getenv("AVALON_PROJECT")
cls._project_name = os.getenv("AYON_PROJECT_NAME")
return cls._project_name
@classmethod

View file

@ -68,7 +68,7 @@ def current_file():
def work_root(session):
work_dir = session["AVALON_WORKDIR"]
work_dir = session["AYON_WORKDIR"]
scene_dir = session.get("AVALON_SCENEDIR")
if scene_dir:
path = os.path.join(work_dir, scene_dir)

View file

@ -112,7 +112,7 @@ class WriteNodeKnobSettingPanel(nukescripts.PythonPanel):
for write_node in write_selected_nodes:
# data for mapping the path
data = {
"work": os.getenv("AVALON_WORKDIR"),
"work": os.getenv("AYON_WORKDIR"),
"subset": write_node["name"].value(),
"frame": "#" * frame_padding,
"ext": ext

View file

@ -62,7 +62,7 @@ class PhotoshopHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
return None
def work_root(self, session):
return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/")
return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/")
def open_workfile(self, filepath):
lib.stub().open(filepath)

View file

@ -52,10 +52,10 @@ class CollectBatchData(pyblish.api.ContextPlugin):
assert os.path.exists(batch_dir), \
"Folder {} doesn't exist".format(batch_dir)
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
if project_name is None:
raise AssertionError(
"Environment `AVALON_PROJECT` was not found."
"Environment `AYON_PROJECT_NAME` was not found."
"Could not set project `root` which may cause issues."
)
@ -68,8 +68,8 @@ class CollectBatchData(pyblish.api.ContextPlugin):
batch_data["context"]
)
os.environ["AVALON_ASSET"] = asset_name
os.environ["AVALON_TASK"] = task_name
os.environ["AYON_FOLDER_PATH"] = asset_name
os.environ["AYON_TASK_NAME"] = task_name
context.data["asset"] = asset_name
context.data["task"] = task_name

View file

@ -79,7 +79,7 @@ def open_file(filepath):
def current_file():
pm = get_project_manager()
file_ext = file_extensions()[0]
workdir_path = os.getenv("AVALON_WORKDIR")
workdir_path = os.getenv("AYON_WORKDIR")
project = pm.GetCurrentProject()
project_name = project.GetName()
file_name = project_name + file_ext
@ -93,4 +93,4 @@ def current_file():
def work_root(session):
return os.path.normpath(session["AVALON_WORKDIR"]).replace("\\", "/")
return os.path.normpath(session["AYON_WORKDIR"]).replace("\\", "/")

View file

@ -22,7 +22,7 @@ class TrayPublisherHost(HostBase, IPublishHost):
name = "traypublisher"
def install(self):
os.environ["AVALON_APP"] = self.name
os.environ["AYON_HOST_NAME"] = self.name
pyblish.api.register_host("traypublisher")
pyblish.api.register_plugin_path(PUBLISH_PATH)
@ -40,7 +40,7 @@ class TrayPublisherHost(HostBase, IPublishHost):
def set_project_name(self, project_name):
# TODO Deregister project specific plugins and register new project
# plugins
os.environ["AVALON_PROJECT"] = project_name
os.environ["AYON_PROJECT_NAME"] = project_name
HostContext.set_project_name(project_name)

View file

@ -8,7 +8,7 @@ log = Logger.get_logger(__name__)
def initialize():
from ayon_core.hosts.traypublisher.api.plugin import SettingsCreator
project_name = os.environ["AVALON_PROJECT"]
project_name = os.environ["AYON_PROJECT_NAME"]
project_settings = get_project_settings(project_name)
simple_creators = project_settings["traypublisher"]["simple_creators"]

View file

@ -68,7 +68,7 @@ class TVPaintHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
log.info("AYON - Installing TVPaint integration")
# Create workdir folder if does not exist yet
workdir = os.getenv("AVALON_WORKDIR")
workdir = os.getenv("AYON_WORKDIR")
if not os.path.exists(workdir):
os.makedirs(workdir)
@ -155,7 +155,7 @@ class TVPaintHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
return execute_george(george_script)
def work_root(self, session):
return session["AVALON_WORKDIR"]
return session["AYON_WORKDIR"]
def get_current_workfile(self):
return execute_george("tv_GetProjectName")
@ -174,7 +174,7 @@ class TVPaintHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost):
# Setup project settings if its the template that's launched.
# TODO also check for template creation when it's possible to define
# templates
last_workfile = os.environ.get("AVALON_LAST_WORKFILE")
last_workfile = os.environ.get("AYON_LAST_WORKFILE")
if not last_workfile or os.path.exists(last_workfile):
return

View file

@ -85,8 +85,8 @@ class CollectWorkfileData(pyblish.api.ContextPlugin):
if workfile_context:
# Change current context with context from workfile
key_map = (
("AVALON_ASSET", "asset_name"),
("AVALON_TASK", "task_name")
("AYON_FOLDER_PATH", "asset_name"),
("AYON_TASK_NAME", "task_name")
)
for env_key, key in key_map:
os.environ[env_key] = workfile_context[key]

View file

@ -31,7 +31,7 @@ class ExtractSequence(pyblish.api.Extractor):
families = ["review", "render"]
# Modifiable with settings
review_bg = [255, 255, 255, 255]
review_bg = [255, 255, 255, 1.0]
def process(self, instance):
self.log.info(

View file

@ -6,7 +6,7 @@ class ValidateWorkfileProjectName(pyblish.api.ContextPlugin):
"""Validate project name stored in workfile metadata.
It is not possible to publish from different project than is set in
environment variable "AVALON_PROJECT".
environment variable "AYON_PROJECT_NAME".
"""
label = "Validate Workfile Project Name"

View file

@ -60,7 +60,7 @@ def start_rendering():
inst_data.append(data)
try:
project = os.environ.get("AVALON_PROJECT")
project = os.environ.get("AYON_PROJECT_NAME")
anatomy = Anatomy(project)
root = anatomy.roots['renders']
except Exception as e:

View file

@ -146,7 +146,7 @@ class UnrealPrelaunchHook(PreLaunchHook):
def execute(self):
"""Hook entry method."""
workdir = self.launch_context.env["AVALON_WORKDIR"]
workdir = self.launch_context.env["AYON_WORKDIR"]
executable = str(self.launch_context.executable)
engine_version = self.app_name.split("/")[-1].replace("-", ".")
try:

View file

@ -1698,15 +1698,15 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
app = data["app"]
context_env = {
"AVALON_PROJECT": project_doc["name"],
"AVALON_APP_NAME": app.full_name
"AYON_PROJECT_NAME": project_doc["name"],
"AYON_APP_NAME": app.full_name
}
if asset_doc:
asset_name = get_asset_name_identifier(asset_doc)
context_env["AVALON_ASSET"] = asset_name
context_env["AYON_FOLDER_PATH"] = asset_name
if task_name:
context_env["AVALON_TASK"] = task_name
context_env["AYON_TASK_NAME"] = task_name
log.debug(
"Context environments set:\n{}".format(
@ -1724,7 +1724,7 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
if not app.is_host:
return
data["env"]["AVALON_APP"] = app.host_name
data["env"]["AYON_HOST_NAME"] = app.host_name
if not asset_doc or not task_name:
# QUESTION replace with log.info and skip workfile discovery?
@ -1770,7 +1770,7 @@ def prepare_context_environments(data, env_group=None, addons_manager=None):
"Couldn't create workdir because: {}".format(str(exc))
)
data["env"]["AVALON_WORKDIR"] = workdir
data["env"]["AYON_WORKDIR"] = workdir
_prepare_last_workfile(data, workdir, addons_manager)
@ -1887,7 +1887,7 @@ def _prepare_last_workfile(data, workdir, addons_manager):
"Setting last workfile path: {}".format(last_workfile_path)
)
data["env"]["AVALON_LAST_WORKFILE"] = last_workfile_path
data["env"]["AYON_LAST_WORKFILE"] = last_workfile_path
data["last_workfile_path"] = last_workfile_path

View file

@ -257,7 +257,7 @@ class Logger:
return cls._process_name
# Get process name
process_name = os.environ.get("AVALON_APP_NAME")
process_name = os.environ.get("AYON_APP_NAME")
if not process_name:
try:
import psutil

View file

@ -12,7 +12,7 @@ class ClockifyStart(LauncherAction):
def is_compatible(self, session):
"""Return whether the action is compatible with the session"""
if "AVALON_TASK" in session:
if "AYON_TASK_NAME" in session:
return True
return False
@ -20,9 +20,9 @@ class ClockifyStart(LauncherAction):
self.clockify_api.set_api()
user_id = self.clockify_api.user_id
workspace_id = self.clockify_api.workspace_id
project_name = session["AVALON_PROJECT"]
asset_name = session["AVALON_ASSET"]
task_name = session["AVALON_TASK"]
project_name = session["AYON_PROJECT_NAME"]
asset_name = session["AYON_FOLDER_PATH"]
task_name = session["AYON_TASK_NAME"]
description = asset_name
# fetch asset docs

View file

@ -36,7 +36,7 @@ class ClockifySync(LauncherAction):
raise ClockifyPermissionsCheckFailed(
"Current CLockify user is missing permissions for this action!"
)
project_name = session.get("AVALON_PROJECT") or ""
project_name = session.get("AYON_PROJECT_NAME") or ""
projects_to_sync = []
if project_name.strip():

View file

@ -4,7 +4,7 @@ import six
import sys
from ayon_core.lib import requests_get, Logger
from ayon_core.modules import OpenPypeModule, IPluginPaths
from ayon_core.modules import AYONAddon, IPluginPaths
class DeadlineWebserviceError(Exception):
@ -13,28 +13,28 @@ class DeadlineWebserviceError(Exception):
"""
class DeadlineModule(OpenPypeModule, IPluginPaths):
class DeadlineModule(AYONAddon, IPluginPaths):
name = "deadline"
def __init__(self, manager, settings):
self.deadline_urls = {}
super(DeadlineModule, self).__init__(manager, settings)
def initialize(self, modules_settings):
def initialize(self, studio_settings):
# This module is always enabled
deadline_settings = modules_settings[self.name]
self.enabled = deadline_settings["enabled"]
deadline_url = deadline_settings.get("DEADLINE_REST_URL")
if deadline_url:
self.deadline_urls = {"default": deadline_url}
else:
self.deadline_urls = deadline_settings.get("deadline_urls") # noqa: E501
deadline_urls = {}
enabled = self.name in studio_settings
if enabled:
deadline_settings = studio_settings[self.name]
deadline_urls = {
url_item["name"]: url_item["value"]
for url_item in deadline_settings["deadline_urls"]
}
if not self.deadline_urls:
self.enabled = False
self.log.warning(("default Deadline Webservice URL "
"not specified. Disabling module."))
return
if enabled and not deadline_urls:
enabled = False
self.log.warning((
"Deadline Webservice URLs are not specified. Disabling addon."
))
self.enabled = enabled
self.deadline_urls = deadline_urls
def get_plugin_paths(self):
"""Deadline plugin paths."""

View file

@ -47,11 +47,11 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
deadline_settings = (
render_instance.context.data
["system_settings"]
["modules"]
["deadline"]
)
default_server = render_instance.context.data["defaultDeadline"]
# QUESTION How and where is this is set? Should be removed?
instance_server = render_instance.data.get("deadlineServers")
if not instance_server:
self.log.debug("Using default server.")
@ -64,7 +64,10 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
asString=True
)
default_servers = deadline_settings["deadline_urls"]
default_servers = {
url_item["name"]: url_item["value"]
for url_item in deadline_settings["deadline_urls"]
}
project_servers = (
render_instance.context.data
["project_settings"]

View file

@ -80,11 +80,11 @@ class AfterEffectsSubmitDeadline(
"FTRACK_API_KEY",
"FTRACK_API_USER",
"FTRACK_SERVER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"AYON_LOG_NO_COLORS",
"IS_TEST"
]

View file

@ -102,11 +102,11 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
"FTRACK_API_USER",
"FTRACK_SERVER",
"OPENPYPE_SG_USER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"IS_TEST"
]

View file

@ -220,11 +220,11 @@ class FusionSubmitDeadline(
"FTRACK_API_KEY",
"FTRACK_API_USER",
"FTRACK_SERVER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"AYON_LOG_NO_COLORS",
"IS_TEST",
"AYON_BUNDLE_NAME",

View file

@ -273,11 +273,11 @@ class HarmonySubmitDeadline(
"FTRACK_API_KEY",
"FTRACK_API_USER",
"FTRACK_SERVER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"AYON_LOG_NO_COLORS"
"IS_TEST"
]

View file

@ -98,11 +98,11 @@ class HoudiniCacheSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline
"FTRACK_API_USER",
"FTRACK_SERVER",
"OPENPYPE_SG_USER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"AYON_LOG_NO_COLORS",
]

View file

@ -204,11 +204,11 @@ class HoudiniSubmitDeadline(
"FTRACK_API_USER",
"FTRACK_SERVER",
"OPENPYPE_SG_USER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"AYON_LOG_NO_COLORS",
]

View file

@ -106,11 +106,11 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
"FTRACK_API_USER",
"FTRACK_SERVER",
"OPENPYPE_SG_USER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"IS_TEST"
]

View file

@ -207,11 +207,11 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
"FTRACK_API_USER",
"FTRACK_SERVER",
"OPENPYPE_SG_USER",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_WORKDIR",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_WORKDIR",
"AYON_APP_NAME",
"IS_TEST"
]

View file

@ -104,10 +104,10 @@ class MayaSubmitRemotePublishDeadline(
if key in os.environ
}
environment["AVALON_PROJECT"] = project_name
environment["AVALON_ASSET"] = instance.context.data["asset"]
environment["AVALON_TASK"] = instance.context.data["task"]
environment["AVALON_APP_NAME"] = os.environ.get("AVALON_APP_NAME")
environment["AYON_PROJECT_NAME"] = project_name
environment["AYON_FOLDER_PATH"] = instance.context.data["asset"]
environment["AYON_TASK_NAME"] = instance.context.data["task"]
environment["AYON_APP_NAME"] = os.environ.get("AYON_APP_NAME")
environment["OPENPYPE_PUBLISH_SUBSET"] = instance.data["subset"]
environment["AYON_LOG_NO_COLORS"] = "1"
environment["AYON_USERNAME"] = instance.context.data["user"]

View file

@ -373,10 +373,10 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin,
keys = [
"PYTHONPATH",
"PATH",
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK",
"AVALON_APP_NAME",
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME",
"AYON_APP_NAME",
"FTRACK_API_KEY",
"FTRACK_API_USER",
"FTRACK_SERVER",

View file

@ -67,7 +67,7 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin,
"FTRACK_API_USER",
"FTRACK_API_KEY",
"FTRACK_SERVER",
"AVALON_APP_NAME",
"AYON_APP_NAME",
"AYON_USERNAME",
"OPENPYPE_SG_USER",
"KITSU_LOGIN",
@ -125,9 +125,9 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin,
create_metadata_path(instance, anatomy)
environment = {
"AVALON_PROJECT": instance.context.data["projectName"],
"AVALON_ASSET": instance.context.data["asset"],
"AVALON_TASK": instance.context.data["task"],
"AYON_PROJECT_NAME": instance.context.data["projectName"],
"AYON_FOLDER_PATH": instance.context.data["asset"],
"AYON_TASK_NAME": instance.context.data["task"],
"AYON_USERNAME": instance.context.data["user"],
"AYON_LOG_NO_COLORS": "1",
"IS_TEST": str(int(is_in_tests())),

View file

@ -130,7 +130,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
"FTRACK_API_USER",
"FTRACK_API_KEY",
"FTRACK_SERVER",
"AVALON_APP_NAME",
"AYON_APP_NAME",
"AYON_USERNAME",
"OPENPYPE_SG_USER",
"KITSU_LOGIN",
@ -202,9 +202,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
create_metadata_path(instance, anatomy)
environment = {
"AVALON_PROJECT": instance.context.data["projectName"],
"AVALON_ASSET": instance.context.data["asset"],
"AVALON_TASK": instance.context.data["task"],
"AYON_PROJECT_NAME": instance.context.data["projectName"],
"AYON_FOLDER_PATH": instance.context.data["asset"],
"AYON_TASK_NAME": instance.context.data["task"],
"AYON_USERNAME": instance.context.data["user"],
"AYON_LOG_NO_COLORS": "1",
"IS_TEST": str(int(is_in_tests())),

View file

@ -14,7 +14,7 @@ from Deadline.Scripting import (
DirectoryUtils,
ProcessUtils,
)
__version__ = "1.0.0"
__version__ = "1.0.1"
VERSION_REGEX = re.compile(
r"(?P<major>0|[1-9]\d*)"
r"\.(?P<minor>0|[1-9]\d*)"
@ -471,12 +471,21 @@ def inject_ayon_environment(deadlinePlugin):
]
add_kwargs = {
"project": job.GetJobEnvironmentKeyValue("AVALON_PROJECT"),
"asset": job.GetJobEnvironmentKeyValue("AVALON_ASSET"),
"task": job.GetJobEnvironmentKeyValue("AVALON_TASK"),
"app": job.GetJobEnvironmentKeyValue("AVALON_APP_NAME"),
"envgroup": "farm",
}
# Support backwards compatible keys
for key, env_keys in (
("project", ["AYON_PROJECT_NAME", "AVALON_PROJECT"]),
("asset", ["AYON_FOLDER_PATH", "AVALON_ASSET"]),
("task", ["AYON_TASK_NAME", "AVALON_TASK"]),
("app", ["AYON_APP_NAME", "AVALON_APP_NAME"]),
):
value = ""
for env_key in env_keys:
value = job.GetJobEnvironmentKeyValue(env_key)
if value:
break
add_kwargs[key] = value
if job.GetJobEnvironmentKeyValue("IS_TEST"):
args.append("--automatic-tests")
@ -486,8 +495,8 @@ def inject_ayon_environment(deadlinePlugin):
args.extend(["--{}".format(key), value])
else:
raise RuntimeError((
"Missing required env vars: AVALON_PROJECT, AVALON_ASSET,"
" AVALON_TASK, AVALON_APP_NAME"
"Missing required env vars: AYON_PROJECT_NAME,"
" AYON_FOLDER_PATH, AYON_TASK_NAME, AYON_APP_NAME"
))
environment = {

View file

@ -361,8 +361,8 @@ class BaseCreateRoyalRenderJob(pyblish.api.InstancePlugin,
if not all(add_kwargs.values()):
raise RuntimeError((
"Missing required env vars: AVALON_PROJECT, AVALON_ASSET,"
" AVALON_TASK, AVALON_APP_NAME"
"Missing required env vars: AYON_PROJECT_NAME, AYON_FOLDER_PATH,"
" AYON_TASK_NAME, AYON_APP_NAME"
))
for key, value in add_kwargs.items():

View file

@ -63,7 +63,7 @@ class CreatePublishRoyalRenderJob(pyblish.api.InstancePlugin,
"FTRACK_API_USER",
"FTRACK_API_KEY",
"FTRACK_SERVER",
"AVALON_APP_NAME",
"AYON_APP_NAME",
"AYON_USERNAME",
"OPENPYPE_SG_USER",
]
@ -179,9 +179,9 @@ class CreatePublishRoyalRenderJob(pyblish.api.InstancePlugin,
anatomy_data = instance.context.data["anatomyData"]
environment = RREnvList({
"AVALON_PROJECT": anatomy_data["project"]["name"],
"AVALON_ASSET": instance.context.data["asset"],
"AVALON_TASK": anatomy_data["task"]["name"],
"AYON_PROJECT_NAME": anatomy_data["project"]["name"],
"AYON_FOLDER_PATH": instance.context.data["asset"],
"AYON_TASK_NAME": anatomy_data["task"]["name"],
"AYON_USERNAME": anatomy_data["user"]
})

View file

@ -136,10 +136,10 @@ class OpenPypeContextSelector:
def run_publish(self):
"""Run publish process."""
env = {"AVALON_PROJECT": str(self.context.get("project")),
"AVALON_ASSET": str(self.context.get("asset")),
"AVALON_TASK": str(self.context.get("task")),
# "AVALON_APP_NAME": str(self.context.get("app_name"))
env = {"AYON_PROJECT_NAME": str(self.context.get("project")),
"AYON_FOLDER_PATH": str(self.context.get("asset")),
"AYON_TASK_NAME": str(self.context.get("task")),
# "AYON_APP_NAME": str(self.context.get("app_name"))
}
print(">>> setting environment:")
@ -182,10 +182,18 @@ print("running selector")
selector = OpenPypeContextSelector()
# try to set context from environment
selector.context["project"] = os.getenv("AVALON_PROJECT")
selector.context["asset"] = os.getenv("AVALON_ASSET")
selector.context["task"] = os.getenv("AVALON_TASK")
# selector.context["app_name"] = os.getenv("AVALON_APP_NAME")
for key, env_keys in (
("project", ["AYON_PROJECT_NAME", "AVALON_PROJECT"]),
("asset", ["AYON_FOLDER_PATH", "AVALON_ASSET"]),
("task", ["AYON_TASK_NAME", "AVALON_TASK"]),
# ("app_name", ["AYON_APP_NAME", "AVALON_APP_NAME"])
):
value = ""
for env_key in env_keys:
value = os.getenv(env_key)
if value:
break
selector.context[key] = value
# if anything inside is None, scratch the whole thing and
# ask user for context.

View file

@ -26,7 +26,7 @@ class LauncherAction(object):
Args:
session (dict[str, Union[str, None]]): Session data with
AVALON_PROJECT, AVALON_ASSET and AVALON_TASK.
AYON_PROJECT_NAME, AYON_FOLDER_PATH and AYON_TASK_NAME.
"""
return True

View file

@ -423,7 +423,7 @@ class Anatomy(BaseAnatomy):
def __init__(self, project_name=None, site_name=None):
if not project_name:
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
if not project_name:
raise ProjectNotSet((

View file

@ -117,12 +117,12 @@ def install_host(host):
addons_manager = _get_addons_manager()
project_name = os.getenv("AVALON_PROJECT")
project_name = os.getenv("AYON_PROJECT_NAME")
# WARNING: This might be an issue
# - commented out because 'traypublisher' does not have set project
# if not project_name:
# raise ValueError(
# "AVALON_PROJECT is missing in environment variables."
# "AYON_PROJECT_NAME is missing in environment variables."
# )
log.info("Activating {}..".format(project_name))
@ -152,7 +152,7 @@ def install_host(host):
print("Registering pyblish target: automated")
pyblish.api.register_target("automated")
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
# Give option to handle host installation
for addon in addons_manager.get_enabled_addons():
@ -172,7 +172,7 @@ def install_ayon_plugins(project_name=None, host_name=None):
register_inventory_action_path(INVENTORY_PATH)
if host_name is None:
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
addons_manager = _get_addons_manager()
publish_plugin_dirs = addons_manager.collect_publish_plugin_paths(
@ -196,7 +196,7 @@ def install_ayon_plugins(project_name=None, host_name=None):
register_inventory_action_path(path)
if project_name is None:
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
# Register studio specific plugins
if project_name:
@ -331,7 +331,7 @@ def get_current_host_name():
"""Current host name.
Function is based on currently registered host integration or environment
variable 'AVALON_APP'.
variable 'AYON_HOST_NAME'.
Returns:
Union[str, None]: Name of host integration in current process or None.
@ -340,7 +340,7 @@ def get_current_host_name():
host = registered_host()
if isinstance(host, HostBase):
return host.name
return os.environ.get("AVALON_APP")
return os.environ.get("AYON_HOST_NAME")
def get_global_context():
@ -365,9 +365,9 @@ def get_global_context():
"""
return {
"project_name": os.environ.get("AVALON_PROJECT"),
"asset_name": os.environ.get("AVALON_ASSET"),
"task_name": os.environ.get("AVALON_TASK"),
"project_name": os.environ.get("AYON_PROJECT_NAME"),
"asset_name": os.environ.get("AYON_FOLDER_PATH"),
"task_name": os.environ.get("AYON_TASK_NAME"),
}
@ -474,10 +474,10 @@ def get_template_data_from_session(session=None, system_settings=None):
"""
if session is not None:
project_name = session["AVALON_PROJECT"]
asset_name = session["AVALON_ASSET"]
task_name = session["AVALON_TASK"]
host_name = session["AVALON_APP"]
project_name = session["AYON_PROJECT_NAME"]
asset_name = session["AYON_FOLDER_PATH"]
task_name = session["AYON_TASK_NAME"]
host_name = session["AYON_HOST_NAME"]
else:
context = get_current_context()
project_name = context["project_name"]
@ -525,8 +525,8 @@ def get_workdir_from_session(session=None, template_key=None):
"""
if session is not None:
project_name = session["AVALON_PROJECT"]
host_name = session["AVALON_APP"]
project_name = session["AYON_PROJECT_NAME"]
host_name = session["AYON_HOST_NAME"]
else:
project_name = get_current_project_name()
host_name = get_current_host_name()
@ -566,10 +566,10 @@ def get_custom_workfile_template_from_session(
"""
if session is not None:
project_name = session["AVALON_PROJECT"]
asset_name = session["AVALON_ASSET"]
task_name = session["AVALON_TASK"]
host_name = session["AVALON_APP"]
project_name = session["AYON_PROJECT_NAME"]
asset_name = session["AYON_FOLDER_PATH"]
task_name = session["AYON_TASK_NAME"]
host_name = session["AYON_HOST_NAME"]
else:
context = get_current_context()
project_name = context["project_name"]
@ -616,10 +616,10 @@ def change_current_context(asset_doc, task_name, template_key=None):
folder_path = get_asset_name_identifier(asset_doc)
envs = {
"AVALON_PROJECT": project_name,
"AVALON_ASSET": folder_path,
"AVALON_TASK": task_name,
"AVALON_WORKDIR": workdir,
"AYON_PROJECT_NAME": project_name,
"AYON_FOLDER_PATH": folder_path,
"AYON_TASK_NAME": task_name,
"AYON_WORKDIR": workdir,
}
# Update the Session and environments. Pop from environments all keys with

View file

@ -1536,7 +1536,7 @@ class CreateContext:
def host_name(self):
if hasattr(self.host, "name"):
return self.host.name
return os.environ["AVALON_APP"]
return os.environ["AYON_HOST_NAME"]
def get_current_project_name(self):
"""Project name which was used as current context on context reset.

View file

@ -45,7 +45,7 @@ class LegacyCreator(object):
def apply_settings(cls, project_settings, system_settings):
"""Apply OpenPype settings to a plugin class."""
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
plugin_type = "create"
plugin_type_settings = (
project_settings

View file

@ -128,13 +128,13 @@ def get_subset_name(
return ""
if not host_name:
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
# Use only last part of class family value split by dot (`.`)
family = family.rsplit(".", 1)[-1]
if project_name is None:
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
asset_tasks = asset_doc.get("data", {}).get("tasks") or {}
task_info = asset_tasks.get(task_name) or {}

View file

@ -321,7 +321,7 @@ def prepare_representations(skeleton_data, exp_files, anatomy, aov_filter,
"""
representations = []
host_name = os.environ.get("AVALON_APP", "")
host_name = os.environ.get("AYON_HOST_NAME", "")
collections, remainders = clique.assemble(exp_files)
log = Logger.get_logger("farm_publishing")
@ -541,7 +541,7 @@ def _create_instances_for_aov(instance, skeleton, aov_filter, additional_data,
"""
# TODO: this needs to be taking the task from context or instance
task = os.environ["AVALON_TASK"]
task = os.environ["AYON_TASK_NAME"]
anatomy = instance.context.data["anatomy"]
subset = skeleton["subset"]
@ -611,7 +611,7 @@ def _create_instances_for_aov(instance, skeleton, aov_filter, additional_data,
log.info("Creating data for: {}".format(subset_name))
app = os.environ.get("AVALON_APP", "")
app = os.environ.get("AYON_HOST_NAME", "")
if isinstance(col, list):
render_file_name = os.path.basename(col[0])

View file

@ -38,7 +38,7 @@ class LoaderPlugin(list):
@classmethod
def apply_settings(cls, project_settings, system_settings):
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
plugin_type = "load"
plugin_type_settings = (
project_settings

View file

@ -437,7 +437,7 @@ def filter_pyblish_plugins(plugins):
# - kept becau on farm is probably used host 'shell' which propably
# affect how settings are applied there
host_name = pyblish.api.current_host()
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
project_settings = get_project_settings(project_name)
system_settings = get_system_settings()

View file

@ -229,8 +229,8 @@ class BuildWorkfile:
def get_build_presets(self, task_name, asset_doc):
""" Returns presets to build workfile for task name.
Presets are loaded for current project set in
io.Session["AVALON_PROJECT"], filtered by registered host
Presets are loaded for current project received by
'get_current_project_name', filtered by registered host
and entered task name.
Args:

View file

@ -157,7 +157,7 @@ def get_workdir(
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 `AVALON_APP` key.
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
argument as initialization of a new Anatomy object may be time

View file

@ -103,7 +103,7 @@ class AbstractTemplateBuilder(object):
if isinstance(host, HostBase):
host_name = host.name
else:
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
self._host = host
self._host_name = host_name
@ -129,19 +129,19 @@ class AbstractTemplateBuilder(object):
def project_name(self):
if isinstance(self._host, HostBase):
return self._host.get_current_project_name()
return os.getenv("AVALON_PROJECT")
return os.getenv("AYON_PROJECT_NAME")
@property
def current_asset_name(self):
if isinstance(self._host, HostBase):
return self._host.get_current_asset_name()
return os.getenv("AVALON_ASSET")
return os.getenv("AYON_FOLDER_PATH")
@property
def current_task_name(self):
if isinstance(self._host, HostBase):
return self._host.get_current_task_name()
return os.getenv("AVALON_TASK")
return os.getenv("AYON_TASK_NAME")
def get_current_context(self):
if isinstance(self._host, HostBase):
@ -585,7 +585,7 @@ class AbstractTemplateBuilder(object):
template_path (str): Fullpath for current task and
host's template file.
"""
last_workfile_path = os.environ.get("AVALON_LAST_WORKFILE")
last_workfile_path = os.environ.get("AYON_LAST_WORKFILE")
self.log.info("__ last_workfile_path: {}".format(last_workfile_path))
if os.path.exists(last_workfile_path):
# ignore in case workfile existence

View file

@ -22,14 +22,14 @@ class OpenTaskPath(LauncherAction):
def is_compatible(self, session):
"""Return whether the action is compatible with the session"""
return bool(session.get("AVALON_ASSET"))
return bool(session.get("AYON_FOLDER_PATH"))
def process(self, session, **kwargs):
from qtpy import QtCore, QtWidgets
project_name = session["AVALON_PROJECT"]
asset_name = session["AVALON_ASSET"]
task_name = session.get("AVALON_TASK", None)
project_name = session["AYON_PROJECT_NAME"]
asset_name = session["AYON_FOLDER_PATH"]
task_name = session.get("AYON_TASK_NAME", None)
path = self._get_workdir(project_name, asset_name, task_name)
if not path:

View file

@ -359,7 +359,7 @@
#
# if mongo_changes_bulk:
# dbcon = AvalonMongoDB()
# dbcon.Session["AVALON_PROJECT"] = project_name
# dbcon.Session["AYON_PROJECT_NAME"] = project_name
# dbcon.install()
# dbcon.bulk_write(mongo_changes_bulk)
# dbcon.uninstall()

View file

@ -4,9 +4,9 @@ Requires:
context -> anatomy
context -> projectEntity
context -> assetEntity
context -> task
context -> username
context -> datetimeData
session -> AVALON_TASK
Provides:
context -> anatomyData

View file

@ -1,7 +1,6 @@
"""Collect Anatomy and global anatomy data.
Requires:
session -> AVALON_ASSET
context -> projectName
context -> asset
context -> task

View file

@ -57,9 +57,9 @@ class CollectFromCreateContext(pyblish.api.ContextPlugin):
asset_name = create_context.get_current_asset_name()
task_name = create_context.get_current_task_name()
for key, value in (
("AVALON_PROJECT", project_name),
("AVALON_ASSET", asset_name),
("AVALON_TASK", task_name)
("AYON_PROJECT_NAME", project_name),
("AYON_FOLDER_PATH", asset_name),
("AYON_TASK_NAME", task_name)
):
if value is None:
os.environ.pop(key, None)

View file

@ -24,13 +24,13 @@ class CollectHostName(pyblish.api.ContextPlugin):
if host_name and app_name and app_label:
return
# Use AVALON_APP to get host name if available
# Use AYON_HOST_NAME to get host name if available
if not host_name:
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
# Use AVALON_APP_NAME to get full app name
# Use AYON_APP_NAME to get full app name
if not app_name:
app_name = os.environ.get("AVALON_APP_NAME")
app_name = os.environ.get("AYON_APP_NAME")
# Fill missing values based on app full name
if (not host_name or not app_label) and app_name:

View file

@ -179,14 +179,14 @@ class CollectRenderedFiles(pyblish.api.ContextPlugin):
)
# Remap workdir if it's set
workdir = os.getenv("AVALON_WORKDIR")
workdir = os.getenv("AYON_WORKDIR")
remapped_workdir = None
if workdir:
remapped_workdir = anatomy.roots_obj.path_remapper(
os.getenv("AVALON_WORKDIR")
os.getenv("AYON_WORKDIR")
)
if remapped_workdir:
os.environ["AVALON_WORKDIR"] = remapped_workdir
os.environ["AYON_WORKDIR"] = remapped_workdir
except Exception as e:
self.log.error(e, exc_info=True)
raise Exception("Error") from e

View file

@ -79,7 +79,7 @@ def main(argv):
if after_script_idx is not None:
launch_args = sys_args[after_script_idx:]
host_name = os.environ["AVALON_APP"].lower()
host_name = os.environ["AYON_HOST_NAME"].lower()
if host_name == "photoshop":
# TODO refactor launch logic according to AE
from ayon_core.hosts.photoshop.api.lib import main
@ -90,7 +90,7 @@ def main(argv):
else:
title = "Unknown host name"
message = (
"BUG: Environment variable AVALON_APP contains unknown"
"BUG: Environment variable AYON_HOST_NAME contains unknown"
" host name \"{}\""
).format(host_name)
show_error_messagebox(title, message)

View file

@ -9,6 +9,7 @@ from .lib import (
get_current_project_settings,
get_local_settings,
)
from .ayon_settings import get_ayon_settings
__all__ = (
@ -20,4 +21,6 @@ __all__ = (
"get_project_settings",
"get_current_project_settings",
"get_local_settings",
"get_ayon_settings",
)

View file

@ -62,36 +62,6 @@ def _convert_general(ayon_settings, output, default_settings):
}
def _convert_kitsu_system_settings(
ayon_settings, output, addon_versions, default_settings
):
if "kitsu" in ayon_settings:
output["kitsu"] = ayon_settings["kitsu"]
enabled = addon_versions.get("kitsu") is not None
kitsu_settings = default_settings["modules"]["kitsu"]
kitsu_settings["enabled"] = enabled
if enabled:
kitsu_settings["server"] = ayon_settings["kitsu"]["server"]
output["modules"]["kitsu"] = kitsu_settings
def _convert_deadline_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("deadline") is not None
deadline_settings = default_settings["modules"]["deadline"]
deadline_settings["enabled"] = enabled
if enabled:
ayon_deadline = ayon_settings["deadline"]
deadline_settings["deadline_urls"] = {
item["name"]: item["value"]
for item in ayon_deadline["deadline_urls"]
}
output["modules"]["deadline"] = deadline_settings
def _convert_royalrender_system_settings(
ayon_settings, output, addon_versions, default_settings
):
@ -113,8 +83,6 @@ def _convert_modules_system(
# TODO add all modules
# TODO add 'enabled' values
for func in (
_convert_kitsu_system_settings,
_convert_deadline_system_settings,
_convert_royalrender_system_settings,
):
func(ayon_settings, output, addon_versions, default_settings)
@ -122,6 +90,7 @@ def _convert_modules_system(
for key in {
"timers_manager",
"clockify",
"deadline",
}:
if addon_versions.get(key):
output[key] = ayon_settings
@ -164,9 +133,6 @@ def convert_system_settings(ayon_settings, default_settings, addon_versions):
output = {
"modules": {}
}
if "applications" in ayon_settings:
output["applications"] = ayon_settings["applications"]
if "core" in ayon_settings:
_convert_general(ayon_settings, output, default_settings)
@ -188,59 +154,6 @@ def convert_system_settings(ayon_settings, default_settings, addon_versions):
# --------- Project settings ---------
def _convert_blender_project_settings(ayon_settings, output):
if "blender" not in ayon_settings:
return
ayon_blender = ayon_settings["blender"]
output["blender"] = ayon_blender
def _convert_celaction_project_settings(ayon_settings, output):
if "celaction" not in ayon_settings:
return
ayon_celaction = ayon_settings["celaction"]
output["celaction"] = ayon_celaction
def _convert_flame_project_settings(ayon_settings, output):
if "flame" not in ayon_settings:
return
ayon_flame = ayon_settings["flame"]
output["flame"] = ayon_flame
def _convert_fusion_project_settings(ayon_settings, output):
if "fusion" not in ayon_settings:
return
ayon_fusion = ayon_settings["fusion"]
output["fusion"] = ayon_fusion
def _convert_maya_project_settings(ayon_settings, output):
if "maya" not in ayon_settings:
return
ayon_maya = ayon_settings["maya"]
output["maya"] = ayon_maya
def _convert_3dsmax_project_settings(ayon_settings, output):
if "max" not in ayon_settings:
return
ayon_max = ayon_settings["max"]
output["max"] = ayon_max
def _convert_nuke_knobs(knobs):
new_knobs = []
for knob in knobs:
@ -456,56 +369,6 @@ def _convert_hiero_project_settings(ayon_settings, output):
output["hiero"] = ayon_hiero
def _convert_photoshop_project_settings(ayon_settings, output):
if "photoshop" not in ayon_settings:
return
ayon_photoshop = ayon_settings["photoshop"]
output["photoshop"] = ayon_photoshop
def _convert_substancepainter_project_settings(ayon_settings, output):
if "substancepainter" not in ayon_settings:
return
ayon_substance_painter = ayon_settings["substancepainter"]
output["substancepainter"] = ayon_substance_painter
def _convert_tvpaint_project_settings(ayon_settings, output):
if "tvpaint" not in ayon_settings:
return
ayon_tvpaint = ayon_settings["tvpaint"]
output["tvpaint"] = ayon_tvpaint
def _convert_traypublisher_project_settings(ayon_settings, output):
if "traypublisher" not in ayon_settings:
return
ayon_traypublisher = ayon_settings["traypublisher"]
output["traypublisher"] = ayon_traypublisher
def _convert_webpublisher_project_settings(ayon_settings, output):
if "webpublisher" not in ayon_settings:
return
ayon_webpublisher = ayon_settings["webpublisher"]
ayon_publish = ayon_webpublisher["publish"]
ayon_collect_files = ayon_publish["CollectPublishedFiles"]
ayon_collect_files["task_type_to_family"] = {
item["name"]: item["value"]
for item in ayon_collect_files["task_type_to_family"]
}
output["webpublisher"] = ayon_webpublisher
def _convert_royalrender_project_settings(ayon_settings, output):
if "royalrender" not in ayon_settings:
return
@ -518,62 +381,6 @@ def _convert_royalrender_project_settings(ayon_settings, output):
}
def _convert_kitsu_project_settings(ayon_settings, output):
if "kitsu" not in ayon_settings:
return
ayon_kitsu_settings = ayon_settings["kitsu"]
ayon_kitsu_settings.pop("server")
integrate_note = ayon_kitsu_settings["publish"]["IntegrateKitsuNote"]
status_change_conditions = integrate_note["status_change_conditions"]
if "product_type_requirements" in status_change_conditions:
status_change_conditions["family_requirements"] = (
status_change_conditions.pop("product_type_requirements"))
output["kitsu"] = ayon_kitsu_settings
def _convert_shotgrid_project_settings(ayon_settings, output):
if "shotgrid" not in ayon_settings:
return
ayon_shotgrid = ayon_settings["shotgrid"]
# This means that a different variant of addon is used
if "leecher_backend_url" not in ayon_shotgrid:
return
for key in {
"leecher_backend_url",
"filter_projects_by_login",
"shotgrid_settings",
"leecher_manager_url",
}:
ayon_shotgrid.pop(key)
asset_field = ayon_shotgrid["fields"]["asset"]
asset_field["type"] = asset_field.pop("asset_type")
task_field = ayon_shotgrid["fields"]["task"]
if "task" in task_field:
task_field["step"] = task_field.pop("task")
output["shotgrid"] = ayon_settings["shotgrid"]
def _convert_slack_project_settings(ayon_settings, output):
if "slack" not in ayon_settings:
return
ayon_slack = ayon_settings["slack"]
ayon_slack.pop("enabled", None)
for profile in ayon_slack["publish"]["CollectSlackFamilies"]["profiles"]:
profile["tasks"] = profile.pop("task_names")
profile["subsets"] = profile.pop("subset_names")
output["slack"] = ayon_slack
def _convert_global_project_settings(ayon_settings, output, default_settings):
if "core" not in ayon_settings:
return
@ -747,41 +554,13 @@ def _convert_global_project_settings(ayon_settings, output, default_settings):
def convert_project_settings(ayon_settings, default_settings):
# Missing settings
# - standalonepublisher
default_settings = copy.deepcopy(default_settings)
output = {}
exact_match = {
"aftereffects",
"harmony",
"houdini",
"resolve",
"unreal",
"applications",
"deadline",
}
for key in exact_match:
if key in ayon_settings:
output[key] = ayon_settings[key]
_convert_blender_project_settings(ayon_settings, output)
_convert_celaction_project_settings(ayon_settings, output)
_convert_flame_project_settings(ayon_settings, output)
_convert_fusion_project_settings(ayon_settings, output)
_convert_maya_project_settings(ayon_settings, output)
_convert_3dsmax_project_settings(ayon_settings, output)
_convert_nuke_project_settings(ayon_settings, output)
_convert_hiero_project_settings(ayon_settings, output)
_convert_photoshop_project_settings(ayon_settings, output)
_convert_substancepainter_project_settings(ayon_settings, output)
_convert_tvpaint_project_settings(ayon_settings, output)
_convert_traypublisher_project_settings(ayon_settings, output)
_convert_webpublisher_project_settings(ayon_settings, output)
_convert_royalrender_project_settings(ayon_settings, output)
_convert_kitsu_project_settings(ayon_settings, output)
_convert_shotgrid_project_settings(ayon_settings, output)
_convert_slack_project_settings(ayon_settings, output)
_convert_global_project_settings(ayon_settings, output, default_settings)

View file

@ -241,15 +241,15 @@ def get_site_local_overrides(project_name, site_name, local_settings=None):
def get_current_project_settings():
"""Project settings for current context project.
Project name should be stored in environment variable `AVALON_PROJECT`.
Project name should be stored in environment variable `AYON_PROJECT_NAME`.
This function should be used only in host context where environment
variable must be set and should not happen that any part of process will
change the value of the enviornment variable.
"""
project_name = os.environ.get("AVALON_PROJECT")
project_name = os.environ.get("AYON_PROJECT_NAME")
if not project_name:
raise ValueError(
"Missing context project in environemt variable `AVALON_PROJECT`."
"Missing context project in environemt variable `AYON_PROJECT_NAME`."
)
return get_project_settings(project_name)

View file

@ -9,6 +9,7 @@ from .folders_widget import (
FoldersWidget,
FoldersQtModel,
FOLDERS_MODEL_SENDER_NAME,
SimpleFoldersWidget,
)
from .tasks_widget import (
@ -31,6 +32,7 @@ __all__ = (
"FoldersWidget",
"FoldersQtModel",
"FOLDERS_MODEL_SENDER_NAME",
"SimpleFoldersWidget",
"TasksWidget",
"TasksQtModel",

View file

@ -2,6 +2,11 @@ import collections
from qtpy import QtWidgets, QtGui, QtCore
from ayon_core.lib.events import QueuedEventSystem
from ayon_core.tools.ayon_utils.models import (
HierarchyModel,
HierarchyExpectedSelection,
)
from ayon_core.tools.utils import (
RecursiveSortFilterProxyModel,
TreeView,
@ -390,6 +395,15 @@ class FoldersWidget(QtWidgets.QWidget):
return self._get_selected_item_id()
def get_selected_folder_path(self):
"""Get selected folder id.
Returns:
Union[str, None]: Folder path which is selected.
"""
return self._get_selected_item_value(FOLDER_PATH_ROLE)
def get_selected_folder_label(self):
"""Selected folder label.
@ -473,9 +487,12 @@ class FoldersWidget(QtWidgets.QWidget):
self.refreshed.emit()
def _get_selected_item_id(self):
return self._get_selected_item_value(FOLDER_ID_ROLE)
def _get_selected_item_value(self, role):
selection_model = self._folders_view.selectionModel()
for index in selection_model.selectedIndexes():
item_id = index.data(FOLDER_ID_ROLE)
item_id = index.data(role)
if item_id is not None:
return item_id
return None
@ -514,3 +531,110 @@ class FoldersWidget(QtWidgets.QWidget):
if folder_id is not None:
self.set_selected_folder(folder_id)
self._controller.expected_folder_selected(folder_id)
class SimpleSelectionModel(object):
"""Model handling selection changes.
Triggering events:
- "selection.project.changed"
- "selection.folder.changed"
"""
event_source = "selection.model"
def __init__(self, controller):
self._controller = controller
self._project_name = None
self._folder_id = None
self._task_id = None
self._task_name = None
def get_selected_project_name(self):
return self._project_name
def set_selected_project(self, project_name):
self._project_name = project_name
self._controller.emit_event(
"selection.project.changed",
{"project_name": project_name},
self.event_source
)
def get_selected_folder_id(self):
return self._folder_id
def set_selected_folder(self, folder_id):
if folder_id == self._folder_id:
return
self._folder_id = folder_id
self._controller.emit_event(
"selection.folder.changed",
{
"project_name": self._project_name,
"folder_id": folder_id,
},
self.event_source
)
class SimpleFoldersController(object):
def __init__(self):
self._event_system = self._create_event_system()
self._hierarchy_model = HierarchyModel(self)
self._selection_model = SimpleSelectionModel(self)
self._expected_selection = HierarchyExpectedSelection(
self, handle_project=False, handle_folder=True, handle_task=False
)
def emit_event(self, topic, data=None, source=None):
"""Use implemented event system to trigger event."""
if data is None:
data = {}
self._event_system.emit(topic, data, source)
def register_event_callback(self, topic, callback):
self._event_system.add_callback(topic, callback)
# Model functions
def get_folder_items(self, project_name, sender=None):
return self._hierarchy_model.get_folder_items(project_name, sender)
def set_selected_project(self, project_name):
self._selection_model.set_selected_project(project_name)
def set_selected_folder(self, folder_id):
self._selection_model.set_selected_folder(folder_id)
def get_expected_selection_data(self):
self._expected_selection.get_expected_selection_data()
def expected_folder_selected(self, folder_id):
self._expected_selection.expected_folder_selected(folder_id)
def _create_event_system(self):
return QueuedEventSystem()
class SimpleFoldersWidget(FoldersWidget):
def __init__(self, controller=None, *args, **kwargs):
if controller is None:
controller = SimpleFoldersController()
super(SimpleFoldersWidget, self).__init__(controller, *args, **kwargs)
def set_project_name(self, project_name):
self._controller.set_selected_project(project_name)
super(SimpleFoldersWidget, self).set_project_name(project_name)
def _on_project_selection_change(self, event):
"""Ignore project selection change from controller.
Only who can trigger project change is this widget with
'set_project_name' which already cares about project change.
Args:
event (Event): Triggered event.
"""
pass

View file

@ -89,9 +89,13 @@ class ExperimentalTools:
"New publisher",
"Combined creation and publishing into one tool.",
self._show_publisher,
hosts_filter=["blender", "maya", "nuke", "celaction", "flame",
"fusion", "harmony", "hiero", "resolve",
"tvpaint", "unreal"]
hosts_filter=[
"celaction",
"flame",
"harmony",
"hiero",
"resolve",
]
)
]
@ -139,7 +143,7 @@ class ExperimentalTools:
def get_tools_for_host(self, host_name=None):
if not host_name:
host_name = os.environ.get("AVALON_APP")
host_name = os.environ.get("AYON_HOST_NAME")
tools = []
for tool in self.tools:
if (

View file

@ -69,9 +69,9 @@ class ApplicationAction(LauncherAction):
_log = None
required_session_keys = (
"AVALON_PROJECT",
"AVALON_ASSET",
"AVALON_TASK"
"AYON_PROJECT_NAME",
"AYON_FOLDER_PATH",
"AYON_TASK_NAME"
)
@property
@ -85,7 +85,7 @@ class ApplicationAction(LauncherAction):
if not session.get(key):
return False
project_name = session["AVALON_PROJECT"]
project_name = session["AYON_PROJECT_NAME"]
project_entity = self.project_entities[project_name]
apps = project_entity["attrib"].get("applications")
if not apps or self.application.full_name not in apps:
@ -119,9 +119,9 @@ class ApplicationAction(LauncherAction):
ApplicationLaunchFailed,
)
project_name = session["AVALON_PROJECT"]
asset_name = session["AVALON_ASSET"]
task_name = session["AVALON_TASK"]
project_name = session["AYON_PROJECT_NAME"]
asset_name = session["AYON_FOLDER_PATH"]
task_name = session["AYON_TASK_NAME"]
try:
self.application.launch(
project_name=project_name,
@ -416,6 +416,10 @@ class ActionsModel:
task_name = task["name"]
return {
"AYON_PROJECT_NAME": project_name,
"AYON_FOLDER_PATH": folder_path,
"AYON_TASK_NAME": task_name,
# Deprecated - kept for backwards compatibility
"AVALON_PROJECT": project_name,
"AVALON_ASSET": folder_path,
"AVALON_TASK": task_name,

View file

@ -1807,9 +1807,9 @@ class PublisherController(BasePublisherController):
context_title = self._host.get_context_title()
if context_title is None:
context_title = os.environ.get("AVALON_APP_NAME")
context_title = os.environ.get("AYON_APP_NAME")
if context_title is None:
context_title = os.environ.get("AVALON_APP")
context_title = os.environ.get("AYON_HOST_NAME")
return context_title

View file

@ -132,8 +132,8 @@ class TextureCopy:
def texture_copy(asset, project, path):
t.echo("*** Running Texture tool ***")
t.echo(">>> Initializing avalon session ...")
os.environ["AVALON_PROJECT"] = project
os.environ["AVALON_ASSET"] = asset
os.environ["AYON_PROJECT_NAME"] = project
os.environ["AYON_FOLDER_PATH"] = asset
TextureCopy().process(asset, project, path)

View file

@ -27,7 +27,7 @@ class WorkfileBuildPlaceholderDialog(QtWidgets.QDialog):
host_name = getattr(self._host, "name", None)
if not host_name:
host_name = os.getenv("AVALON_APP") or "NA"
host_name = os.getenv("AYON_HOST_NAME") or "NA"
self._host_name = host_name
plugins_combo = QtWidgets.QComboBox(self)

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON core addon version."""
__version__ = "0.2.1-dev.1"
__version__ = "0.3.0-dev.1"

View file

@ -1,8 +1,11 @@
name = "core"
title = "Core"
version = "0.2.1-dev.1"
version = "0.3.0-dev.1"
client_dir = "ayon_core"
plugin_for = ["ayon_server"]
ayon_version = ">=1.0.3,<2.0.0"
requires = [
"~ayon_server-1.0.3+<2.0.0",
]

View file

@ -387,14 +387,22 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
"Crop input overscan. See the documentation for more information."
)
)
overscan_color: ColorRGB_uint8 = SettingsField(
(0, 0, 0),
overscan_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
title="Overscan color",
description=(
"Overscan color is used when input aspect ratio is not"
" same as output aspect ratio."
)
)
# overscan_color: ColorRGB_uint8 = SettingsField(
# (0, 0, 0),
# title="Overscan color",
# description=(
# "Overscan color is used when input aspect ratio is not"
# " same as output aspect ratio."
# )
# )
width: int = SettingsField(
0,
ge=0,
@ -901,7 +909,8 @@ DEFAULT_PUBLISH_VALUES = {
"single_frame_filter": "single_frame"
},
"overscan_crop": "",
"overscan_color": [0, 0, 0],
# "overscan_color": [0, 0, 0],
"overscan_color": [0, 0, 0, 0.0],
"width": 1920,
"height": 1080,
"scale_pixel_aspect": True,
@ -946,7 +955,8 @@ DEFAULT_PUBLISH_VALUES = {
"single_frame_filter": "multi_frame"
},
"overscan_crop": "",
"overscan_color": [0, 0, 0],
# "overscan_color": [0, 0, 0],
"overscan_color": [0, 0, 0, 0.0],
"width": 0,
"height": 0,
"scale_pixel_aspect": True,

View file

@ -92,8 +92,9 @@ class ApplicationsAddon(BaseServerAddon):
settings_model = ApplicationsAddonSettings
async def get_default_settings(self):
applications_path = os.path.join(self.addon_dir, "applications.json")
tools_path = os.path.join(self.addon_dir, "tools.json")
server_dir = os.path.join(self.addon_dir, "server")
applications_path = os.path.join(server_dir, "applications.json")
tools_path = os.path.join(server_dir, "tools.json")
default_values = copy.deepcopy(DEFAULT_VALUES)
with open(applications_path, "r") as stream:
default_values.update(json.load(stream))

View file

@ -40,6 +40,11 @@ IGNORED_HOSTS = [
IGNORED_MODULES = []
PACKAGE_PY_TEMPLATE = """name = "{addon_name}"
version = "{addon_version}"
plugin_for = ["ayon_server"]
"""
class ZipFileLongPaths(zipfile.ZipFile):
"""Allows longer paths in zip files.
@ -144,18 +149,12 @@ def create_addon_zip(
output_dir: Path,
addon_name: str,
addon_version: str,
keep_source: bool
keep_source: bool,
):
zip_filepath = output_dir / f"{addon_name}-{addon_version}.zip"
addon_output_dir = output_dir / addon_name / addon_version
with ZipFileLongPaths(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zipf:
zipf.writestr(
"manifest.json",
json.dumps({
"addon_name": addon_name,
"addon_version": addon_version
})
)
# Add client code content to zip
src_root = os.path.normpath(str(addon_output_dir.absolute()))
src_root_offset = len(src_root) + 1
@ -167,9 +166,10 @@ def create_addon_zip(
for filename in filenames:
src_path = os.path.join(root, filename)
if rel_root:
dst_path = os.path.join("addon", rel_root, filename)
dst_path = os.path.join(rel_root, filename)
else:
dst_path = os.path.join("addon", filename)
dst_path = filename
zipf.write(src_path, dst_path)
if not keep_source:
@ -180,9 +180,8 @@ def create_addon_package(
addon_dir: Path,
output_dir: Path,
create_zip: bool,
keep_source: bool
keep_source: bool,
):
server_dir = addon_dir / "server"
addon_version = get_addon_version(addon_dir)
addon_output_dir = output_dir / addon_dir.name / addon_version
@ -191,18 +190,21 @@ def create_addon_package(
addon_output_dir.mkdir(parents=True)
# Copy server content
src_root = os.path.normpath(str(server_dir.absolute()))
src_root_offset = len(src_root) + 1
for root, _, filenames in os.walk(str(server_dir)):
dst_root = addon_output_dir
if root != src_root:
rel_root = root[src_root_offset:]
dst_root = dst_root / rel_root
package_py = addon_output_dir / "package.py"
addon_name = addon_dir.name
if addon_name == "royal_render":
addon_name = "royalrender"
package_py_content = PACKAGE_PY_TEMPLATE.format(
addon_name=addon_name, addon_version=addon_version
)
dst_root.mkdir(parents=True, exist_ok=True)
for filename in filenames:
src_path = os.path.join(root, filename)
shutil.copy(src_path, str(dst_root))
with open(package_py, "w+") as pkg_py:
pkg_py.write(package_py_content)
server_dir = addon_dir / "server"
shutil.copytree(
server_dir, addon_output_dir / "server", dirs_exist_ok=True
)
if create_zip:
create_addon_zip(

View file

@ -1,72 +1,88 @@
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.types import ColorRGB_float
from ayon_server.types import ColorRGB_float, ColorRGBA_uint8
class ColorsSetting(BaseSettingsModel):
model: ColorRGB_float = SettingsField(
(0.82, 0.52, 0.12),
title="Model:"
)
rig: ColorRGB_float = SettingsField(
(0.23, 0.89, 0.92),
title="Rig:"
)
pointcache: ColorRGB_float = SettingsField(
(0.37, 0.82, 0.12),
title="Pointcache:"
)
animation: ColorRGB_float = SettingsField(
(0.37, 0.82, 0.12),
title="Animation:"
)
ass: ColorRGB_float = SettingsField(
(0.98, 0.53, 0.21),
title="Arnold StandIn:"
)
camera: ColorRGB_float = SettingsField(
(0.53, 0.45, 0.96),
title="Camera:"
)
fbx: ColorRGB_float = SettingsField(
(0.84, 0.65, 1.0),
title="FBX:"
)
mayaAscii: ColorRGB_float = SettingsField(
(0.26, 0.68, 1.0),
title="Maya Ascii:"
)
mayaScene: ColorRGB_float = SettingsField(
(0.26, 0.68, 1.0),
title="Maya Scene:"
)
setdress: ColorRGB_float = SettingsField(
(1.0, 0.98, 0.35),
title="Set Dress:"
)
layout: ColorRGB_float = SettingsField(
(1.0, 0.98, 0.35),
title="Layout:"
)
vdbcache: ColorRGB_float = SettingsField(
(0.98, 0.21, 0.0),
title="VDB Cache:"
)
vrayproxy: ColorRGB_float = SettingsField(
(1.0, 0.59, 0.05),
title="VRay Proxy:"
)
vrayscene_layer: ColorRGB_float = SettingsField(
(1.0, 0.59, 0.05),
title="VRay Scene:"
)
yeticache: ColorRGB_float = SettingsField(
(0.39, 0.81, 0.86),
title="Yeti Cache:"
)
yetiRig: ColorRGB_float = SettingsField(
(0.0, 0.80, 0.49),
title="Yeti Rig:"
)
model: ColorRGBA_uint8 = SettingsField(
(209, 132, 30, 1.0), title="Model:")
rig: ColorRGBA_uint8 = SettingsField(
(59, 226, 235, 1.0), title="Rig:")
pointcache: ColorRGBA_uint8 = SettingsField(
(94, 209, 30, 1.0), title="Pointcache:")
animation: ColorRGBA_uint8 = SettingsField(
(94, 209, 30, 1.0), title="Animation:")
ass: ColorRGBA_uint8 = SettingsField(
(249, 135, 53, 1.0), title="Arnold StandIn:")
camera: ColorRGBA_uint8 = SettingsField(
(136, 114, 244, 1.0), title="Camera:")
fbx: ColorRGBA_uint8 = SettingsField(
(215, 166, 255, 1.0), title="FBX:")
mayaAscii: ColorRGBA_uint8 = SettingsField(
(67, 174, 255, 1.0), title="Maya Ascii:")
mayaScene: ColorRGBA_uint8 = SettingsField(
(67, 174, 255, 1.0), title="Maya Scene:")
setdress: ColorRGBA_uint8 = SettingsField(
(255, 250, 90, 1.0), title="Set Dress:")
layout: ColorRGBA_uint8 = SettingsField((
255, 250, 90, 1.0), title="Layout:")
vdbcache: ColorRGBA_uint8 = SettingsField(
(249, 54, 0, 1.0), title="VDB Cache:")
vrayproxy: ColorRGBA_uint8 = SettingsField(
(255, 150, 12, 1.0), title="VRay Proxy:")
vrayscene_layer: ColorRGBA_uint8 = SettingsField(
(255, 150, 12, 1.0), title="VRay Scene:")
yeticache: ColorRGBA_uint8 = SettingsField(
(99, 206, 220, 1.0), title="Yeti Cache:")
yetiRig: ColorRGBA_uint8 = SettingsField(
(0, 205, 125, 1.0), title="Yeti Rig:")
# model: ColorRGB_float = SettingsField(
# (0.82, 0.52, 0.12), title="Model:"
# )
# rig: ColorRGB_float = SettingsField(
# (0.23, 0.89, 0.92), title="Rig:"
# )
# pointcache: ColorRGB_float = SettingsField(
# (0.37, 0.82, 0.12), title="Pointcache:"
# )
# animation: ColorRGB_float = SettingsField(
# (0.37, 0.82, 0.12), title="Animation:"
# )
# ass: ColorRGB_float = SettingsField(
# (0.98, 0.53, 0.21), title="Arnold StandIn:"
# )
# camera: ColorRGB_float = SettingsField(
# (0.53, 0.45, 0.96), title="Camera:"
# )
# fbx: ColorRGB_float = SettingsField(
# (0.84, 0.65, 1.0), title="FBX:"
# )
# mayaAscii: ColorRGB_float = SettingsField(
# (0.26, 0.68, 1.0), title="Maya Ascii:"
# )
# mayaScene: ColorRGB_float = SettingsField(
# (0.26, 0.68, 1.0), title="Maya Scene:"
# )
# setdress: ColorRGB_float = SettingsField(
# (1.0, 0.98, 0.35), title="Set Dress:"
# )
# layout: ColorRGB_float = SettingsField(
# (1.0, 0.98, 0.35), title="Layout:"
# )
# vdbcache: ColorRGB_float = SettingsField(
# (0.98, 0.21, 0.0), title="VDB Cache:"
# )
# vrayproxy: ColorRGB_float = SettingsField(
# (1.0, 0.59, 0.05), title="VRay Proxy:"
# )
# vrayscene_layer: ColorRGB_float = SettingsField(
# (1.0, 0.59, 0.05), title="VRay Scene:"
# )
# yeticache: ColorRGB_float = SettingsField(
# (0.39, 0.81, 0.86), title="Yeti Cache:"
# )
# yetiRig: ColorRGB_float = SettingsField(
# (0.0, 0.80, 0.49), title="Yeti Rig:"
# )
class ReferenceLoaderModel(BaseSettingsModel):
@ -99,22 +115,38 @@ class LoadersModel(BaseSettingsModel):
DEFAULT_LOADERS_SETTING = {
"colors": {
"model": [0.82, 0.52, 0.12],
"rig": [0.23, 0.89, 0.92],
"pointcache": [0.37, 0.82, 0.12],
"animation": [0.37, 0.82, 0.12],
"ass": [0.98, 0.53, 0.21],
"camera":[0.53, 0.45, 0.96],
"fbx": [0.84, 0.65, 1.0],
"mayaAscii": [0.26, 0.68, 1.0],
"mayaScene": [0.26, 0.68, 1.0],
"setdress": [1.0, 0.98, 0.35],
"layout": [1.0, 0.98, 0.35],
"vdbcache": [0.98, 0.21, 0.0],
"vrayproxy": [1.0, 0.59, 0.05],
"vrayscene_layer": [1.0, 0.59, 0.05],
"yeticache": [0.39, 0.81, 0.86],
"yetiRig": [0.0, 0.80, 0.49],
"model": [209, 132, 30, 1.0],
"rig": [59, 226, 235, 1.0],
"pointcache": [94, 209, 30, 1.0],
"animation": [94, 209, 30, 1.0],
"ass": [249, 135, 53, 1.0],
"camera": [136, 114, 244, 1.0],
"fbx": [215, 166, 255, 1.0],
"mayaAscii": [67, 174, 255, 1.0],
"mayaScene": [67, 174, 255, 1.0],
"setdress": [255, 250, 90, 1.0],
"layout": [255, 250, 90, 1.0],
"vdbcache": [249, 54, 0, 1.0],
"vrayproxy": [255, 150, 12, 1.0],
"vrayscene_layer": [255, 150, 12, 1.0],
"yeticache": [99, 206, 220, 1.0],
"yetiRig": [0, 205, 125, 1.0]
# "model": [0.82, 0.52, 0.12],
# "rig": [0.23, 0.89, 0.92],
# "pointcache": [0.37, 0.82, 0.12],
# "animation": [0.37, 0.82, 0.12],
# "ass": [0.98, 0.53, 0.21],
# "camera":[0.53, 0.45, 0.96],
# "fbx": [0.84, 0.65, 1.0],
# "mayaAscii": [0.26, 0.68, 1.0],
# "mayaScene": [0.26, 0.68, 1.0],
# "setdress": [1.0, 0.98, 0.35],
# "layout": [1.0, 0.98, 0.35],
# "vdbcache": [0.98, 0.21, 0.0],
# "vrayproxy": [1.0, 0.59, 0.05],
# "vrayscene_layer": [1.0, 0.59, 0.05],
# "yeticache": [0.39, 0.81, 0.86],
# "yetiRig": [0.0, 0.80, 0.49],
},
"reference_loader": {
"namespace": "{folder[name]}_{product[name]}_##_",

View file

@ -6,7 +6,7 @@ from ayon_server.settings import (
ensure_unique_names,
task_types_enum,
)
from ayon_server.types import ColorRGB_float
from ayon_server.types import ColorRGBA_uint8, ColorRGB_float
def hardware_falloff_enum():
@ -54,18 +54,27 @@ class DisplayOptionsSetting(BaseSettingsModel):
override_display: bool = SettingsField(
True, title="Override display options"
)
background: ColorRGB_float = SettingsField(
(0.5, 0.5, 0.5), title="Background Color"
background: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Color"
)
# background: ColorRGB_float = SettingsField(
# (0.5, 0.5, 0.5), title="Background Color"
# )
displayGradient: bool = SettingsField(
True, title="Display background gradient"
)
backgroundTop: ColorRGB_float = SettingsField(
(0.5, 0.5, 0.5), title="Background Top"
backgroundTop: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Top"
)
backgroundBottom: ColorRGB_float = SettingsField(
(0.5, 0.5, 0.5), title="Background Bottom"
backgroundBottom: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Bottom"
)
# backgroundTop: ColorRGB_float = SettingsField(
# (0.5, 0.5, 0.5), title="Background Top"
# )
# backgroundBottom: ColorRGB_float = SettingsField(
# (0.5, 0.5, 0.5), title="Background Bottom"
# )
class GenericSetting(BaseSettingsModel):
@ -282,21 +291,12 @@ DEFAULT_PLAYBLAST_SETTING = {
},
"DisplayOptions": {
"override_display": True,
"background": [
0.5,
0.5,
0.5
],
"backgroundBottom": [
0.5,
0.5,
0.5
],
"backgroundTop": [
0.5,
0.5,
0.5
],
"background": [125, 125, 125, 1.0],
"backgroundBottom": [125, 125, 125, 1.0],
"backgroundTop": [125, 125, 125, 1.0],
# "background": [0.5, 0.5, 0.5],
# "backgroundBottom": [0.5, 0.5, 0.5],
# "backgroundTop": [0.5, 0.5, 0.5],
"displayGradient": True
},
"Generic": {

Some files were not shown because too many files have changed in this diff Show more