Merge branch 'develop' into feature/houdini_cleanup_after_publishing

This commit is contained in:
MustafaJafar 2024-04-29 10:31:26 +03:00
commit da07bce33e
26 changed files with 1756 additions and 79 deletions

View file

@ -5,7 +5,7 @@ import shutil
import argparse
import zipfile
import types
import importlib
import importlib.machinery
import platform
import collections
from pathlib import Path

View file

@ -34,6 +34,34 @@ class ImageIOFileRulesModel(BaseSettingsModel):
return value
class WorkfileImageIOModel(BaseSettingsModel):
"""Workfile settings help.
Empty values will be skipped, allowing any existing env vars to
pass through as defined.
Note: The render space in Houdini is
always set to the 'scene_linear' role."""
enabled: bool = SettingsField(False, title="Enabled")
default_display: str = SettingsField(
title="Default active displays",
description="It behaves like the 'OCIO_ACTIVE_DISPLAYS' env var,"
" Colon-separated list of displays, e.g ACES:P3"
)
default_view: str = SettingsField(
title="Default active views",
description="It behaves like the 'OCIO_ACTIVE_VIEWS' env var,"
" Colon-separated list of views, e.g sRGB:DCDM"
)
review_color_space: str = SettingsField(
title="Review colorspace",
description="It exposes OCIO Colorspace parameter in opengl nodes."
"if left empty, Ayon will figure out the default "
"colorspace using your default display and default view."
)
class HoudiniImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
@ -46,3 +74,26 @@ class HoudiniImageIOModel(BaseSettingsModel):
default_factory=ImageIOFileRulesModel,
title="File Rules"
)
workfile: WorkfileImageIOModel = SettingsField(
default_factory=WorkfileImageIOModel,
title="Workfile"
)
DEFAULT_IMAGEIO_SETTINGS = {
"activate_host_color_management": False,
"ocio_config": {
"override_global_config": False,
"filepath": []
},
"file_rules": {
"activate_host_rules": False,
"rules": []
},
"workfile": {
"enabled": False,
"default_display": "ACES",
"default_view": "sRGB",
"review_color_space": ""
}
}

View file

