mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
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:
parent
6deace97d6
commit
b43cac0b51
41 changed files with 341 additions and 246 deletions
|
|
@ -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,
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from .version import __version__
|
|||
|
||||
class AfterEffects(BaseServerAddon):
|
||||
name = "aftereffects"
|
||||
title = "AfterEffects"
|
||||
version = __version__
|
||||
|
||||
settings_model = AfterEffectsSettings
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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": []
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
@ -21,5 +21,5 @@ class WorkfileBuilderPlugin(BaseSettingsModel):
|
|||
)
|
||||
|
||||
custom_templates: list[CustomBuilderTemplate] = Field(
|
||||
default_factory=CustomBuilderTemplate
|
||||
default_factory=list
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""Package declaring addon version."""
|
||||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ def get_enum_items_from_groups(groups):
|
|||
|
||||
class ApplicationsAddon(BaseServerAddon):
|
||||
name = "applications"
|
||||
title = "Applications"
|
||||
version = __version__
|
||||
settings_model = ApplicationsAddonSettings
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from .settings import CoreSettings, DEFAULT_VALUES
|
|||
|
||||
class CoreAddon(BaseServerAddon):
|
||||
name = "core"
|
||||
title = "Core"
|
||||
version = __version__
|
||||
settings_model = CoreSettings
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from .version import __version__
|
|||
|
||||
class Harmony(BaseServerAddon):
|
||||
name = "harmony"
|
||||
title = "Harmony"
|
||||
version = __version__
|
||||
|
||||
settings_model = HarmonySettings
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
)
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""Package declaring addon version."""
|
||||
__version__ = "0.1.1"
|
||||
__version__ = "0.1.2"
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""Package declaring addon version."""
|
||||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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": [
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from .version import __version__
|
|||
|
||||
class Photoshop(BaseServerAddon):
|
||||
name = "photoshop"
|
||||
title = "Photoshop"
|
||||
version = __version__
|
||||
|
||||
settings_model = PhotoshopSettings
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -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"],
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = "0.1.0"
|
||||
__version__ = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ from .settings import TraypublisherSettings, DEFAULT_TRAYPUBLISHER_SETTING
|
|||
|
||||
class Traypublisher(BaseServerAddon):
|
||||
name = "traypublisher"
|
||||
title = "TrayPublisher"
|
||||
version = __version__
|
||||
|
||||
settings_model = TraypublisherSettings
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
"""Package declaring addon version."""
|
||||
__version__ = "0.1.1"
|
||||
__version__ = "0.1.2"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue