ayon-core/server/settings/tools.py
2025-11-12 17:21:34 +01:00

685 lines
20 KiB
Python

from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
normalize_name,
ensure_unique_names,
task_types_enum,
anatomy_template_items_enum
)
class ProductTypeSmartSelectModel(BaseSettingsModel):
_layout = "expanded"
name: str = SettingsField("", title="Product type")
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
@validator("name")
def normalize_value(cls, value):
return normalize_name(value)
class ProductNameProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = SettingsField(
default_factory=list, title="Product types"
)
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
template: str = SettingsField("", title="Template", regex=r"^[<>{}\[\]a-zA-Z0-9_.]+$")
class FilterCreatorProfile(BaseSettingsModel):
"""Provide list of allowed Creator identifiers for context"""
_layout = "expanded"
host_names: list[str] = SettingsField(
default_factory=list, title="Host names"
)
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names")
creator_labels: list[str] = SettingsField(
default_factory=list,
title="Allowed Creator Labels",
description="Copy creator label from Publisher, regex supported."
)
class CreatorToolModel(BaseSettingsModel):
# TODO this was dynamic dictionary '{name: task_names}'
product_types_smart_select: list[ProductTypeSmartSelectModel] = (
SettingsField(
default_factory=list,
title="Create Smart Select"
)
)
# TODO: change to False in next releases
use_legacy_product_names_for_renders: bool = SettingsField(
True,
title="Use legacy product names for renders",
description="Use product naming templates for renders. "
"This is for backwards compatibility enabled by default."
"When enabled, it will ignore any templates for renders "
"that are set in the product name profiles.")
product_name_profiles: list[ProductNameProfile] = SettingsField(
default_factory=list,
title="Product name profiles"
)
filter_creator_profiles: list[FilterCreatorProfile] = SettingsField(
default_factory=list,
title="Filter creator profiles",
description="Allowed list of creator labels that will be only shown"
" if profile matches context."
)
@validator("product_types_smart_select")
def validate_unique_name(cls, value):
ensure_unique_names(value)
return value
class WorkfileTemplateProfile(BaseSettingsModel):
_layout = "expanded"
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
# TODO this was using project anatomy template name
workfile_template: str = SettingsField("", title="Workfile template")
class LastWorkfileOnStartupProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
enabled: bool = SettingsField(True, title="Enabled")
use_last_published_workfile: bool = SettingsField(
True, title="Use last published workfile"
)
class WorkfilesToolOnStartupProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
enabled: bool = SettingsField(True, title="Enabled")
class ExtraWorkFoldersProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
folders: list[str] = SettingsField(default_factory=list, title="Folders")
class WorkfilesLockProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
host_names: list[str] = SettingsField(default_factory=list, title="Hosts")
enabled: bool = SettingsField(True, title="Enabled")
class AYONMenuModel(BaseSettingsModel):
_layout = "expanded"
version_up_current_workfile: bool = SettingsField(
False,
title="Version Up Workfile",
description="Add 'Version Up Workfile' to AYON menu"
)
class WorkfilesToolModel(BaseSettingsModel):
workfile_template_profiles: list[WorkfileTemplateProfile] = SettingsField(
default_factory=list,
title="Workfile template profiles"
)
last_workfile_on_startup: list[LastWorkfileOnStartupProfile] = (
SettingsField(
default_factory=list,
title="Open last workfile on launch"
)
)
open_workfile_tool_on_startup: list[WorkfilesToolOnStartupProfile] = (
SettingsField(
default_factory=list,
title="Open workfile tool on launch"
)
)
extra_folders: list[ExtraWorkFoldersProfile] = SettingsField(
default_factory=list,
title="Extra work folders"
)
workfile_lock_profiles: list[WorkfilesLockProfile] = SettingsField(
default_factory=list,
title="Workfile lock profiles"
)
def _product_types_enum():
return [
"action",
"animation",
"assembly",
"audio",
"backgroundComp",
"backgroundLayout",
"camera",
"editorial",
"gizmo",
"image",
"imagesequence",
"layout",
"look",
"matchmove",
"mayaScene",
"model",
"nukenodes",
"plate",
"pointcache",
"prerender",
"redshiftproxy",
"reference",
"render",
"review",
"rig",
"setdress",
"take",
"usd",
"vdbcache",
"vrayproxy",
"workfile",
"xgen",
"yetiRig",
"yeticache"
]
def filter_type_enum():
return [
{"value": "is_allow_list", "label": "Allow list"},
{"value": "is_deny_list", "label": "Deny list"},
]
class LoaderProductTypeFilterProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
filter_type: str = SettingsField(
"is_allow_list",
title="Filter type",
section="Product type filter",
enum_resolver=filter_type_enum
)
filter_product_types: list[str] = SettingsField(
default_factory=list,
title="Product types",
enum_resolver=_product_types_enum
)
class LoaderToolModel(BaseSettingsModel):
product_type_filter_profiles: list[LoaderProductTypeFilterProfile] = (
SettingsField(default_factory=list, title="Product type filtering")
)
class PublishTemplateNameProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
template_name: str = SettingsField(
"",
title="Template name",
enum_resolver=anatomy_template_items_enum(category="publish")
)
class HeroTemplateNameProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
# TODO this should use hosts enum
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
template_name: str = SettingsField(
"",
title="Template name",
enum_resolver=anatomy_template_items_enum(category="hero")
)
class CustomStagingDirProfileModel(BaseSettingsModel):
active: bool = SettingsField(True, title="Is active")
hosts: list[str] = SettingsField(default_factory=list, title="Host names")
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
product_types: list[str] = SettingsField(
default_factory=list, title="Product types"
)
product_names: list[str] = SettingsField(
default_factory=list, title="Product names"
)
custom_staging_dir_persistent: bool = SettingsField(
False, title="Custom Staging Folder Persistent"
)
template_name: str = SettingsField(
"",
title="Template name",
enum_resolver=anatomy_template_items_enum(category="staging")
)
class PublishToolModel(BaseSettingsModel):
template_name_profiles: list[PublishTemplateNameProfile] = SettingsField(
default_factory=list,
title="Template name profiles"
)
hero_template_name_profiles: list[HeroTemplateNameProfile] = (
SettingsField(
default_factory=list,
title="Hero template name profiles"
)
)
custom_staging_dir_profiles: list[CustomStagingDirProfileModel] = (
SettingsField(
default_factory=list,
title="Custom Staging Dir Profiles"
)
)
comment_minimum_required_chars: int = SettingsField(
0,
title="Publish comment minimum required characters",
description=(
"Minimum number of characters required in the comment field "
"before the publisher UI is allowed to continue publishing"
)
)
class GlobalToolsModel(BaseSettingsModel):
ayon_menu: AYONMenuModel = SettingsField(
default_factory=AYONMenuModel,
title="AYON Menu"
)
creator: CreatorToolModel = SettingsField(
default_factory=CreatorToolModel,
title="Creator"
)
Workfiles: WorkfilesToolModel = SettingsField(
default_factory=WorkfilesToolModel,
title="Workfiles"
)
loader: LoaderToolModel = SettingsField(
default_factory=LoaderToolModel,
title="Loader"
)
publish: PublishToolModel = SettingsField(
default_factory=PublishToolModel,
title="Publish"
)
DEFAULT_TOOLS_VALUES = {
"ayon_menu": {
"version_up_current_workfile": False
},
"creator": {
"product_types_smart_select": [
{
"name": "Render",
"task_names": [
"light",
"render"
]
},
{
"name": "Model",
"task_names": [
"model"
]
},
{
"name": "Layout",
"task_names": [
"layout"
]
},
{
"name": "Look",
"task_names": [
"look"
]
},
{
"name": "Rig",
"task_names": [
"rigging",
"rig"
]
}
],
"product_name_profiles": [
{
"product_types": [],
"hosts": [],
"task_types": [],
"tasks": [],
"template": "{product[type]}{variant}"
},
{
"product_types": [
"workfile"
],
"hosts": [],
"task_types": [],
"tasks": [],
"template": "{product[type]}{Task[name]}"
},
{
"product_types": [
"render"
],
"hosts": [],
"task_types": [],
"tasks": [],
"template": "{product[type]}{Task[name]}{Variant}<_{Aov}>"
},
{
"product_types": [
"renderLayer",
"renderPass"
],
"hosts": [
"tvpaint"
],
"task_types": [],
"tasks": [],
"template": (
"{product[type]}{Task[name]}_{Renderlayer}_{Renderpass}"
)
},
{
"product_types": [
"review",
"workfile"
],
"hosts": [
"aftereffects",
"tvpaint"
],
"task_types": [],
"tasks": [],
"template": "{product[type]}{Task[name]}"
},
{
"product_types": ["render"],
"hosts": [
"aftereffects"
],
"task_types": [],
"tasks": [],
"template": "{product[type]}{Task[name]}{Composition}{Variant}"
},
{
"product_types": [
"staticMesh"
],
"hosts": [
"maya"
],
"task_types": [],
"tasks": [],
"template": "S_{folder[name]}{variant}"
},
{
"product_types": [
"skeletalMesh"
],
"hosts": [
"maya"
],
"task_types": [],
"tasks": [],
"template": "SK_{folder[name]}{variant}"
},
{
"product_types": [
"hda"
],
"hosts": [
"houdini"
],
"task_types": [],
"tasks": [],
"template": "{folder[name]}_{variant}"
},
{
"product_types": [
"textureSet"
],
"hosts": [
"substancedesigner"
],
"task_types": [],
"tasks": [],
"template": "T_{folder[name]}{variant}"
}
],
"filter_creator_profiles": []
},
"Workfiles": {
"workfile_template_profiles": [
{
"task_types": [],
"hosts": [],
"workfile_template": "default"
},
{
"task_types": [],
"hosts": [
"unreal"
],
"workfile_template": "unreal"
}
],
"last_workfile_on_startup": [
{
"hosts": [],
"task_types": [],
"tasks": [],
"enabled": True,
"use_last_published_workfile": False
}
],
"open_workfile_tool_on_startup": [
{
"hosts": [],
"task_types": [],
"tasks": [],
"enabled": False
}
],
"extra_folders": [],
"workfile_lock_profiles": []
},
"loader": {
"product_type_filter_profiles": []
},
"publish": {
"template_name_profiles": [
{
"product_types": [],
"hosts": [],
"task_types": [],
"task_names": [],
"template_name": "default"
},
{
"product_types": [
"review",
"render",
"prerender"
],
"hosts": [],
"task_types": [],
"task_names": [],
"template_name": "render"
},
{
"product_types": [
"simpleUnrealTexture"
],
"hosts": [
"standalonepublisher"
],
"task_types": [],
"task_names": [],
"template_name": "simpleUnrealTexture"
},
{
"product_types": [
"image",
"textures",
],
"hosts": [
"substancedesigner"
],
"task_types": [],
"task_names": [],
"template_name": "simpleUnrealTexture"
},
{
"product_types": [
"staticMesh",
"skeletalMesh"
],
"hosts": [
"maya"
],
"task_types": [],
"task_names": [],
"template_name": "maya2unreal"
},
{
"product_types": [
"online"
],
"hosts": [
"traypublisher"
],
"task_types": [],
"task_names": [],
"template_name": "online"
},
{
"product_types": [
"tycache"
],
"hosts": [
"max"
],
"task_types": [],
"task_names": [],
"template_name": "tycache"
}
],
"hero_template_name_profiles": [
{
"product_types": [
"simpleUnrealTexture"
],
"hosts": [
"standalonepublisher"
],
"task_types": [],
"task_names": [],
"template_name": "simpleUnrealTextureHero"
},
{
"product_types": [
"image",
"textures"
],
"hosts": [
"substancedesigner"
],
"task_types": [],
"task_names": [],
"template_name": "simpleUnrealTextureHero"
}
],
"comment_minimum_required_chars": 0,
}
}