@ -3,7 +3,10 @@ from .general import (
GeneralSettingsModel,
DEFAULT_GENERAL_SETTINGS
)
from .imageio import HoudiniImageIOModel
from .imageio import (
HoudiniImageIOModel,
DEFAULT_IMAGEIO_SETTINGS
)
from .shelves import ShelvesModel
from .create import (
CreatePluginsModel,
@ -40,6 +43,7 @@ class HoudiniSettings(BaseSettingsModel):
DEFAULT_VALUES = {
"general": DEFAULT_GENERAL_SETTINGS,
"imageio": DEFAULT_IMAGEIO_SETTINGS,
"shelves": [],
"create": DEFAULT_HOUDINI_CREATE_SETTINGS,
"publish": DEFAULT_HOUDINI_PUBLISH_SETTINGS

View file

@ -1,4 +1,7 @@
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
from ayon_server.exceptions import BadRequestException
class BatchMovieCreatorPlugin(BaseSettingsModel):
@ -22,11 +25,139 @@ class BatchMovieCreatorPlugin(BaseSettingsModel):
)
class ColumnItemModel(BaseSettingsModel):
"""Allows to publish multiple video files in one go. <br />Name of matching
asset is parsed from file names ('asset.mov', 'asset_v001.mov',
'my_asset_to_publish.mov')"""
name: str = SettingsField(
title="Name",
default=""
)
type: str = SettingsField(
title="Type",
default=""
)
default: str = SettingsField(
title="Default",
default=""
)
required_column: bool = SettingsField(
title="Required Column",
default=False
)
validation_pattern: str = SettingsField(
title="Validation Regex Pattern",
default="^(.*)$"
)
class ColumnConfigModel(BaseSettingsModel):
"""Allows to publish multiple video files in one go. <br />Name of matching
asset is parsed from file names ('asset.mov', 'asset_v001.mov',
'my_asset_to_publish.mov')"""
csv_delimiter: str = SettingsField(
title="CSV delimiter",
default=","
)
columns: list[ColumnItemModel] = SettingsField(
title="Columns",
default_factory=list
)
@validator("columns")
def validate_unique_outputs(cls, value):
ensure_unique_names(value)
return value
class RepresentationItemModel(BaseSettingsModel):
"""Allows to publish multiple video files in one go.
Name of matching asset is parsed from file names
('asset.mov', 'asset_v001.mov', 'my_asset_to_publish.mov')
"""
name: str = SettingsField(
title="Name",
default=""
)
extensions: list[str] = SettingsField(
title="Extensions",
default_factory=list
)
@validator("extensions")
def validate_extension(cls, value):
for ext in value:
if not ext.startswith("."):
raise BadRequestException(f"Extension must start with '.': {ext}")
return value
class RepresentationConfigModel(BaseSettingsModel):
"""Allows to publish multiple video files in one go. <br />Name of matching
asset is parsed from file names ('asset.mov', 'asset_v001.mov',
'my_asset_to_publish.mov')"""
tags_delimiter: str = SettingsField(
title="Tags delimiter",
default=";"
)
default_tags: list[str] = SettingsField(
title="Default tags",
default_factory=list
)
representations: list[RepresentationItemModel] = SettingsField(
title="Representations",
default_factory=list
)
@validator("representations")
def validate_unique_outputs(cls, value):
ensure_unique_names(value)
return value
class IngestCSVPluginModel(BaseSettingsModel):
"""Allows to publish multiple video files in one go. <br />Name of matching
asset is parsed from file names ('asset.mov', 'asset_v001.mov',
'my_asset_to_publish.mov')"""
enabled: bool = SettingsField(
title="Enabled",
default=False
)
columns_config: ColumnConfigModel = SettingsField(
title="Columns config",
default_factory=ColumnConfigModel
)
representations_config: RepresentationConfigModel = SettingsField(
title="Representations config",
default_factory=RepresentationConfigModel
)
class TrayPublisherCreatePluginsModel(BaseSettingsModel):
BatchMovieCreator: BatchMovieCreatorPlugin = SettingsField(
title="Batch Movie Creator",
default_factory=BatchMovieCreatorPlugin
)
IngestCSV: IngestCSVPluginModel = SettingsField(
title="Ingest CSV",
default_factory=IngestCSVPluginModel
)
DEFAULT_CREATORS = {
@ -41,4 +172,170 @@ DEFAULT_CREATORS = {
".mov"
]
},
"IngestCSV": {
"enabled": True,
"columns_config": {
"csv_delimiter": ",",
"columns": [
{
"name": "File Path",
"type": "text",
"default": "",
"required_column": True,
"validation_pattern": "^([a-z0-9#._\\/]*)$"
},
{
"name": "Folder Path",
"type": "text",
"default": "",
"required_column": True,
"validation_pattern": "^([a-zA-Z0-9_\\/]*)$"
},
{
"name": "Task Name",
"type": "text",
"default": "",
"required_column": True,
"validation_pattern": "^(.*)$"
},
{
"name": "Product Type",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
},
{
"name": "Variant",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
},
{
"name": "Version",
"type": "number",
"default": 1,
"required_column": True,
"validation_pattern": "^(\\d{1,3})$"
},
{
"name": "Version Comment",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
},
{
"name": "Version Thumbnail",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^([a-zA-Z0-9#._\\/]*)$"
},
{
"name": "Frame Start",
"type": "number",
"default": 0,
"required_column": True,
"validation_pattern": "^(\\d{1,8})$"
},
{
"name": "Frame End",
"type": "number",
"default": 0,
"required_column": True,
"validation_pattern": "^(\\d{1,8})$"
},
{
"name": "Handle Start",
"type": "number",
"default": 0,
"required_column": True,
"validation_pattern": "^(\\d)$"
},
{
"name": "Handle End",
"type": "number",
"default": 0,
"required_column": True,
"validation_pattern": "^(\\d)$"
},
{
"name": "FPS",
"type": "decimal",
"default": 0.0,
"required_column": True,
"validation_pattern": "^[0-9]*\\.[0-9]+$|^[0-9]+$"
},
{
"name": "Slate Exists",
"type": "bool",
"default": True,
"required_column": False,
"validation_pattern": "(True|False)"
},
{
"name": "Representation",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
},
{
"name": "Representation Colorspace",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
},
{
"name": "Representation Tags",
"type": "text",
"default": "",
"required_column": False,
"validation_pattern": "^(.*)$"
}
]
},
"representations_config": {
"tags_delimiter": ";",
"default_tags": [
"review"
],
"representations": [
{
"name": "preview",
"extensions": [
".mp4",
".mov"
]
},
{
"name": "exr",
"extensions": [
".exr"
]
},
{
"name": "edit",
"extensions": [
".mov"
]
},
{
"name": "review",
"extensions": [
".mov"
]
},
{
"name": "nuke",
"extensions": [
".nk"
]
}
]
}
}
}