mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
685 lines
20 KiB
Python
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,
|
|
}
|
|
}
|