AYON: Addons creation enhancements (#5356)

* updated nuke settings

* added addon version to zip filename

* fix Pattern type hint

* added ignored subdirs for openpype

* added titles to addons

* type hint fix - again

* modified settings conversion

* updated aftereffects settings

* updated blender settings

* updated clockify settings

* updated core settings

* updated deadline settings

* updated harmo settings

* updated kistsu settings

* updated maya settings

* updated muster settings

* updated royal render settings

* updated timers manager settings

* updated traypublisher settings

* implemented conversion of rr paths

* formatting fix
This commit is contained in:
Jakub Trllo 2023-07-28 11:51:23 +02:00 committed by GitHub
parent 6deace97d6
commit b43cac0b51
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
41 changed files with 341 additions and 246 deletions

View file

@ -161,91 +161,95 @@ def _convert_general(ayon_settings, output, default_settings):
output["general"] = general
def _convert_kitsu_system_settings(ayon_settings, output):
output["modules"]["kitsu"] = {
"server": ayon_settings["kitsu"]["server"]
}
def _convert_kitsu_system_settings(
ayon_settings, output, addon_versions, default_settings
):
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_ftrack_system_settings(ayon_settings, output, defaults):
# Ftrack contains few keys that are needed for initialization in OpenPype
# mode and some are used on different places
ftrack_settings = defaults["modules"]["ftrack"]
ftrack_settings["ftrack_server"] = (
ayon_settings["ftrack"]["ftrack_server"])
output["modules"]["ftrack"] = ftrack_settings
def _convert_shotgrid_system_settings(ayon_settings, output):
ayon_shotgrid = ayon_settings["shotgrid"]
# Skip conversion if different ayon addon is used
if "leecher_manager_url" not in ayon_shotgrid:
output["shotgrid"] = ayon_shotgrid
return
shotgrid_settings = {}
for key in (
"leecher_manager_url",
"leecher_backend_url",
"filter_projects_by_login",
):
shotgrid_settings[key] = ayon_shotgrid[key]
new_items = {}
for item in ayon_shotgrid["shotgrid_settings"]:
name = item.pop("name")
new_items[name] = item
shotgrid_settings["shotgrid_settings"] = new_items
output["modules"]["shotgrid"] = shotgrid_settings
def _convert_timers_manager_system_settings(ayon_settings, output):
ayon_manager = ayon_settings["timers_manager"]
manager_settings = {
key: ayon_manager[key]
for key in {
"auto_stop", "full_time", "message_time", "disregard_publishing"
}
}
def _convert_timers_manager_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("timers_manager") is not None
manager_settings = default_settings["modules"]["timers_manager"]
manager_settings["enabled"] = enabled
if enabled:
ayon_manager = ayon_settings["timers_manager"]
manager_settings.update({
key: ayon_manager[key]
for key in {
"auto_stop",
"full_time",
"message_time",
"disregard_publishing"
}
})
output["modules"]["timers_manager"] = manager_settings
def _convert_clockify_system_settings(ayon_settings, output):
output["modules"]["clockify"] = ayon_settings["clockify"]
def _convert_clockify_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("clockify") is not None
clockify_settings = default_settings["modules"]["clockify"]
clockify_settings["enabled"] = enabled
if enabled:
clockify_settings["workspace_name"] = (
ayon_settings["clockify"]["workspace_name"]
)
output["modules"]["clockify"] = clockify_settings
def _convert_deadline_system_settings(ayon_settings, output):
ayon_deadline = ayon_settings["deadline"]
deadline_settings = {
"deadline_urls": {
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_muster_system_settings(ayon_settings, output):
ayon_muster = ayon_settings["muster"]
templates_mapping = {
item["name"]: item["value"]
for item in ayon_muster["templates_mapping"]
}
output["modules"]["muster"] = {
"templates_mapping": templates_mapping,
"MUSTER_REST_URL": ayon_muster["MUSTER_REST_URL"]
}
def _convert_muster_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("muster") is not None
muster_settings = default_settings["modules"]["muster"]
muster_settings["enabled"] = enabled
if enabled:
ayon_muster = ayon_settings["muster"]
muster_settings["MUSTER_REST_URL"] = ayon_muster["MUSTER_REST_URL"]
muster_settings["templates_mapping"] = {
item["name"]: item["value"]
for item in ayon_muster["templates_mapping"]
}
output["modules"]["muster"] = muster_settings
def _convert_royalrender_system_settings(ayon_settings, output):
ayon_royalrender = ayon_settings["royalrender"]
output["modules"]["royalrender"] = {
"rr_paths": {
def _convert_royalrender_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("royalrender") is not None
rr_settings = default_settings["modules"]["royalrender"]
rr_settings["enabled"] = enabled
if enabled:
ayon_royalrender = ayon_settings["royalrender"]
rr_settings["rr_paths"] = {
item["name"]: item["value"]
for item in ayon_royalrender["rr_paths"]
}
}
output["modules"]["royalrender"] = rr_settings
def _convert_modules_system(
@ -253,42 +257,29 @@ def _convert_modules_system(
):
# TODO add all modules
# TODO add 'enabled' values
for key, func in (
("kitsu", _convert_kitsu_system_settings),
("shotgrid", _convert_shotgrid_system_settings),
("timers_manager", _convert_timers_manager_system_settings),
("clockify", _convert_clockify_system_settings),
("deadline", _convert_deadline_system_settings),
("muster", _convert_muster_system_settings),
("royalrender", _convert_royalrender_system_settings),
for func in (
_convert_kitsu_system_settings,
_convert_timers_manager_system_settings,
_convert_clockify_system_settings,
_convert_deadline_system_settings,
_convert_muster_system_settings,
_convert_royalrender_system_settings,
):
if key in ayon_settings:
func(ayon_settings, output)
func(ayon_settings, output, addon_versions, default_settings)
if "ftrack" in ayon_settings:
_convert_ftrack_system_settings(
ayon_settings, output, default_settings)
output_modules = output["modules"]
# TODO remove when not needed
for module_name, value in default_settings["modules"].items():
if module_name not in output_modules:
output_modules[module_name] = value
for module_name, value in default_settings["modules"].items():
if "enabled" not in value or module_name not in output_modules:
continue
ayon_module_name = module_name
if module_name == "sync_server":
ayon_module_name = "sitesync"
output_modules[module_name]["enabled"] = (
ayon_module_name in addon_versions)
# Missing modules conversions
# - "sync_server" -> renamed to sitesync
# - "slack" -> only 'enabled'
# - "job_queue" -> completelly missing in ayon
for module_name in (
"sync_server",
"log_viewer",
"standalonepublish_tool",
"project_manager",
"job_queue",
"avalon",
"addon_paths",
):
settings = default_settings["modules"][module_name]
if "enabled" in settings:
settings["enabled"] = False
output["modules"][module_name] = settings
def convert_system_settings(ayon_settings, default_settings, addon_versions):
@ -724,12 +715,6 @@ def _convert_nuke_project_settings(ayon_settings, output):
item_filter["subsets"] = item_filter.pop("product_names")
item_filter["families"] = item_filter.pop("product_types")
item["reformat_node_config"] = _convert_nuke_knobs(
item["reformat_node_config"])
for node in item["reformat_nodes_config"]["reposition_nodes"]:
node["knobs"] = _convert_nuke_knobs(node["knobs"])
name = item.pop("name")
new_review_data_outputs[name] = item
ayon_publish["ExtractReviewDataMov"]["outputs"] = new_review_data_outputs
@ -990,8 +975,11 @@ def _convert_royalrender_project_settings(ayon_settings, output):
if "royalrender" not in ayon_settings:
return
ayon_royalrender = ayon_settings["royalrender"]
rr_paths = ayon_royalrender.get("selected_rr_paths", [])
output["royalrender"] = {
"publish": ayon_royalrender["publish"]
"publish": ayon_royalrender["publish"],
"rr_paths": rr_paths,
}

View file

@ -6,6 +6,7 @@ from .version import __version__
class AfterEffects(BaseServerAddon):
name = "aftereffects"
title = "AfterEffects"
version = __version__
settings_model = AfterEffectsSettings

View file

@ -5,8 +5,10 @@ from ayon_server.settings import BaseSettingsModel
class CreateRenderPlugin(BaseSettingsModel):
mark_for_review: bool = Field(True, title="Review")
defaults: list[str] = Field(default_factory=list,
title="Default Variants")
defaults: list[str] = Field(
default_factory=list,
title="Default Variants"
)
class AfterEffectsCreatorPlugins(BaseSettingsModel):

View file

@ -3,8 +3,12 @@ from ayon_server.settings import BaseSettingsModel
from .imageio import AfterEffectsImageIOModel
from .creator_plugins import AfterEffectsCreatorPlugins
from .publish_plugins import AfterEffectsPublishPlugins
from .publish_plugins import (
AfterEffectsPublishPlugins,
AE_PUBLISH_PLUGINS_DEFAULTS,
)
from .workfile_builder import WorkfileBuilderPlugin
from .templated_workfile_build import TemplatedWorkfileBuildModel
class AfterEffectsSettings(BaseSettingsModel):
@ -18,16 +22,18 @@ class AfterEffectsSettings(BaseSettingsModel):
default_factory=AfterEffectsCreatorPlugins,
title="Creator plugins"
)
publish: AfterEffectsPublishPlugins = Field(
default_factory=AfterEffectsPublishPlugins,
title="Publish plugins"
)
workfile_builder: WorkfileBuilderPlugin = Field(
default_factory=WorkfileBuilderPlugin,
title="Workfile Builder"
)
templated_workfile_build: TemplatedWorkfileBuildModel = Field(
default_factory=TemplatedWorkfileBuildModel,
title="Templated Workfile Build Settings"
)
DEFAULT_AFTEREFFECTS_SETTING = {
@ -39,24 +45,12 @@ DEFAULT_AFTEREFFECTS_SETTING = {
]
}
},
"publish": {
"CollectReview": {
"enabled": True
},
"ValidateSceneSettings": {
"enabled": True,
"optional": True,
"active": True,
"skip_resolution_check": [
".*"
],
"skip_timelines_check": [
".*"
]
}
},
"publish": AE_PUBLISH_PLUGINS_DEFAULTS,
"workfile_builder": {
"create_first_version": False,
"custom_templates": []
}
},
"templated_workfile_build": {
"profiles": []
},
}

View file

@ -7,30 +7,62 @@ class CollectReviewPluginModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
class ValidateSceneSettingsPlugin(BaseSettingsModel):
"""Validate naming of products and layers""" #
_isGroup = True
enabled: bool = True
class ValidateSceneSettingsModel(BaseSettingsModel):
"""Validate naming of products and layers"""
# _isGroup = True
enabled: bool = Field(True, title="Enabled")
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
skip_resolution_check: list[str] = Field(
default_factory=list,
title="Skip Resolution Check for Tasks"
title="Skip Resolution Check for Tasks",
)
skip_timelines_check: list[str] = Field(
default_factory=list,
title="Skip Timeline Check for Tasks"
title="Skip Timeline Check for Tasks",
)
class ValidateContainersModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
optional: bool = Field(True, title="Optional")
active: bool = Field(True, title="Active")
class AfterEffectsPublishPlugins(BaseSettingsModel):
CollectReview: CollectReviewPluginModel = Field(
default_facotory=CollectReviewPluginModel,
title="Collect Review"
default_factory=CollectReviewPluginModel,
title="Collect Review",
)
ValidateSceneSettings: ValidateSceneSettingsPlugin = Field(
ValidateSceneSettings: ValidateSceneSettingsModel = Field(
default_factory=ValidateSceneSettingsModel,
title="Validate Scene Settings",
default_factory=ValidateSceneSettingsPlugin,
)
ValidateContainers: ValidateContainersModel = Field(
default_factory=ValidateContainersModel,
title="Validate Containers",
)
AE_PUBLISH_PLUGINS_DEFAULTS = {
"CollectReview": {
"enabled": True
},
"ValidateSceneSettings": {
"enabled": True,
"optional": True,
"active": True,
"skip_resolution_check": [
".*"
],
"skip_timelines_check": [
".*"
]
},
"ValidateContainers": {
"enabled": True,
"optional": True,
"active": True,
}
}

View file

@ -0,0 +1,33 @@
from pydantic import Field
from ayon_server.settings import (
BaseSettingsModel,
task_types_enum,
)
class TemplatedWorkfileProfileModel(BaseSettingsModel):
task_types: list[str] = Field(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(
default_factory=list,
title="Task names"
)
path: str = Field(
title="Path to template"
)
keep_placeholder: bool = Field(
False,
title="Keep placeholders")
create_first_version: bool = Field(
True,
title="Create first version"
)
class TemplatedWorkfileBuildModel(BaseSettingsModel):
profiles: list[TemplatedWorkfileProfileModel] = Field(
default_factory=list
)

View file

@ -21,5 +21,5 @@ class WorkfileBuilderPlugin(BaseSettingsModel):
)
custom_templates: list[CustomBuilderTemplate] = Field(
default_factory=CustomBuilderTemplate
default_factory=list
)

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring addon version."""
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -32,6 +32,7 @@ def get_enum_items_from_groups(groups):
class ApplicationsAddon(BaseServerAddon):
name = "applications"
title = "Applications"
version = __version__
settings_model = ApplicationsAddonSettings

View file

@ -25,6 +25,14 @@ class BlenderSettings(BaseSettingsModel):
default_factory=UnitScaleSettingsModel,
title="Set Unit Scale"
)
set_resolution_startup: bool = Field(
True,
title="Set Resolution on Startup"
)
set_frames_startup: bool = Field(
True,
title="Set Start/End Frames and FPS on Startup"
)
imageio: BlenderImageIOModel = Field(
default_factory=BlenderImageIOModel,
title="Color Management (ImageIO)"
@ -45,6 +53,8 @@ DEFAULT_VALUES = {
"apply_on_opening": False,
"base_file_unit_scale": 0.01
},
"set_frames_startup": True,
"set_resolution_startup": True,
"publish": DEFAULT_BLENDER_PUBLISH_SETTINGS,
"workfile_builder": {
"create_first_version": False,

View file

@ -94,6 +94,10 @@ class PublishPuginsModel(BaseSettingsModel):
default_factory=ValidatePluginModel,
title="Extract Camera"
)
ExtractCameraABC: ValidatePluginModel = Field(
default_factory=ValidatePluginModel,
title="Extract Camera as ABC"
)
ExtractLayout: ValidatePluginModel = Field(
default_factory=ValidatePluginModel,
title="Extract Layout"
@ -143,7 +147,8 @@ DEFAULT_BLENDER_PUBLISH_SETTINGS = {
"camera",
"rig",
"action",
"layout"
"layout",
"blendScene"
]
},
"ExtractFBX": {
@ -171,6 +176,11 @@ DEFAULT_BLENDER_PUBLISH_SETTINGS = {
"optional": True,
"active": True
},
"ExtractCameraABC": {
"enabled": True,
"optional": True,
"active": True
},
"ExtractLayout": {
"enabled": True,
"optional": True,

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -5,5 +5,6 @@ from ayon_server.settings import BaseSettingsModel
class ClockifySettings(BaseSettingsModel):
workspace_name: str = Field(
"",
title="Workspace name"
title="Workspace name",
scope=["studio"]
)

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -6,6 +6,7 @@ from .settings import CoreSettings, DEFAULT_VALUES
class CoreAddon(BaseServerAddon):
name = "core"
title = "Core"
version = __version__
settings_model = CoreSettings

View file

@ -49,8 +49,8 @@ class CoreImageIOBaseModel(BaseSettingsModel):
class CoreSettings(BaseSettingsModel):
studio_name: str = Field("", title="Studio name")
studio_code: str = Field("", title="Studio code")
studio_name: str = Field("", title="Studio name", scope=["studio"])
studio_code: str = Field("", title="Studio code", scope=["studio"])
environments: str = Field(
"{}",
title="Global environment variables",

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -7,10 +7,10 @@ import zipfile
import platform
import collections
from pathlib import Path
from typing import Any, Optional, Iterable
from typing import Any, Optional, Iterable, Pattern, List, Tuple
# Patterns of directories to be skipped for server part of addon
IGNORE_DIR_PATTERNS: list[re.Pattern] = [
IGNORE_DIR_PATTERNS: List[Pattern] = [
re.compile(pattern)
for pattern in {
# Skip directories starting with '.'
@ -21,7 +21,7 @@ IGNORE_DIR_PATTERNS: list[re.Pattern] = [
]
# Patterns of files to be skipped for server part of addon
IGNORE_FILE_PATTERNS: list[re.Pattern] = [
IGNORE_FILE_PATTERNS: List[Pattern] = [
re.compile(pattern)
for pattern in {
# Skip files starting with '.'
@ -56,7 +56,7 @@ class ZipFileLongPaths(zipfile.ZipFile):
)
def _value_match_regexes(value: str, regexes: Iterable[re.Pattern]) -> bool:
def _value_match_regexes(value: str, regexes: Iterable[Pattern]) -> bool:
return any(
regex.search(value)
for regex in regexes
@ -65,8 +65,9 @@ def _value_match_regexes(value: str, regexes: Iterable[re.Pattern]) -> bool:
def find_files_in_subdir(
src_path: str,
ignore_file_patterns: Optional[list[re.Pattern]] = None,
ignore_dir_patterns: Optional[list[re.Pattern]] = None
ignore_file_patterns: Optional[List[Pattern]] = None,
ignore_dir_patterns: Optional[List[Pattern]] = None,
ignore_subdirs: Optional[Iterable[Tuple[str]]] = None
):
"""Find all files to copy in subdirectories of given path.
@ -76,13 +77,15 @@ def find_files_in_subdir(
Args:
src_path (str): Path to directory to search in.
ignore_file_patterns (Optional[list[re.Pattern]]): List of regexes
ignore_file_patterns (Optional[List[Pattern]]): List of regexes
to match files to ignore.
ignore_dir_patterns (Optional[list[re.Pattern]]): List of regexes
ignore_dir_patterns (Optional[List[Pattern]]): List of regexes
to match directories to ignore.
ignore_subdirs (Optional[Iterable[Tuple[str]]]): List of
subdirectories to ignore.
Returns:
list[tuple[str, str]]: List of tuples with path to file and parent
List[Tuple[str, str]]: List of tuples with path to file and parent
directories relative to 'src_path'.
"""
@ -98,6 +101,8 @@ def find_files_in_subdir(
while hierarchy_queue:
item: tuple[str, str] = hierarchy_queue.popleft()
dirpath, parents = item
if ignore_subdirs and parents in ignore_subdirs:
continue
for name in os.listdir(dirpath):
path = os.path.join(dirpath, name)
if os.path.isfile(path):
@ -133,7 +138,7 @@ def create_addon_zip(
addon_version: str,
keep_source: bool
):
zip_filepath = output_dir / f"{addon_name}.zip"
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(
@ -194,11 +199,35 @@ def create_openpype_package(
(private_dir / pyproject_path.name)
)
ignored_hosts = []
ignored_modules = [
"ftrack",
"shotgrid",
"sync_server",
"example_addons",
"slack"
]
# Subdirs that won't be added to output zip file
ignored_subpaths = [
["addons"],
["vendor", "common", "ayon_api"],
]
ignored_subpaths.extend(
["hosts", host_name]
for host_name in ignored_hosts
)
ignored_subpaths.extend(
["modules", module_name]
for module_name in ignored_modules
)
# Zip client
zip_filepath = private_dir / "client.zip"
with ZipFileLongPaths(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zipf:
# Add client code content to zip
for path, sub_path in find_files_in_subdir(str(openpype_dir)):
for path, sub_path in find_files_in_subdir(
str(openpype_dir), ignore_subdirs=ignored_subpaths
):
zipf.write(path, f"{openpype_dir.name}/{sub_path}")
if create_zip:

View file

@ -18,12 +18,12 @@ class DeadlineSettings(BaseSettingsModel):
deadline_urls: list[ServerListSubmodel] = Field(
default_factory=list,
title="System Deadline Webservice URLs",
scope=["studio"],
)
deadline_servers: list[str] = Field(
title="Project deadline servers",
section="---")
section="---",
)
publish: PublishPluginsModel = Field(
default_factory=PublishPluginsModel,
title="Publish Plugins",

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -6,6 +6,7 @@ from .version import __version__
class Harmony(BaseServerAddon):
name = "harmony"
title = "Harmony"
version = __version__
settings_model = HarmonySettings

View file

@ -1,20 +0,0 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
class ImageSequenceLoaderModel(BaseSettingsModel):
family: list[str] = Field(
default_factory=list,
title="Families"
)
representations: list[str] = Field(
default_factory=list,
title="Representations"
)
class HarmonyLoadModel(BaseSettingsModel):
ImageSequenceLoader: ImageSequenceLoaderModel = Field(
default_factory=ImageSequenceLoaderModel,
title="Load Image Sequence"
)

View file

@ -2,7 +2,6 @@ from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from .imageio import HarmonyImageIOModel
from .load import HarmonyLoadModel
from .publish_plugins import HarmonyPublishPlugins
@ -13,10 +12,6 @@ class HarmonySettings(BaseSettingsModel):
default_factory=HarmonyImageIOModel,
title="OCIO config"
)
load: HarmonyLoadModel = Field(
default_factory=HarmonyLoadModel,
title="Loader plugins"
)
publish: HarmonyPublishPlugins = Field(
default_factory=HarmonyPublishPlugins,
title="Publish plugins"

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring addon version."""
__version__ = "0.1.1"
__version__ = "0.1.2"

View file

@ -76,15 +76,16 @@ class PublishPlugins(BaseSettingsModel):
class KitsuSettings(BaseSettingsModel):
server: str = Field(
"",
title="Kitsu Server"
title="Kitsu Server",
scope=["studio"],
)
entities_naming_pattern: EntityPattern = Field(
default_factory=EntityPattern,
title="Entities naming pattern"
title="Entities naming pattern",
)
publish: PublishPlugins = Field(
default_factory=PublishPlugins,
title="Publish plugins"
title="Publish plugins",
)

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -55,7 +55,6 @@ class BasicExportMeshModel(BaseSettingsModel):
class CreateAnimationModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
include_parent_hierarchy: bool = Field(
@ -259,7 +258,6 @@ DEFAULT_CREATORS_SETTINGS = {
"publish_mip_map": True
},
"CreateAnimation": {
"enabled": False,
"write_color_sets": False,
"write_face_sets": False,
"include_parent_hierarchy": False,

View file

@ -60,7 +60,9 @@ class MayaSettings(BaseSettingsModel):
title="Include/Exclude Handles in default playback & render range"
)
scriptsmenu: ScriptsmenuModel = Field(
default_factory=ScriptsmenuModel, title="Scriptsmenu Settings")
default_factory=ScriptsmenuModel,
title="Scriptsmenu Settings"
)
render_settings: RenderSettingsModel = Field(
default_factory=RenderSettingsModel, title="Render Settings")
create: CreatorsModel = Field(

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring addon version."""
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -10,7 +10,11 @@ class TemplatesMapping(BaseSettingsModel):
class MusterSettings(BaseSettingsModel):
enabled: bool = True
MUSTER_REST_URL: str = Field("", title="Muster Rest URL")
MUSTER_REST_URL: str = Field(
"",
title="Muster Rest URL",
scope=["studio"],
)
templates_mapping: list[TemplatesMapping] = Field(
default_factory=list,

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -165,10 +165,6 @@ class BakingStreamModel(BaseSettingsModel):
viewer_process_override: str = Field(title="Viewer process override")
bake_viewer_process: bool = Field(title="Bake view process")
bake_viewer_input_process: bool = Field(title="Bake viewer input process")
reformat_node_add: bool = Field(title="Add reformat node")
reformat_node_config: list[KnobModel] = Field(
default_factory=list,
title="Reformat node properties")
reformat_nodes_config: ReformatNodesConfigModel = Field(
default_factory=ReformatNodesConfigModel,
title="Reformat Nodes")
@ -443,34 +439,6 @@ DEFAULT_PUBLISH_PLUGIN_SETTINGS = {
"viewer_process_override": "",
"bake_viewer_process": True,
"bake_viewer_input_process": True,
"reformat_node_add": False,
"reformat_node_config": [
{
"type": "text",
"name": "type",
"text": "to format"
},
{
"type": "text",
"name": "format",
"text": "HD_1080"
},
{
"type": "text",
"name": "filter",
"text": "Lanczos6"
},
{
"type": "boolean",
"name": "black_outside",
"boolean": True
},
{
"type": "boolean",
"name": "pbb",
"boolean": False
}
],
"reformat_nodes_config": {
"enabled": False,
"reposition_nodes": [

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -6,6 +6,7 @@ from .version import __version__
class Photoshop(BaseServerAddon):
name = "photoshop"
title = "Photoshop"
version = __version__
settings_model = PhotoshopSettings

View file

@ -2,11 +2,15 @@ from pydantic import Field
from ayon_server.settings import BaseSettingsModel, MultiplatformPathModel
class CustomPath(MultiplatformPathModel):
_layout = "expanded"
class ServerListSubmodel(BaseSettingsModel):
_layout = "compact"
_layout = "expanded"
name: str = Field("", title="Name")
value: MultiplatformPathModel = Field(
default_factory=MultiplatformPathModel
value: CustomPath = Field(
default_factory=CustomPath
)
@ -23,13 +27,25 @@ class PublishPluginsModel(BaseSettingsModel):
class RoyalRenderSettings(BaseSettingsModel):
enabled: bool = True
# WARNING/TODO this needs change
# - both system and project settings contained 'rr_path'
# where project settings did choose one of rr_path from system settings
# that is not possible in AYON
rr_paths: list[ServerListSubmodel] = Field(
default_factory=list,
title="Royal Render Root Paths",
scope=["studio"],
)
# This was 'rr_paths' in project settings and should be enum of
# 'rr_paths' from system settings, but that's not possible in AYON
selected_rr_paths: list[str] = Field(
default_factory=list,
title="Selected Royal Render Paths",
section="---",
)
publish: PublishPluginsModel = Field(
default_factory=PublishPluginsModel,
title="Publish plugins"
title="Publish plugins",
)
@ -45,6 +61,7 @@ DEFAULT_VALUES = {
}
}
],
"selected_rr_paths": ["default"],
"publish": {
"CollectSequencesFromJob": {
"review": True

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -3,7 +3,23 @@ from ayon_server.settings import BaseSettingsModel
class TimersManagerSettings(BaseSettingsModel):
auto_stop: bool = Field(True, title="Auto stop timer")
full_time: int = Field(15, title="Max idle time")
message_time: float = Field(0.5, title="When dialog will show")
disregard_publishing: bool = Field(False, title="Disregard publishing")
auto_stop: bool = Field(
True,
title="Auto stop timer",
scope=["studio"],
)
full_time: int = Field(
15,
title="Max idle time",
scope=["studio"],
)
message_time: float = Field(
0.5,
title="When dialog will show",
scope=["studio"],
)
disregard_publishing: bool = Field(
False,
title="Disregard publishing",
scope=["studio"],
)

View file

@ -1 +1 @@
__version__ = "0.1.0"
__version__ = "0.1.1"

View file

@ -6,6 +6,7 @@ from .settings import TraypublisherSettings, DEFAULT_TRAYPUBLISHER_SETTING
class Traypublisher(BaseServerAddon):
name = "traypublisher"
title = "TrayPublisher"
version = __version__
settings_model = TraypublisherSettings

View file

@ -17,6 +17,10 @@ class ValidateFrameRangeModel(ValidatePluginModel):
class TrayPublisherPublishPlugins(BaseSettingsModel):
CollectFrameDataFromAssetEntity: ValidatePluginModel = Field(
default_factory=ValidatePluginModel,
title="Collect Frame Data From Folder Entity",
)
ValidateFrameRange: ValidateFrameRangeModel = Field(
title="Validate Frame Range",
default_factory=ValidateFrameRangeModel,
@ -28,6 +32,11 @@ class TrayPublisherPublishPlugins(BaseSettingsModel):
DEFAULT_PUBLISH_PLUGINS = {
"CollectFrameDataFromAssetEntity": {
"enabled": True,
"optional": True,
"active": True
},
"ValidateFrameRange": {
"enabled": True,
"optional": True,

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring addon version."""
__version__ = "0.1.1"
__version__ = "0.1.2"