[Automated] Merged develop into main

This commit is contained in:
ynbot 2024-01-27 04:23:36 +01:00 committed by GitHub
commit 29a3e4cd0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
135 changed files with 2396 additions and 3560 deletions

View file

@ -35,6 +35,7 @@ body:
label: Version
description: What version are you running? Look to OpenPype Tray
options:
- 3.18.5
- 3.18.5-nightly.3
- 3.18.5-nightly.2
- 3.18.5-nightly.1
@ -134,7 +135,6 @@ body:
- 3.15.8-nightly.3
- 3.15.8-nightly.2
- 3.15.8-nightly.1
- 3.15.7
validations:
required: true
- type: dropdown

View file

@ -220,6 +220,8 @@ class BlendLoader(plugin.AssetLoader):
# Restore the actions
for obj in asset_group.children_recursive:
if obj.name in actions:
if not obj.animation_data:
obj.animation_data_create()
obj.animation_data.action = actions[obj.name]
# Restore the old data, but reset memebers, as they don't exist anymore

View file

@ -8,55 +8,6 @@ from openpype.hosts.fusion.api.action import SelectInvalidAction
from openpype.hosts.fusion.api import comp_lock_and_undo_chunk
def get_tool_resolution(tool, frame):
"""Return the 2D input resolution to a Fusion tool
If the current tool hasn't been rendered its input resolution
hasn't been saved. To combat this, add an expression in
the comments field to read the resolution
Args
tool (Fusion Tool): The tool to query input resolution
frame (int): The frame to query the resolution on.
Returns:
tuple: width, height as 2-tuple of integers
"""
comp = tool.Composition
# False undo removes the undo-stack from the undo list
with comp_lock_and_undo_chunk(comp, "Read resolution", False):
# Save old comment
old_comment = ""
has_expression = False
if tool["Comments"][frame] != "":
if tool["Comments"].GetExpression() is not None:
has_expression = True
old_comment = tool["Comments"].GetExpression()
tool["Comments"].SetExpression(None)
else:
old_comment = tool["Comments"][frame]
tool["Comments"][frame] = ""
# Get input width
tool["Comments"].SetExpression("self.Input.OriginalWidth")
width = int(tool["Comments"][frame])
# Get input height
tool["Comments"].SetExpression("self.Input.OriginalHeight")
height = int(tool["Comments"][frame])
# Reset old comment
tool["Comments"].SetExpression(None)
if has_expression:
tool["Comments"].SetExpression(old_comment)
else:
tool["Comments"][frame] = old_comment
return width, height
class ValidateSaverResolution(
pyblish.api.InstancePlugin, OptionalPyblishPluginMixin
):
@ -87,19 +38,79 @@ class ValidateSaverResolution(
@classmethod
def get_invalid(cls, instance):
resolution = cls.get_resolution(instance)
saver = instance.data["tool"]
try:
resolution = cls.get_resolution(instance)
except PublishValidationError:
resolution = None
expected_resolution = cls.get_expected_resolution(instance)
if resolution != expected_resolution:
saver = instance.data["tool"]
return [saver]
@classmethod
def get_resolution(cls, instance):
saver = instance.data["tool"]
first_frame = instance.data["frameStartHandle"]
return get_tool_resolution(saver, frame=first_frame)
return cls.get_tool_resolution(saver, frame=first_frame)
@classmethod
def get_expected_resolution(cls, instance):
data = instance.data["assetEntity"]["data"]
return data["resolutionWidth"], data["resolutionHeight"]
@classmethod
def get_tool_resolution(cls, tool, frame):
"""Return the 2D input resolution to a Fusion tool
If the current tool hasn't been rendered its input resolution
hasn't been saved. To combat this, add an expression in
the comments field to read the resolution
Args
tool (Fusion Tool): The tool to query input resolution
frame (int): The frame to query the resolution on.
Returns:
tuple: width, height as 2-tuple of integers
"""
comp = tool.Composition
# False undo removes the undo-stack from the undo list
with comp_lock_and_undo_chunk(comp, "Read resolution", False):
# Save old comment
old_comment = ""
has_expression = False
if tool["Comments"][frame] not in ["", None]:
if tool["Comments"].GetExpression() is not None:
has_expression = True
old_comment = tool["Comments"].GetExpression()
tool["Comments"].SetExpression(None)
else:
old_comment = tool["Comments"][frame]
tool["Comments"][frame] = ""
# Get input width
tool["Comments"].SetExpression("self.Input.OriginalWidth")
if tool["Comments"][frame] is None:
raise PublishValidationError(
"Cannot get resolution info for frame '{}'.\n\n "
"Please check that saver has connected input.".format(
frame
)
)
width = int(tool["Comments"][frame])
# Get input height
tool["Comments"].SetExpression("self.Input.OriginalHeight")
height = int(tool["Comments"][frame])
# Reset old comment
tool["Comments"].SetExpression(None)
if has_expression:
tool["Comments"].SetExpression(old_comment)
else:
tool["Comments"][frame] = old_comment
return width, height

View file

@ -6,13 +6,13 @@ def requests_post(*args, **kwargs):
"""Wrap request post method.
Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment
variable is found. This is useful when Deadline or Muster server are
running with self-signed certificates and their certificate is not
variable is found. This is useful when Deadline server is
running with self-signed certificates and its certificate is not
added to trusted certificates on client machines.
Warning:
Disabling SSL certificate validation is defeating one line
of defense SSL is providing and it is not recommended.
of defense SSL is providing, and it is not recommended.
"""
if "verify" not in kwargs:
@ -24,13 +24,13 @@ def requests_get(*args, **kwargs):
"""Wrap request get method.
Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment
variable is found. This is useful when Deadline or Muster server are
running with self-signed certificates and their certificate is not
variable is found. This is useful when Deadline server is
running with self-signed certificates and its certificate is not
added to trusted certificates on client machines.
Warning:
Disabling SSL certificate validation is defeating one line
of defense SSL is providing and it is not recommended.
of defense SSL is providing, and it is not recommended.
"""
if "verify" not in kwargs:

View file

@ -1333,7 +1333,6 @@ class TrayModulesManager(ModulesManager):
"user",
"ftrack",
"kitsu",
"muster",
"launcher_tool",
"avalon",
"clockify",

View file

@ -34,8 +34,8 @@ def requests_post(*args, **kwargs):
"""Wrap request post method.
Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment
variable is found. This is useful when Deadline or Muster server are
running with self-signed certificates and their certificate is not
variable is found. This is useful when Deadline server is
running with self-signed certificates and its certificate is not
added to trusted certificates on client machines.
Warning:
@ -55,8 +55,8 @@ def requests_get(*args, **kwargs):
"""Wrap request get method.
Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment
variable is found. This is useful when Deadline or Muster server are
running with self-signed certificates and their certificate is not
variable is found. This is useful when Deadline server is
running with self-signed certificates and its certificate is not
added to trusted certificates on client machines.
Warning:

View file

@ -99,10 +99,6 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin,
def _submit_deadline_post_job(self, instance, job):
"""Submit publish job to Deadline.
Deadline specific code separated from :meth:`process` for sake of
more universal code. Muster post job is sent directly by Muster
submitter, so this type of code isn't necessary for it.
Returns:
(str): deadline_publish_job_id
"""

View file

@ -59,21 +59,15 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
publish.ColormanagedPyblishPluginMixin):
"""Process Job submitted on farm.
These jobs are dependent on a deadline or muster job
These jobs are dependent on a deadline job
submission prior to this plug-in.
- In case of Deadline, it creates dependent job on farm publishing
rendered image sequence.
- In case of Muster, there is no need for such thing as dependent job,
post action will be executed and rendered sequence will be published.
It creates dependent job on farm publishing rendered image sequence.
Options in instance.data:
- deadlineSubmissionJob (dict, Required): The returned .json
data from the job submission to deadline.
- musterSubmissionJob (dict, Required): same as deadline.
- outputDir (str, Required): The output directory where the metadata
file should be generated. It's assumed that this will also be
final folder containing the output files.
@ -161,10 +155,6 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
def _submit_deadline_post_job(self, instance, job, instances):
"""Submit publish job to Deadline.
Deadline specific code separated from :meth:`process` for sake of
more universal code. Muster post job is sent directly by Muster
submitter, so this type of code isn't necessary for it.
Returns:
(str): deadline_publish_job_id
"""
@ -586,9 +576,8 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin,
render_job = instance.data.pop("deadlineSubmissionJob", None)
if not render_job and instance.data.get("tileRendering") is False:
raise AssertionError(("Cannot continue without valid Deadline "
"or Muster submission."))
raise AssertionError(("Cannot continue without valid "
"Deadline submission."))
if not render_job:
import getpass

View file

@ -1,6 +0,0 @@
from .muster import MusterModule
__all__ = (
"MusterModule",
)

View file

@ -1,147 +0,0 @@
import os
import json
import appdirs
import requests
from openpype.modules import OpenPypeModule, ITrayModule
class MusterModule(OpenPypeModule, ITrayModule):
"""
Module handling Muster Render credentials. This will display dialog
asking for user credentials for Muster if not already specified.
"""
cred_folder_path = os.path.normpath(
appdirs.user_data_dir('pype-app', 'pype')
)
cred_filename = 'muster_cred.json'
name = "muster"
def initialize(self, modules_settings):
muster_settings = modules_settings[self.name]
self.enabled = muster_settings["enabled"]
self.muster_url = muster_settings["MUSTER_REST_URL"]
self.cred_path = os.path.join(
self.cred_folder_path, self.cred_filename
)
# Tray attributes
self.widget_login = None
self.action_show_login = None
self.rest_api_obj = None
def get_global_environments(self):
return {
"MUSTER_REST_URL": self.muster_url
}
def tray_init(self):
from .widget_login import MusterLogin
self.widget_login = MusterLogin(self)
def tray_start(self):
"""Show login dialog if credentials not found."""
# This should be start of module in tray
cred = self.load_credentials()
if not cred:
self.show_login()
def tray_exit(self):
"""Nothing special for Muster."""
return
# Definition of Tray menu
def tray_menu(self, parent):
"""Add **change credentials** option to tray menu."""
from qtpy import QtWidgets
# Menu for Tray App
menu = QtWidgets.QMenu('Muster', parent)
menu.setProperty('submenu', 'on')
# Actions
self.action_show_login = QtWidgets.QAction(
"Change login", menu
)
menu.addAction(self.action_show_login)
self.action_show_login.triggered.connect(self.show_login)
parent.addMenu(menu)
def load_credentials(self):
"""
Get credentials from JSON file
"""
credentials = {}
try:
file = open(self.cred_path, 'r')
credentials = json.load(file)
except Exception:
file = open(self.cred_path, 'w+')
file.close()
return credentials
def get_auth_token(self, username, password):
"""
Authenticate user with Muster and get authToken from server.
"""
if not self.muster_url:
raise AttributeError("Muster REST API url not set")
params = {
'username': username,
'password': password
}
api_entry = '/api/login'
response = self._requests_post(
self.muster_url + api_entry, params=params)
if response.status_code != 200:
self.log.error(
'Cannot log into Muster: {}'.format(response.status_code))
raise Exception('Cannot login into Muster.')
try:
token = response.json()['ResponseData']['authToken']
except ValueError as e:
self.log.error('Invalid response from Muster server {}'.format(e))
raise Exception('Invalid response from Muster while logging in.')
self.save_credentials(token)
def save_credentials(self, token):
"""Save credentials to JSON file."""
with open(self.cred_path, "w") as f:
json.dump({'token': token}, f)
def show_login(self):
"""
Show dialog to enter credentials
"""
if self.widget_login:
self.widget_login.show()
# Webserver module implementation
def webserver_initialization(self, server_manager):
"""Add routes for Muster login."""
if self.tray_initialized:
from .rest_api import MusterModuleRestApi
self.rest_api_obj = MusterModuleRestApi(self, server_manager)
def _requests_post(self, *args, **kwargs):
""" Wrapper for requests, disabling SSL certificate validation if
DONT_VERIFY_SSL environment variable is found. This is useful when
Deadline or Muster server are running with self-signed certificates
and their certificate is not added to trusted certificates on
client machines.
WARNING: disabling SSL certificate validation is defeating one line
of defense SSL is providing and it is not recommended.
"""
if 'verify' not in kwargs:
kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", True) else True # noqa
return requests.post(*args, **kwargs)

View file

@ -1,555 +0,0 @@
import os
import json
import getpass
import platform
import appdirs
from maya import cmds
import pyblish.api
from openpype.lib import requests_post
from openpype.hosts.maya.api import lib
from openpype.hosts.maya.api.lib_rendersettings import RenderSettings
from openpype.pipeline import legacy_io
from openpype.settings import get_system_settings
# mapping between Maya renderer names and Muster template ids
def _get_template_id(renderer):
"""
Return muster template ID based on renderer name.
:param renderer: renderer name
:type renderer: str
:returns: muster template id
:rtype: int
"""
# TODO: Use settings from context?
templates = get_system_settings()["modules"]["muster"]["templates_mapping"]
if not templates:
raise RuntimeError(("Muster template mapping missing in "
"pype-settings"))
try:
template_id = templates[renderer]
except KeyError:
raise RuntimeError("Unmapped renderer - missing template id")
return template_id
def _get_script():
"""Get path to the image sequence script"""
try:
from openpype.scripts import publish_filesequence
except Exception:
raise RuntimeError("Expected module 'publish_deadline'"
"to be available")
module_path = publish_filesequence.__file__
if module_path.endswith(".pyc"):
module_path = module_path[:-len(".pyc")] + ".py"
return module_path
def get_renderer_variables(renderlayer=None):
"""Retrieve the extension which has been set in the VRay settings
Will return None if the current renderer is not VRay
For Maya 2016.5 and up the renderSetup creates renderSetupLayer node which
start with `rs`. Use the actual node name, do NOT use the `nice name`
Args:
renderlayer (str): the node name of the renderlayer.
Returns:
dict
"""
renderer = lib.get_renderer(renderlayer or lib.get_current_renderlayer())
padding = cmds.getAttr(RenderSettings.get_padding_attr(renderer))
filename_0 = cmds.renderSettings(fullPath=True, firstImageName=True)[0]
if renderer == "vray":
# Maya's renderSettings function does not return V-Ray file extension
# so we get the extension from vraySettings
extension = cmds.getAttr("vraySettings.imageFormatStr")
# When V-Ray image format has not been switched once from default .png
# the getAttr command above returns None. As such we explicitly set
# it to `.png`
if extension is None:
extension = "png"
filename_prefix = "<Scene>/<Scene>_<Layer>/<Layer>"
else:
# Get the extension, getAttr defaultRenderGlobals.imageFormat
# returns an index number.
filename_base = os.path.basename(filename_0)
extension = os.path.splitext(filename_base)[-1].strip(".")
filename_prefix = "<Scene>/<RenderLayer>/<RenderLayer>"
return {"ext": extension,
"filename_prefix": filename_prefix,
"padding": padding,
"filename_0": filename_0}
def preview_fname(folder, scene, layer, padding, ext):
"""Return output file path with #### for padding.
Deadline requires the path to be formatted with # in place of numbers.
For example `/path/to/render.####.png`
Args:
folder (str): The root output folder (image path)
scene (str): The scene name
layer (str): The layer name to be rendered
padding (int): The padding length
ext(str): The output file extension
Returns:
str
"""
# Following hardcoded "<Scene>/<Scene>_<Layer>/<Layer>"
output = "{scene}/{layer}/{layer}.{number}.{ext}".format(
scene=scene,
layer=layer,
number="#" * padding,
ext=ext
)
return os.path.join(folder, output)
class MayaSubmitMuster(pyblish.api.InstancePlugin):
"""Submit available render layers to Muster
Renders are submitted to a Muster via HTTP API as
supplied via the environment variable ``MUSTER_REST_URL``.
Also needed is ``MUSTER_USER`` and ``MUSTER_PASSWORD``.
"""
label = "Submit to Muster"
order = pyblish.api.IntegratorOrder + 0.1
hosts = ["maya"]
families = ["renderlayer"]
icon = "satellite-dish"
if not os.environ.get("MUSTER_REST_URL"):
optional = False
active = False
else:
optional = True
_token = None
def _load_credentials(self):
"""
Load Muster credentials from file and set `MUSTER_USER`,
`MUSTER_PASSWORD`, `MUSTER_REST_URL` is loaded from settings.
.. todo::
Show login dialog if access token is invalid or missing.
"""
app_dir = os.path.normpath(
appdirs.user_data_dir('pype-app', 'pype')
)
file_name = 'muster_cred.json'
fpath = os.path.join(app_dir, file_name)
file = open(fpath, 'r')
muster_json = json.load(file)
self._token = muster_json.get('token', None)
if not self._token:
raise RuntimeError("Invalid access token for Muster")
file.close()
self.MUSTER_REST_URL = os.environ.get("MUSTER_REST_URL")
if not self.MUSTER_REST_URL:
raise AttributeError("Muster REST API url not set")
def _get_templates(self):
"""
Get Muster templates from server.
"""
params = {
"authToken": self._token,
"select": "name"
}
api_entry = '/api/templates/list'
response = requests_post(
self.MUSTER_REST_URL + api_entry, params=params)
if response.status_code != 200:
self.log.error(
'Cannot get templates from Muster: {}'.format(
response.status_code))
raise Exception('Cannot get templates from Muster.')
try:
response_templates = response.json()["ResponseData"]["templates"]
except ValueError as e:
self.log.error(
'Muster server returned unexpected data {}'.format(e)
)
raise Exception('Muster server returned unexpected data')
templates = {}
for t in response_templates:
templates[t.get("name")] = t.get("id")
self._templates = templates
def _resolve_template(self, renderer):
"""
Returns template ID based on renderer string.
:param renderer: Name of renderer to match against template names
:type renderer: str
:returns: ID of template
:rtype: int
:raises: Exception if template ID isn't found
"""
self.log.debug("Trying to find template for [{}]".format(renderer))
mapped = _get_template_id(renderer)
self.log.debug("got id [{}]".format(mapped))
return self._templates.get(mapped)
def _submit(self, payload):
"""
Submit job to Muster
:param payload: json with job to submit
:type payload: str
:returns: response
:raises: Exception status is wrong
"""
params = {
"authToken": self._token,
"name": "submit"
}
api_entry = '/api/queue/actions'
response = requests_post(
self.MUSTER_REST_URL + api_entry, params=params, json=payload)
if response.status_code != 200:
self.log.error(
'Cannot submit job to Muster: {}'.format(response.text))
raise Exception('Cannot submit job to Muster.')
return response
def process(self, instance):
"""
Authenticate with Muster, collect all data, prepare path for post
render publish job and submit job to farm.
"""
# setup muster environment
self.MUSTER_REST_URL = os.environ.get("MUSTER_REST_URL")
if self.MUSTER_REST_URL is None:
self.log.error(
"\"MUSTER_REST_URL\" is not found. Skipping "
"[{}]".format(instance)
)
raise RuntimeError("MUSTER_REST_URL not set")
self._load_credentials()
# self._get_templates()
context = instance.context
workspace = context.data["workspaceDir"]
project_name = context.data["projectName"]
asset_name = context.data["asset"]
filepath = None
allInstances = []
for result in context.data["results"]:
if ((result["instance"] is not None) and
(result["instance"] not in allInstances)):
allInstances.append(result["instance"])
for inst in allInstances:
print(inst)
if inst.data['family'] == 'scene':
filepath = inst.data['destination_list'][0]
if not filepath:
filepath = context.data["currentFile"]
self.log.debug(filepath)
filename = os.path.basename(filepath)
comment = context.data.get("comment", "")
scene = os.path.splitext(filename)[0]
dirname = os.path.join(workspace, "renders")
renderlayer = instance.data['renderlayer'] # rs_beauty
renderlayer_name = instance.data['subset'] # beauty
renderglobals = instance.data["renderGlobals"]
# legacy_layers = renderlayer_globals["UseLegacyRenderLayers"]
# deadline_user = context.data.get("deadlineUser", getpass.getuser())
jobname = "%s - %s" % (filename, instance.name)
# Get the variables depending on the renderer
render_variables = get_renderer_variables(renderlayer)
output_filename_0 = preview_fname(folder=dirname,
scene=scene,
layer=renderlayer_name,
padding=render_variables["padding"],
ext=render_variables["ext"])
instance.data["outputDir"] = os.path.dirname(output_filename_0)
self.log.debug("output: {}".format(filepath))
# build path for metadata file
metadata_filename = "{}_metadata.json".format(instance.data["subset"])
output_dir = instance.data["outputDir"]
metadata_path = os.path.join(output_dir, metadata_filename)
pype_root = os.environ["OPENPYPE_SETUP_PATH"]
# we must provide either full path to executable or use musters own
# python named MPython.exe, residing directly in muster bin
# directory.
if platform.system().lower() == "windows":
# for muster, those backslashes must be escaped twice
muster_python = ("\"C:\\\\Program Files\\\\Virtual Vertex\\\\"
"Muster 9\\\\MPython.exe\"")
else:
# we need to run pype as different user then Muster dispatcher
# service is running (usually root).
muster_python = ("/usr/sbin/runuser -u {}"
" -- /usr/bin/python3".format(getpass.getuser()))
# build the path and argument. We are providing separate --pype
# argument with network path to pype as post job actions are run
# but dispatcher (Server) and not render clients. Render clients
# inherit environment from publisher including PATH, so there's
# no problem finding PYPE, but there is now way (as far as I know)
# to set environment dynamically for dispatcher. Therefore this hack.
args = [muster_python,
_get_script().replace('\\', '\\\\'),
"--paths",
metadata_path.replace('\\', '\\\\'),
"--pype",
pype_root.replace('\\', '\\\\')]
postjob_command = " ".join(args)
try:
# Ensure render folder exists
os.makedirs(dirname)
except OSError:
pass
env = self.clean_environment()
payload = {
"RequestData": {
"platform": 0,
"job": {
"jobName": jobname,
"templateId": _get_template_id(
instance.data["renderer"]),
"chunksInterleave": 2,
"chunksPriority": "0",
"chunksTimeoutValue": 320,
"department": "",
"dependIds": [""],
"dependLinkMode": 0,
"dependMode": 0,
"emergencyQueue": False,
"excludedPools": [""],
"includedPools": [renderglobals["Pool"]],
"packetSize": 4,
"packetType": 1,
"priority": 1,
"jobId": -1,
"startOn": 0,
"parentId": -1,
"project": project_name or scene,
"shot": asset_name or scene,
"camera": instance.data.get("cameras")[0],
"dependMode": 0,
"packetSize": 4,
"packetType": 1,
"priority": 1,
"maximumInstances": 0,
"assignedInstances": 0,
"attributes": {
"environmental_variables": {
"value": ", ".join("{!s}={!r}".format(k, v)
for (k, v) in env.items()),
"state": True,
"subst": False
},
"memo": {
"value": comment,
"state": True,
"subst": False
},
"frames_range": {
"value": "{start}-{end}".format(
start=int(instance.data["frameStart"]),
end=int(instance.data["frameEnd"])),
"state": True,
"subst": False
},
"job_file": {
"value": filepath,
"state": True,
"subst": True
},
"job_project": {
"value": workspace,
"state": True,
"subst": True
},
"output_folder": {
"value": dirname.replace("\\", "/"),
"state": True,
"subst": True
},
"post_job_action": {
"value": postjob_command,
"state": True,
"subst": True
},
"MAYADIGITS": {
"value": 1,
"state": True,
"subst": False
},
"ARNOLDMODE": {
"value": "0",
"state": True,
"subst": False
},
"ABORTRENDER": {
"value": "0",
"state": True,
"subst": True
},
"ARNOLDLICENSE": {
"value": "0",
"state": False,
"subst": False
},
"ADD_FLAGS": {
"value": "-rl {}".format(renderlayer),
"state": True,
"subst": True
}
}
}
}
}
self.preflight_check(instance)
self.log.debug("Submitting ...")
self.log.debug(json.dumps(payload, indent=4, sort_keys=True))
response = self._submit(payload)
# response = requests.post(url, json=payload)
if not response.ok:
raise Exception(response.text)
# Store output dir for unified publisher (filesequence)
instance.data["musterSubmissionJob"] = response.json()
def clean_environment(self):
"""
Clean and set environment variables for render job so render clients
work in more or less same environment as publishing machine.
.. warning:: This is not usable for **post job action** as this is
executed on dispatcher machine (server) and not render clients.
"""
keys = [
# This will trigger `userSetup.py` on the slave
# such that proper initialisation happens the same
# way as it does on a local machine.
# TODO(marcus): This won't work if the slaves don't
# have access to these paths, such as if slaves are
# running Linux and the submitter is on Windows.
"PYTHONPATH",
"PATH",
"MTOA_EXTENSIONS_PATH",
"MTOA_EXTENSIONS",
"DYLD_LIBRARY_PATH",
"MAYA_RENDER_DESC_PATH",
"MAYA_MODULE_PATH",
"ARNOLD_PLUGIN_PATH",
"FTRACK_API_KEY",
"FTRACK_API_USER",
"FTRACK_SERVER",
"PYBLISHPLUGINPATH",
# todo: This is a temporary fix for yeti variables
"PEREGRINEL_LICENSE",
"SOLIDANGLE_LICENSE",
"ARNOLD_LICENSE"
"MAYA_MODULE_PATH",
"TOOL_ENV"
]
environment = dict({key: os.environ[key] for key in keys
if key in os.environ}, **legacy_io.Session)
# self.log.debug("enviro: {}".format(pprint(environment)))
for path in os.environ:
if path.lower().startswith('pype_'):
environment[path] = os.environ[path]
environment["PATH"] = os.environ["PATH"]
# self.log.debug("enviro: {}".format(environment['OPENPYPE_SCRIPTS']))
clean_environment = {}
for key, value in environment.items():
clean_path = ""
self.log.debug("key: {}".format(key))
if "://" in value:
clean_path = value
else:
valid_paths = []
for path in value.split(os.pathsep):
if not path:
continue
try:
path.decode('UTF-8', 'strict')
valid_paths.append(os.path.normpath(path))
except UnicodeDecodeError:
print('path contains non UTF characters')
if valid_paths:
clean_path = os.pathsep.join(valid_paths)
clean_environment[key] = clean_path
return clean_environment
def preflight_check(self, instance):
"""Ensure the startFrame, endFrame and byFrameStep are integers"""
for key in ("frameStart", "frameEnd", "byFrameStep"):
value = instance.data[key]
if int(value) == value:
continue
self.log.warning(
"%f=%d was rounded off to nearest integer"
% (value, int(value))
)
# TODO: Remove hack to avoid this plug-in in new publisher
# This plug-in should actually be in dedicated module
if not os.environ.get("MUSTER_REST_URL"):
del MayaSubmitMuster

View file

@ -1,96 +0,0 @@
import os
import json
import appdirs
import pyblish.api
from openpype.lib import requests_get
from openpype.pipeline.publish import (
context_plugin_should_run,
RepairAction,
)
class ValidateMusterConnection(pyblish.api.ContextPlugin):
"""
Validate Muster REST API Service is running and we have valid auth token
"""
label = "Validate Muster REST API Service"
order = pyblish.api.ValidatorOrder
hosts = ["maya"]
families = ["renderlayer"]
token = None
if not os.environ.get("MUSTER_REST_URL"):
active = False
actions = [RepairAction]
def process(self, context):
# Workaround bug pyblish-base#250
if not context_plugin_should_run(self, context):
return
# test if we have environment set (redundant as this plugin shouldn'
# be active otherwise).
try:
MUSTER_REST_URL = os.environ["MUSTER_REST_URL"]
except KeyError:
self.log.error("Muster REST API url not found.")
raise ValueError("Muster REST API url not found.")
# Load credentials
try:
self._load_credentials()
except RuntimeError:
self.log.error("invalid or missing access token")
assert self._token is not None, "Invalid or missing token"
# We have token, lets do trivial query to web api to see if we can
# connect and access token is valid.
params = {
'authToken': self._token
}
api_entry = '/api/pools/list'
response = requests_get(
MUSTER_REST_URL + api_entry, params=params)
assert response.status_code == 200, "invalid response from server"
assert response.json()['ResponseData'], "invalid data in response"
def _load_credentials(self):
"""
Load Muster credentials from file and set `MUSTER_USER`,
`MUSTER_PASSWORD`, `MUSTER_REST_URL` is loaded from settings.
.. todo::
Show login dialog if access token is invalid or missing.
"""
app_dir = os.path.normpath(
appdirs.user_data_dir('pype-app', 'pype')
)
file_name = 'muster_cred.json'
fpath = os.path.join(app_dir, file_name)
file = open(fpath, 'r')
muster_json = json.load(file)
self._token = muster_json.get('token', None)
if not self._token:
raise RuntimeError("Invalid access token for Muster")
file.close()
self.MUSTER_REST_URL = os.environ.get("MUSTER_REST_URL")
if not self.MUSTER_REST_URL:
raise AttributeError("Muster REST API url not set")
@classmethod
def repair(cls, instance):
"""
Renew authentication token by logging into Muster
"""
api_url = "{}/muster/show_login".format(
os.environ["OPENPYPE_WEBSERVER_URL"])
cls.log.debug(api_url)
response = requests_get(api_url, timeout=1)
if response.status_code != 200:
cls.log.error('Cannot show login form to Muster')
raise Exception('Cannot show login form to Muster')

View file

@ -1,22 +0,0 @@
from aiohttp.web_response import Response
class MusterModuleRestApi:
def __init__(self, user_module, server_manager):
self.module = user_module
self.server_manager = server_manager
self.prefix = "/muster"
self.register()
def register(self):
self.server_manager.add_route(
"GET",
self.prefix + "/show_login",
self.show_login_widget
)
async def show_login_widget(self, request):
self.module.action_show_login.trigger()
return Response(status=200)

View file

@ -1,165 +0,0 @@
from qtpy import QtCore, QtGui, QtWidgets
from openpype import resources, style
class MusterLogin(QtWidgets.QWidget):
SIZE_W = 300
SIZE_H = 150
loginSignal = QtCore.Signal(object, object, object)
def __init__(self, module, parent=None):
super(MusterLogin, self).__init__(parent)
self.module = module
# Icon
icon = QtGui.QIcon(resources.get_openpype_icon_filepath())
self.setWindowIcon(icon)
self.setWindowFlags(
QtCore.Qt.WindowCloseButtonHint |
QtCore.Qt.WindowMinimizeButtonHint
)
self._translate = QtCore.QCoreApplication.translate
# Font
self.font = QtGui.QFont()
self.font.setFamily("DejaVu Sans Condensed")
self.font.setPointSize(9)
self.font.setBold(True)
self.font.setWeight(50)
self.font.setKerning(True)
# Size setting
self.resize(self.SIZE_W, self.SIZE_H)
self.setMinimumSize(QtCore.QSize(self.SIZE_W, self.SIZE_H))
self.setMaximumSize(QtCore.QSize(self.SIZE_W+100, self.SIZE_H+100))
self.setStyleSheet(style.load_stylesheet())
self.setLayout(self._main())
self.setWindowTitle('Muster login')
def _main(self):
self.main = QtWidgets.QVBoxLayout()
self.main.setObjectName("main")
self.form = QtWidgets.QFormLayout()
self.form.setContentsMargins(10, 15, 10, 5)
self.form.setObjectName("form")
self.label_username = QtWidgets.QLabel("Username:")
self.label_username.setFont(self.font)
self.label_username.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.label_username.setTextFormat(QtCore.Qt.RichText)
self.input_username = QtWidgets.QLineEdit()
self.input_username.setEnabled(True)
self.input_username.setFrame(True)
self.input_username.setPlaceholderText(
self._translate("main", "e.g. John Smith")
)
self.label_password = QtWidgets.QLabel("Password:")
self.label_password.setFont(self.font)
self.label_password.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
self.label_password.setTextFormat(QtCore.Qt.RichText)
self.input_password = QtWidgets.QLineEdit()
self.input_password.setEchoMode(QtWidgets.QLineEdit.Password)
self.input_password.setEnabled(True)
self.input_password.setFrame(True)
self.input_password.setPlaceholderText(
self._translate("main", "e.g. ********")
)
self.error_label = QtWidgets.QLabel("")
self.error_label.setFont(self.font)
self.error_label.setStyleSheet('color: #FC6000')
self.error_label.setWordWrap(True)
self.error_label.hide()
self.form.addRow(self.label_username, self.input_username)
self.form.addRow(self.label_password, self.input_password)
self.form.addRow(self.error_label)
self.btn_group = QtWidgets.QHBoxLayout()
self.btn_group.addStretch(1)
self.btn_group.setObjectName("btn_group")
self.btn_ok = QtWidgets.QPushButton("Ok")
self.btn_ok.clicked.connect(self.click_ok)
self.btn_cancel = QtWidgets.QPushButton("Cancel")
QtWidgets.QShortcut(
QtGui.QKeySequence(
QtCore.Qt.Key_Escape), self).activated.connect(self.close)
self.btn_cancel.clicked.connect(self.close)
self.btn_group.addWidget(self.btn_ok)
self.btn_group.addWidget(self.btn_cancel)
self.main.addLayout(self.form)
self.main.addLayout(self.btn_group)
return self.main
def keyPressEvent(self, key_event):
if key_event.key() == QtCore.Qt.Key_Return:
if self.input_username.hasFocus():
self.input_password.setFocus()
elif self.input_password.hasFocus() or self.btn_ok.hasFocus():
self.click_ok()
elif self.btn_cancel.hasFocus():
self.close()
else:
super().keyPressEvent(key_event)
def setError(self, msg):
self.error_label.setText(msg)
self.error_label.show()
def invalid_input(self, entity):
entity.setStyleSheet("border: 1px solid red;")
def click_ok(self):
# all what should happen - validations and saving into appsdir
username = self.input_username.text()
password = self.input_password.text()
# TODO: more robust validation. Password can be empty in muster?
if not username:
self.setError("Username cannot be empty")
self.invalid_input(self.input_username)
try:
self.save_credentials(username, password)
except Exception as e:
self.setError(
"<b>Cannot get auth token:</b>\n<code>{}</code>".format(e))
else:
self._close_widget()
def save_credentials(self, username, password):
self.module.get_auth_token(username, password)
def showEvent(self, event):
super(MusterLogin, self).showEvent(event)
# Make btns same width
max_width = max(
self.btn_ok.sizeHint().width(),
self.btn_cancel.sizeHint().width()
)
self.btn_ok.setMinimumWidth(max_width)
self.btn_cancel.setMinimumWidth(max_width)
def closeEvent(self, event):
event.ignore()
self._close_widget()
def _close_widget(self):
self.hide()

View file

@ -1971,7 +1971,6 @@ class PlaceholderCreateMixin(object):
if not placeholder.data.get("keep_placeholder", True):
self.delete_placeholder(placeholder)
def create_failed(self, placeholder, creator_data):
if hasattr(placeholder, "create_failed"):
placeholder.create_failed(creator_data)
@ -2036,7 +2035,7 @@ class CreatePlaceholderItem(PlaceholderItem):
self._failed_created_publish_instances = []
def get_errors(self):
if not self._failed_representations:
if not self._failed_created_publish_instances:
return []
message = (
"Failed to create {} instance using Creator {}"

View file

@ -19,7 +19,7 @@ class CollectFarmTarget(pyblish.api.InstancePlugin):
farm_name = ""
op_modules = context.data.get("openPypeModules")
for farm_renderer in ["deadline", "royalrender", "muster"]:
for farm_renderer in ["deadline", "royalrender"]:
op_module = op_modules.get(farm_renderer, False)
if op_module and op_module.enabled:

View file

@ -93,14 +93,6 @@ class CollectRenderedFiles(pyblish.api.ContextPlugin):
assert ctx.get("user") == data.get("user"), ctx_err % "user"
assert ctx.get("version") == data.get("version"), ctx_err % "version"
# ftrack credentials are passed as environment variables by Deadline
# to publish job, but Muster doesn't pass them.
if data.get("ftrack") and not os.environ.get("FTRACK_API_USER"):
ftrack = data.get("ftrack")
os.environ["FTRACK_API_USER"] = ftrack["FTRACK_API_USER"]
os.environ["FTRACK_API_KEY"] = ftrack["FTRACK_API_KEY"]
os.environ["FTRACK_SERVER"] = ftrack["FTRACK_SERVER"]
# now we can just add instances from json file and we are done
any_staging_dir_persistent = False
for instance_data in data.get("instances"):

View file

@ -220,22 +220,6 @@ def _convert_deadline_system_settings(
output["modules"]["deadline"] = deadline_settings
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, addon_versions, default_settings
):
@ -261,7 +245,6 @@ def _convert_modules_system(
_convert_timers_manager_system_settings,
_convert_clockify_system_settings,
_convert_deadline_system_settings,
_convert_muster_system_settings,
_convert_royalrender_system_settings,
):
func(ayon_settings, output, addon_versions, default_settings)
@ -1236,6 +1219,8 @@ def _convert_global_project_settings(ayon_settings, output, default_settings):
for profile in extract_oiio_transcode_profiles:
new_outputs = {}
name_counter = {}
if "product_names" in profile:
profile["subsets"] = profile.pop("product_names")
for profile_output in profile["outputs"]:
if "name" in profile_output:
name = profile_output.pop("name")

View file

@ -164,23 +164,6 @@
"default": "http://127.0.0.1:8082"
}
},
"muster": {
"enabled": false,
"MUSTER_REST_URL": "http://127.0.0.1:9890",
"templates_mapping": {
"file_layers": 7,
"mentalray": 2,
"mentalray_sf": 6,
"redshift": 55,
"renderman": 29,
"software": 1,
"software_sf": 5,
"turtle": 10,
"vector": 4,
"vray": 37,
"ffmpeg": 48
}
},
"royalrender": {
"enabled": false,
"rr_paths": {

View file

@ -645,7 +645,7 @@ How output of the schema could look like on save:
},
"is_group": true,
"key": "templates_mapping",
"label": "Muster - Templates mapping",
"label": "Deadline - Templates mapping",
"is_file": true
}
```
@ -657,7 +657,7 @@ How output of the schema could look like on save:
"object_type": "text",
"is_group": true,
"key": "templates_mapping",
"label": "Muster - Templates mapping",
"label": "Deadline - Templates mapping",
"is_file": true
}
```

View file

@ -207,37 +207,6 @@
}
]
},
{
"type": "dict",
"key": "muster",
"label": "Muster",
"require_restart": true,
"collapsible": true,
"checkbox_key": "enabled",
"children": [
{
"type": "boolean",
"key": "enabled",
"label": "Enabled"
},
{
"type": "text",
"key": "MUSTER_REST_URL",
"label": "Muster Rest URL"
},
{
"type": "dict-modifiable",
"object_type": {
"type": "number",
"minimum": 0,
"maximum": 300
},
"is_group": true,
"key": "templates_mapping",
"label": "Templates mapping"
}
]
},
{
"type": "dict",
"key": "royalrender",

View file

@ -334,7 +334,7 @@
},
"is_group": true,
"key": "templates_mapping",
"label": "Muster - Templates mapping",
"label": "Deadline - Templates mapping",
"is_file": true
}
```
@ -346,7 +346,7 @@
"object_type": "text",
"is_group": true,
"key": "templates_mapping",
"label": "Muster - Templates mapping",
"label": "Deadline - Templates mapping",
"is_file": true
}
```

View file

@ -1,18 +1,16 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class CreateRenderPlugin(BaseSettingsModel):
mark_for_review: bool = Field(True, title="Review")
default_variants: list[str] = Field(
mark_for_review: bool = SettingsField(True, title="Review")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Variants"
)
class AfterEffectsCreatorPlugins(BaseSettingsModel):
RenderCreator: CreateRenderPlugin = Field(
RenderCreator: CreateRenderPlugin = SettingsField(
title="Create Render",
default_factory=CreateRenderPlugin,
)

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class AfterEffectsImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import AfterEffectsImageIOModel
from .creator_plugins import AfterEffectsCreatorPlugins
@ -14,23 +13,23 @@ from .templated_workfile_build import TemplatedWorkfileBuildModel
class AfterEffectsSettings(BaseSettingsModel):
"""AfterEffects Project Settings."""
imageio: AfterEffectsImageIOModel = Field(
imageio: AfterEffectsImageIOModel = SettingsField(
default_factory=AfterEffectsImageIOModel,
title="OCIO config"
)
create: AfterEffectsCreatorPlugins = Field(
create: AfterEffectsCreatorPlugins = SettingsField(
default_factory=AfterEffectsCreatorPlugins,
title="Creator plugins"
)
publish: AfterEffectsPublishPlugins = Field(
publish: AfterEffectsPublishPlugins = SettingsField(
default_factory=AfterEffectsPublishPlugins,
title="Publish plugins"
)
workfile_builder: WorkfileBuilderPlugin = Field(
workfile_builder: WorkfileBuilderPlugin = SettingsField(
default_factory=WorkfileBuilderPlugin,
title="Workfile Builder"
)
templated_workfile_build: TemplatedWorkfileBuildModel = Field(
templated_workfile_build: TemplatedWorkfileBuildModel = SettingsField(
default_factory=TemplatedWorkfileBuildModel,
title="Templated Workfile Build Settings"
)

View file

@ -1,45 +1,43 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class CollectReviewPluginModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
enabled: bool = SettingsField(True, title="Enabled")
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(
enabled: bool = SettingsField(True, title="Enabled")
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
skip_resolution_check: list[str] = SettingsField(
default_factory=list,
title="Skip Resolution Check for Tasks",
)
skip_timelines_check: list[str] = Field(
skip_timelines_check: list[str] = SettingsField(
default_factory=list,
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")
enabled: bool = SettingsField(True, title="Enabled")
optional: bool = SettingsField(True, title="Optional")
active: bool = SettingsField(True, title="Active")
class AfterEffectsPublishPlugins(BaseSettingsModel):
CollectReview: CollectReviewPluginModel = Field(
CollectReview: CollectReviewPluginModel = SettingsField(
default_factory=CollectReviewPluginModel,
title="Collect Review",
)
ValidateSceneSettings: ValidateSceneSettingsModel = Field(
ValidateSceneSettings: ValidateSceneSettingsModel = SettingsField(
default_factory=ValidateSceneSettingsModel,
title="Validate Scene Settings",
)
ValidateContainers: ValidateContainersModel = Field(
ValidateContainers: ValidateContainersModel = SettingsField(
default_factory=ValidateContainersModel,
title="Validate Containers",
)

View file

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

View file

@ -1,25 +1,27 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel, MultiplatformPathModel
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathModel,
)
class CustomBuilderTemplate(BaseSettingsModel):
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
)
template_path: MultiplatformPathModel = Field(
template_path: MultiplatformPathModel = SettingsField(
default_factory=MultiplatformPathModel
)
class WorkfileBuilderPlugin(BaseSettingsModel):
_title = "Workfile Builder"
create_first_version: bool = Field(
create_first_version: bool = SettingsField(
False,
title="Create first workfile"
)
custom_templates: list[CustomBuilderTemplate] = Field(
custom_templates: list[CustomBuilderTemplate] = SettingsField(
default_factory=list
)

View file

@ -1,7 +1,11 @@
import json
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
from ayon_server.exceptions import BadRequestException
@ -23,21 +27,23 @@ def validate_json_dict(value):
class MultiplatformStrList(BaseSettingsModel):
windows: list[str] = Field(default_factory=list, title="Windows")
linux: list[str] = Field(default_factory=list, title="Linux")
darwin: list[str] = Field(default_factory=list, title="MacOS")
windows: list[str] = SettingsField(default_factory=list, title="Windows")
linux: list[str] = SettingsField(default_factory=list, title="Linux")
darwin: list[str] = SettingsField(default_factory=list, title="MacOS")
class AppVariant(BaseSettingsModel):
name: str = Field("", title="Name")
label: str = Field("", title="Label")
executables: MultiplatformStrList = Field(
name: str = SettingsField("", title="Name")
label: str = SettingsField("", title="Label")
executables: MultiplatformStrList = SettingsField(
default_factory=MultiplatformStrList, title="Executables"
)
arguments: MultiplatformStrList = Field(
arguments: MultiplatformStrList = SettingsField(
default_factory=MultiplatformStrList, title="Arguments"
)
environment: str = Field("{}", title="Environment", widget="textarea")
environment: str = SettingsField(
"{}", title="Environment", widget="textarea"
)
@validator("environment")
def validate_json(cls, value):
@ -45,17 +51,19 @@ class AppVariant(BaseSettingsModel):
class AppVariantWithPython(AppVariant):
use_python_2: bool = Field(False, title="Use Python 2")
use_python_2: bool = SettingsField(False, title="Use Python 2")
class AppGroup(BaseSettingsModel):
enabled: bool = Field(True)
label: str = Field("", title="Label")
host_name: str = Field("", title="Host name")
icon: str = Field("", title="Icon")
environment: str = Field("{}", title="Environment", widget="textarea")
enabled: bool = SettingsField(True)
label: str = SettingsField("", title="Label")
host_name: str = SettingsField("", title="Host name")
icon: str = SettingsField("", title="Icon")
environment: str = SettingsField(
"{}", title="Environment", widget="textarea"
)
variants: list[AppVariant] = Field(
variants: list[AppVariant] = SettingsField(
default_factory=list,
title="Variants",
description="Different variants of the applications",
@ -69,7 +77,7 @@ class AppGroup(BaseSettingsModel):
class AppGroupWithPython(AppGroup):
variants: list[AppVariantWithPython] = Field(
variants: list[AppVariantWithPython] = SettingsField(
default_factory=list,
title="Variants",
description="Different variants of the applications",
@ -78,14 +86,16 @@ class AppGroupWithPython(AppGroup):
class AdditionalAppGroup(BaseSettingsModel):
enabled: bool = Field(True)
name: str = Field("", title="Name")
label: str = Field("", title="Label")
host_name: str = Field("", title="Host name")
icon: str = Field("", title="Icon")
environment: str = Field("{}", title="Environment", widget="textarea")
enabled: bool = SettingsField(True)
name: str = SettingsField("", title="Name")
label: str = SettingsField("", title="Label")
host_name: str = SettingsField("", title="Host name")
icon: str = SettingsField("", title="Icon")
environment: str = SettingsField(
"{}", title="Environment", widget="textarea"
)
variants: list[AppVariantWithPython] = Field(
variants: list[AppVariantWithPython] = SettingsField(
default_factory=list,
title="Variants",
description="Different variants of the applications",
@ -99,12 +109,16 @@ class AdditionalAppGroup(BaseSettingsModel):
class ToolVariantModel(BaseSettingsModel):
name: str = Field("", title="Name")
label: str = Field("", title="Label")
host_names: list[str] = Field(default_factory=list, title="Hosts")
name: str = SettingsField("", title="Name")
label: str = SettingsField("", title="Label")
host_names: list[str] = SettingsField(default_factory=list, title="Hosts")
# TODO use applications enum if possible
app_variants: list[str] = Field(default_factory=list, title="Applications")
environment: str = Field("{}", title="Environments", widget="textarea")
app_variants: list[str] = SettingsField(
default_factory=list, title="Applications"
)
environment: str = SettingsField(
"{}", title="Environments", widget="textarea"
)
@validator("environment")
def validate_json(cls, value):
@ -112,10 +126,12 @@ class ToolVariantModel(BaseSettingsModel):
class ToolGroupModel(BaseSettingsModel):
name: str = Field("", title="Name")
label: str = Field("", title="Label")
environment: str = Field("{}", title="Environments", widget="textarea")
variants: list[ToolVariantModel] = Field(default_factory=list)
name: str = SettingsField("", title="Name")
label: str = SettingsField("", title="Label")
environment: str = SettingsField(
"{}", title="Environments", widget="textarea"
)
variants: list[ToolVariantModel] = SettingsField(default_factory=list)
@validator("environment")
def validate_json(cls, value):
@ -130,47 +146,47 @@ class ToolGroupModel(BaseSettingsModel):
class ApplicationsSettings(BaseSettingsModel):
"""Applications settings"""
maya: AppGroupWithPython = Field(
maya: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Autodesk Maya")
adsk_3dsmax: AppGroupWithPython = Field(
adsk_3dsmax: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Autodesk 3ds Max")
flame: AppGroupWithPython = Field(
flame: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Autodesk Flame")
nuke: AppGroupWithPython = Field(
nuke: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Nuke")
nukeassist: AppGroupWithPython = Field(
nukeassist: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Nuke Assist")
nukex: AppGroupWithPython = Field(
nukex: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Nuke X")
nukestudio: AppGroupWithPython = Field(
nukestudio: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Nuke Studio")
hiero: AppGroupWithPython = Field(
hiero: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Hiero")
fusion: AppGroup = Field(
fusion: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Fusion")
resolve: AppGroupWithPython = Field(
resolve: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Resolve")
houdini: AppGroupWithPython = Field(
houdini: AppGroupWithPython = SettingsField(
default_factory=AppGroupWithPython, title="Houdini")
blender: AppGroup = Field(
blender: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Blender")
harmony: AppGroup = Field(
harmony: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Harmony")
tvpaint: AppGroup = Field(
tvpaint: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="TVPaint")
photoshop: AppGroup = Field(
photoshop: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Adobe Photoshop")
aftereffects: AppGroup = Field(
aftereffects: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Adobe After Effects")
celaction: AppGroup = Field(
celaction: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Celaction 2D")
substancepainter: AppGroup = Field(
substancepainter: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Substance Painter")
unreal: AppGroup = Field(
unreal: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Unreal Editor")
wrap: AppGroup = Field(
wrap: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Wrap")
additional_apps: list[AdditionalAppGroup] = Field(
additional_apps: list[AdditionalAppGroup] = SettingsField(
default_factory=list, title="Additional Applications")
@validator("additional_apps")
@ -180,16 +196,16 @@ class ApplicationsSettings(BaseSettingsModel):
class ApplicationsAddonSettings(BaseSettingsModel):
applications: ApplicationsSettings = Field(
applications: ApplicationsSettings = SettingsField(
default_factory=ApplicationsSettings,
title="Applications",
scope=["studio"]
)
tool_groups: list[ToolGroupModel] = Field(
tool_groups: list[ToolGroupModel] = SettingsField(
default_factory=list,
scope=["studio"]
)
only_available: bool = Field(
only_available: bool = SettingsField(
True, title="Show only available applications")
@validator("tool_groups")

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class BlenderImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,6 +1,6 @@
from pydantic import Field
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
TemplateWorkfileBaseOptions,
)
@ -16,38 +16,38 @@ from .render_settings import (
class UnitScaleSettingsModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
apply_on_opening: bool = Field(
enabled: bool = SettingsField(True, title="Enabled")
apply_on_opening: bool = SettingsField(
False, title="Apply on Opening Existing Files")
base_file_unit_scale: float = Field(
base_file_unit_scale: float = SettingsField(
1.0, title="Base File Unit Scale"
)
class BlenderSettings(BaseSettingsModel):
unit_scale_settings: UnitScaleSettingsModel = Field(
unit_scale_settings: UnitScaleSettingsModel = SettingsField(
default_factory=UnitScaleSettingsModel,
title="Set Unit Scale"
)
set_resolution_startup: bool = Field(
set_resolution_startup: bool = SettingsField(
True,
title="Set Resolution on Startup"
)
set_frames_startup: bool = Field(
set_frames_startup: bool = SettingsField(
True,
title="Set Start/End Frames and FPS on Startup"
)
imageio: BlenderImageIOModel = Field(
imageio: BlenderImageIOModel = SettingsField(
default_factory=BlenderImageIOModel,
title="Color Management (ImageIO)"
)
RenderSettings: RenderSettingsModel = Field(
RenderSettings: RenderSettingsModel = SettingsField(
default_factory=RenderSettingsModel, title="Render Settings")
workfile_builder: TemplateWorkfileBaseOptions = Field(
workfile_builder: TemplateWorkfileBaseOptions = SettingsField(
default_factory=TemplateWorkfileBaseOptions,
title="Workfile Builder"
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish Plugins"
)

View file

@ -1,7 +1,7 @@
import json
from pydantic import Field, validator
from pydantic import validator
from ayon_server.exceptions import BadRequestException
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
def validate_json_dict(value):
@ -21,36 +21,36 @@ def validate_json_dict(value):
class ValidatePluginModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class ValidateFileSavedModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateFileSaved")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
exclude_families: list[str] = Field(
enabled: bool = SettingsField(title="ValidateFileSaved")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
exclude_families: list[str] = SettingsField(
default_factory=list,
title="Exclude product types"
)
class ExtractBlendModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
families: list[str] = Field(
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
families: list[str] = SettingsField(
default_factory=list,
title="Families"
)
class ExtractPlayblastModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
presets: str = Field("", title="Presets", widget="textarea")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
presets: str = SettingsField("", title="Presets", widget="textarea")
@validator("presets")
def validate_json(cls, value):
@ -58,83 +58,83 @@ class ExtractPlayblastModel(BaseSettingsModel):
class PublishPuginsModel(BaseSettingsModel):
ValidateCameraZeroKeyframe: ValidatePluginModel = Field(
ValidateCameraZeroKeyframe: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Camera Zero Keyframe",
section="General Validators"
)
ValidateFileSaved: ValidateFileSavedModel = Field(
ValidateFileSaved: ValidateFileSavedModel = SettingsField(
default_factory=ValidateFileSavedModel,
title="Validate File Saved",
)
ValidateInstanceEmpty: ValidatePluginModel = Field(
ValidateInstanceEmpty: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Instance is not Empty"
)
ValidateMeshHasUvs: ValidatePluginModel = Field(
ValidateMeshHasUvs: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Mesh Has Uvs",
section="Model Validators"
)
ValidateMeshNoNegativeScale: ValidatePluginModel = Field(
ValidateMeshNoNegativeScale: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Mesh No Negative Scale"
)
ValidateTransformZero: ValidatePluginModel = Field(
ValidateTransformZero: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Transform Zero"
)
ValidateNoColonsInName: ValidatePluginModel = Field(
ValidateNoColonsInName: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate No Colons In Name"
)
ValidateRenderCameraIsSet: ValidatePluginModel = Field(
ValidateRenderCameraIsSet: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Render Camera Is Set",
section="Render Validators"
)
ValidateDeadlinePublish: ValidatePluginModel = Field(
ValidateDeadlinePublish: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Validate Render Output for Deadline",
)
ExtractBlend: ExtractBlendModel = Field(
ExtractBlend: ExtractBlendModel = SettingsField(
default_factory=ExtractBlendModel,
title="Extract Blend",
section="Extractors"
)
ExtractFBX: ValidatePluginModel = Field(
ExtractFBX: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract FBX"
)
ExtractModelABC: ValidatePluginModel = Field(
ExtractModelABC: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract ABC"
)
ExtractBlendAnimation: ValidatePluginModel = Field(
ExtractBlendAnimation: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract Blend Animation"
)
ExtractAnimationFBX: ValidatePluginModel = Field(
ExtractAnimationFBX: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract Animation FBX"
)
ExtractCamera: ValidatePluginModel = Field(
ExtractCamera: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract Camera"
)
ExtractCameraABC: ValidatePluginModel = Field(
ExtractCameraABC: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract Camera as ABC"
)
ExtractLayout: ValidatePluginModel = Field(
ExtractLayout: ValidatePluginModel = SettingsField(
default_factory=ValidatePluginModel,
title="Extract Layout (JSON)"
)
ExtractThumbnail: ExtractPlayblastModel = Field(
ExtractThumbnail: ExtractPlayblastModel = SettingsField(
default_factory=ExtractPlayblastModel,
title="Extract Thumbnail"
)
ExtractPlayblast: ExtractPlayblastModel = Field(
ExtractPlayblast: ExtractPlayblastModel = SettingsField(
default_factory=ExtractPlayblastModel,
title="Extract Playblast"
)

View file

@ -1,7 +1,5 @@
"""Providing models and values for Blender Render Settings."""
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
def aov_separators_enum():
@ -58,8 +56,8 @@ class CustomPassesModel(BaseSettingsModel):
"""Custom Passes"""
_layout = "compact"
attribute: str = Field("", title="Attribute name")
value: str = Field(
attribute: str = SettingsField("", title="Attribute name")
value: str = SettingsField(
"COLOR",
title="Type",
enum_resolver=custom_passes_types_enum
@ -67,28 +65,28 @@ class CustomPassesModel(BaseSettingsModel):
class RenderSettingsModel(BaseSettingsModel):
default_render_image_folder: str = Field(
default_render_image_folder: str = SettingsField(
title="Default Render Image Folder"
)
aov_separator: str = Field(
aov_separator: str = SettingsField(
"underscore",
title="AOV Separator Character",
enum_resolver=aov_separators_enum
)
image_format: str = Field(
image_format: str = SettingsField(
"exr",
title="Image Format",
enum_resolver=image_format_enum
)
multilayer_exr: bool = Field(
multilayer_exr: bool = SettingsField(
title="Multilayer (EXR)"
)
aov_list: list[str] = Field(
aov_list: list[str] = SettingsField(
default_factory=list,
enum_resolver=aov_list_enum,
title="AOVs to create"
)
custom_passes: list[CustomPassesModel] = Field(
custom_passes: list[CustomPassesModel] = SettingsField(
default_factory=list,
title="Custom Passes",
description=(

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class CelActionImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,18 +1,17 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import CelActionImageIOModel
class CollectRenderPathModel(BaseSettingsModel):
output_extension: str = Field(
output_extension: str = SettingsField(
"",
title="Output render file extension"
)
anatomy_template_key_render_files: str = Field(
anatomy_template_key_render_files: str = SettingsField(
"",
title="Anatomy template key: render files"
)
anatomy_template_key_metadata: str = Field(
anatomy_template_key_metadata: str = SettingsField(
"",
title="Anatomy template key: metadata job file"
)
@ -36,7 +35,7 @@ def _workfile_submit_overrides():
class WorkfileModel(BaseSettingsModel):
submission_overrides: list[str] = Field(
submission_overrides: list[str] = SettingsField(
default_factory=list,
title="Submission workfile overrides",
enum_resolver=_workfile_submit_overrides
@ -44,21 +43,21 @@ class WorkfileModel(BaseSettingsModel):
class PublishPuginsModel(BaseSettingsModel):
CollectRenderPath: CollectRenderPathModel = Field(
CollectRenderPath: CollectRenderPathModel = SettingsField(
default_factory=CollectRenderPathModel,
title="Collect Render Path"
)
class CelActionSettings(BaseSettingsModel):
imageio: CelActionImageIOModel = Field(
imageio: CelActionImageIOModel = SettingsField(
default_factory=CelActionImageIOModel,
title="Color Management (ImageIO)"
)
workfile: WorkfileModel = Field(
workfile: WorkfileModel = SettingsField(
title="Workfile"
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish plugins",
)

View file

@ -1,9 +1,8 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class ClockifySettings(BaseSettingsModel):
workspace_name: str = Field(
workspace_name: str = SettingsField(
"",
title="Workspace name",
scope=["studio"]

View file

@ -1,7 +1,8 @@
import json
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathListModel,
ensure_unique_names,
task_types_enum,
@ -14,35 +15,35 @@ from .tools import GlobalToolsModel, DEFAULT_TOOLS_VALUES
class DiskMappingItemModel(BaseSettingsModel):
_layout = "expanded"
source: str = Field("", title="Source")
destination: str = Field("", title="Destination")
source: str = SettingsField("", title="Source")
destination: str = SettingsField("", title="Destination")
class DiskMappingModel(BaseSettingsModel):
windows: list[DiskMappingItemModel] = Field(
windows: list[DiskMappingItemModel] = SettingsField(
title="Windows",
default_factory=list,
)
linux: list[DiskMappingItemModel] = Field(
linux: list[DiskMappingItemModel] = SettingsField(
title="Linux",
default_factory=list,
)
darwin: list[DiskMappingItemModel] = Field(
darwin: list[DiskMappingItemModel] = SettingsField(
title="MacOS",
default_factory=list,
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class CoreImageIOFileRulesModel(BaseSettingsModel):
activate_global_file_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_global_file_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -54,19 +55,21 @@ class CoreImageIOFileRulesModel(BaseSettingsModel):
class CoreImageIOConfigModel(BaseSettingsModel):
filepath: list[str] = Field(default_factory=list, title="Config path")
filepath: list[str] = SettingsField(
default_factory=list, title="Config path"
)
class CoreImageIOBaseModel(BaseSettingsModel):
activate_global_color_management: bool = Field(
activate_global_color_management: bool = SettingsField(
False,
title="Enable Color Management"
)
ocio_config: CoreImageIOConfigModel = Field(
ocio_config: CoreImageIOConfigModel = SettingsField(
default_factory=CoreImageIOConfigModel,
title="OCIO config"
)
file_rules: CoreImageIOFileRulesModel = Field(
file_rules: CoreImageIOFileRulesModel = SettingsField(
default_factory=CoreImageIOFileRulesModel,
title="File Rules"
)
@ -74,28 +77,28 @@ class CoreImageIOBaseModel(BaseSettingsModel):
class VersionStartCategoryProfileModel(BaseSettingsModel):
_layout = "expanded"
host_names: list[str] = Field(
host_names: list[str] = SettingsField(
default_factory=list,
title="Host names"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list,
title="Product names"
)
version_start: int = Field(
version_start: int = SettingsField(
1,
title="Version Start",
ge=0
@ -103,52 +106,52 @@ class VersionStartCategoryProfileModel(BaseSettingsModel):
class VersionStartCategoryModel(BaseSettingsModel):
profiles: list[VersionStartCategoryProfileModel] = Field(
profiles: list[VersionStartCategoryProfileModel] = SettingsField(
default_factory=list,
title="Profiles"
)
class CoreSettings(BaseSettingsModel):
studio_name: str = Field("", title="Studio name", scope=["studio"])
studio_code: str = Field("", title="Studio code", scope=["studio"])
environments: str = Field(
studio_name: str = SettingsField("", title="Studio name", scope=["studio"])
studio_code: str = SettingsField("", title="Studio code", scope=["studio"])
environments: str = SettingsField(
"{}",
title="Global environment variables",
widget="textarea",
scope=["studio"],
)
disk_mapping: DiskMappingModel = Field(
disk_mapping: DiskMappingModel = SettingsField(
default_factory=DiskMappingModel,
title="Disk mapping",
)
tools: GlobalToolsModel = Field(
tools: GlobalToolsModel = SettingsField(
default_factory=GlobalToolsModel,
title="Tools"
)
version_start_category: VersionStartCategoryModel = Field(
version_start_category: VersionStartCategoryModel = SettingsField(
default_factory=VersionStartCategoryModel,
title="Version start"
)
imageio: CoreImageIOBaseModel = Field(
imageio: CoreImageIOBaseModel = SettingsField(
default_factory=CoreImageIOBaseModel,
title="Color Management (ImageIO)"
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish plugins"
)
project_plugins: MultiplatformPathListModel = Field(
project_plugins: MultiplatformPathListModel = SettingsField(
default_factory=MultiplatformPathListModel,
title="Additional Project Plugin Paths",
)
project_folder_structure: str = Field(
project_folder_structure: str = SettingsField(
"{}",
widget="textarea",
title="Project folder structure",
section="---"
)
project_environments: str = Field(
project_environments: str = SettingsField(
"{}",
widget="textarea",
title="Project environments",

View file

@ -1,7 +1,8 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathModel,
normalize_name,
ensure_unique_names,
@ -13,46 +14,46 @@ from ayon_server.types import ColorRGBA_uint8
class ValidateBaseModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
optional: bool = Field(True, title="Optional")
active: bool = Field(True, title="Active")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(True, title="Optional")
active: bool = SettingsField(True, title="Active")
class CollectAnatomyInstanceDataModel(BaseSettingsModel):
_isGroup = True
follow_workfile_version: bool = Field(
follow_workfile_version: bool = SettingsField(
True, title="Follow workfile version"
)
class CollectAudioModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
audio_product_name: str = Field(
enabled: bool = SettingsField(True)
audio_product_name: str = SettingsField(
"", title="Name of audio variant"
)
class CollectSceneVersionModel(BaseSettingsModel):
_isGroup = True
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Host names"
)
skip_hosts_headless_publish: list[str] = Field(
skip_hosts_headless_publish: list[str] = SettingsField(
default_factory=list,
title="Skip for host if headless publish"
)
class CollectCommentPIModel(BaseSettingsModel):
enabled: bool = Field(True)
families: list[str] = Field(default_factory=list, title="Families")
enabled: bool = SettingsField(True)
families: list[str] = SettingsField(default_factory=list, title="Families")
class CollectFramesFixDefModel(BaseSettingsModel):
enabled: bool = Field(True)
rewrite_version_enable: bool = Field(
enabled: bool = SettingsField(True)
rewrite_version_enable: bool = SettingsField(
True,
title="Show 'Rewrite latest version' toggle"
)
@ -60,15 +61,15 @@ class CollectFramesFixDefModel(BaseSettingsModel):
class ValidateIntentProfile(BaseSettingsModel):
_layout = "expanded"
hosts: list[str] = Field(default_factory=list, title="Host names")
task_types: list[str] = Field(
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
)
tasks: list[str] = Field(default_factory=list, title="Task names")
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
# TODO This was 'validate' in v3
validate_intent: bool = Field(True, title="Validate")
validate_intent: bool = SettingsField(True, title="Validate")
class ValidateIntentModel(BaseSettingsModel):
@ -79,16 +80,16 @@ class ValidateIntentModel(BaseSettingsModel):
"""
_isGroup = True
enabled: bool = Field(False)
profiles: list[ValidateIntentProfile] = Field(default_factory=list)
enabled: bool = SettingsField(False)
profiles: list[ValidateIntentProfile] = SettingsField(default_factory=list)
class ExtractThumbnailFFmpegModel(BaseSettingsModel):
input: list[str] = Field(
input: list[str] = SettingsField(
default_factory=list,
title="FFmpeg input arguments"
)
output: list[str] = Field(
output: list[str] = SettingsField(
default_factory=list,
title="FFmpeg input arguments"
)
@ -96,7 +97,7 @@ class ExtractThumbnailFFmpegModel(BaseSettingsModel):
class ResizeItemModel(BaseSettingsModel):
_layout = "expanded"
width: int = Field(
width: int = SettingsField(
1920,
ge=0,
le=100000,
@ -104,7 +105,7 @@ class ResizeItemModel(BaseSettingsModel):
description="Width and Height must be both set to higher value than 0"
" else source resolution is used."
)
height: int = Field(
height: int = SettingsField(
1080,
title="Height",
ge=0,
@ -121,7 +122,7 @@ _resize_types_enum = [
class ResizeModel(BaseSettingsModel):
_layout = "expanded"
type: str = Field(
type: str = SettingsField(
title="Type",
description="Type of resizing",
enum_resolver=lambda: _resize_types_enum,
@ -129,7 +130,7 @@ class ResizeModel(BaseSettingsModel):
default="source"
)
resize: ResizeItemModel = Field(
resize: ResizeItemModel = SettingsField(
default_factory=ResizeItemModel,
title="Resize"
)
@ -143,18 +144,18 @@ _thumbnail_oiio_transcoding_type = [
class DisplayAndViewModel(BaseSettingsModel):
_layout = "expanded"
display: str = Field(
display: str = SettingsField(
"default",
title="Display"
)
view: str = Field(
view: str = SettingsField(
"sRGB",
title="View"
)
class ExtractThumbnailOIIODefaultsModel(BaseSettingsModel):
type: str = Field(
type: str = SettingsField(
title="Type",
description="Transcoding type",
enum_resolver=lambda: _thumbnail_oiio_transcoding_type,
@ -162,11 +163,11 @@ class ExtractThumbnailOIIODefaultsModel(BaseSettingsModel):
default="colorspace"
)
colorspace: str = Field(
colorspace: str = SettingsField(
"",
title="Colorspace"
)
display_and_view: DisplayAndViewModel = Field(
display_and_view: DisplayAndViewModel = SettingsField(
default_factory=DisplayAndViewModel,
title="Display&View"
)
@ -174,30 +175,30 @@ class ExtractThumbnailOIIODefaultsModel(BaseSettingsModel):
class ExtractThumbnailModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
integrate_thumbnail: bool = Field(
enabled: bool = SettingsField(True)
integrate_thumbnail: bool = SettingsField(
True,
title="Integrate Thumbnail Representation"
)
target_size: ResizeModel = Field(
target_size: ResizeModel = SettingsField(
default_factory=ResizeModel,
title="Target size"
)
background_color: ColorRGBA_uint8 = Field(
background_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
title="Background color"
)
duration_split: float = Field(
duration_split: float = SettingsField(
0.5,
title="Duration split",
ge=0.0,
le=1.0
)
oiiotool_defaults: ExtractThumbnailOIIODefaultsModel = Field(
oiiotool_defaults: ExtractThumbnailOIIODefaultsModel = SettingsField(
default_factory=ExtractThumbnailOIIODefaultsModel,
title="OIIOtool defaults"
)
ffmpeg_args: ExtractThumbnailFFmpegModel = Field(
ffmpeg_args: ExtractThumbnailFFmpegModel = SettingsField(
default_factory=ExtractThumbnailFFmpegModel
)
@ -210,57 +211,59 @@ def _extract_oiio_transcoding_type():
class OIIOToolArgumentsModel(BaseSettingsModel):
additional_command_args: list[str] = Field(
additional_command_args: list[str] = SettingsField(
default_factory=list, title="Arguments")
class ExtractOIIOTranscodeOutputModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Name")
extension: str = Field("", title="Extension")
transcoding_type: str = Field(
name: str = SettingsField("", title="Name")
extension: str = SettingsField("", title="Extension")
transcoding_type: str = SettingsField(
"colorspace",
title="Transcoding type",
enum_resolver=_extract_oiio_transcoding_type
)
colorspace: str = Field("", title="Colorspace")
display: str = Field("", title="Display")
view: str = Field("", title="View")
oiiotool_args: OIIOToolArgumentsModel = Field(
colorspace: str = SettingsField("", title="Colorspace")
display: str = SettingsField("", title="Display")
view: str = SettingsField("", title="View")
oiiotool_args: OIIOToolArgumentsModel = SettingsField(
default_factory=OIIOToolArgumentsModel,
title="OIIOtool arguments")
tags: list[str] = Field(default_factory=list, title="Tags")
custom_tags: list[str] = Field(default_factory=list, title="Custom Tags")
tags: list[str] = SettingsField(default_factory=list, title="Tags")
custom_tags: list[str] = SettingsField(
default_factory=list, title="Custom Tags"
)
class ExtractOIIOTranscodeProfileModel(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Host names"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list,
title="Product names"
)
delete_original: bool = Field(
delete_original: bool = SettingsField(
True,
title="Delete Original Representation"
)
outputs: list[ExtractOIIOTranscodeOutputModel] = Field(
outputs: list[ExtractOIIOTranscodeOutputModel] = SettingsField(
default_factory=list,
title="Output Definitions",
)
@ -272,27 +275,27 @@ class ExtractOIIOTranscodeProfileModel(BaseSettingsModel):
class ExtractOIIOTranscodeModel(BaseSettingsModel):
enabled: bool = Field(True)
profiles: list[ExtractOIIOTranscodeProfileModel] = Field(
enabled: bool = SettingsField(True)
profiles: list[ExtractOIIOTranscodeProfileModel] = SettingsField(
default_factory=list, title="Profiles"
)
# --- [START] Extract Review ---
class ExtractReviewFFmpegModel(BaseSettingsModel):
video_filters: list[str] = Field(
video_filters: list[str] = SettingsField(
default_factory=list,
title="Video filters"
)
audio_filters: list[str] = Field(
audio_filters: list[str] = SettingsField(
default_factory=list,
title="Audio filters"
)
input: list[str] = Field(
input: list[str] = SettingsField(
default_factory=list,
title="Input arguments"
)
output: list[str] = Field(
output: list[str] = SettingsField(
default_factory=list,
title="Output arguments"
)
@ -316,11 +319,13 @@ def extract_review_filter_enum():
class ExtractReviewFilterModel(BaseSettingsModel):
families: list[str] = Field(default_factory=list, title="Families")
product_names: list[str] = Field(
families: list[str] = SettingsField(default_factory=list, title="Families")
product_names: list[str] = SettingsField(
default_factory=list, title="Product names")
custom_tags: list[str] = Field(default_factory=list, title="Custom Tags")
single_frame_filter: str = Field(
custom_tags: list[str] = SettingsField(
default_factory=list, title="Custom Tags"
)
single_frame_filter: str = SettingsField(
"everytime",
description=(
"Use output <b>always</b> / only if input <b>is 1 frame</b>"
@ -331,24 +336,24 @@ class ExtractReviewFilterModel(BaseSettingsModel):
class ExtractReviewLetterBox(BaseSettingsModel):
enabled: bool = Field(True)
ratio: float = Field(
enabled: bool = SettingsField(True)
ratio: float = SettingsField(
0.0,
title="Ratio",
ge=0.0,
le=10000.0
)
fill_color: ColorRGBA_uint8 = Field(
fill_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
title="Fill Color"
)
line_thickness: int = Field(
line_thickness: int = SettingsField(
0,
title="Line Thickness",
ge=0,
le=1000
)
line_color: ColorRGBA_uint8 = Field(
line_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
title="Line Color"
)
@ -356,29 +361,29 @@ class ExtractReviewLetterBox(BaseSettingsModel):
class ExtractReviewOutputDefModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Name")
ext: str = Field("", title="Output extension")
name: str = SettingsField("", title="Name")
ext: str = SettingsField("", title="Output extension")
# TODO use some different source of tags
tags: list[str] = Field(default_factory=list, title="Tags")
burnins: list[str] = Field(
tags: list[str] = SettingsField(default_factory=list, title="Tags")
burnins: list[str] = SettingsField(
default_factory=list, title="Link to a burnin by name"
)
ffmpeg_args: ExtractReviewFFmpegModel = Field(
ffmpeg_args: ExtractReviewFFmpegModel = SettingsField(
default_factory=ExtractReviewFFmpegModel,
title="FFmpeg arguments"
)
filter: ExtractReviewFilterModel = Field(
filter: ExtractReviewFilterModel = SettingsField(
default_factory=ExtractReviewFilterModel,
title="Additional output filtering"
)
overscan_crop: str = Field(
overscan_crop: str = SettingsField(
"",
title="Overscan crop",
description=(
"Crop input overscan. See the documentation for more information."
)
)
overscan_color: ColorRGBA_uint8 = Field(
overscan_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
title="Overscan color",
description=(
@ -386,7 +391,7 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
" same as output aspect ratio."
)
)
width: int = Field(
width: int = SettingsField(
0,
ge=0,
le=100000,
@ -396,13 +401,13 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
" value than 0 else source resolution is used."
)
)
height: int = Field(
height: int = SettingsField(
0,
title="Output height",
ge=0,
le=100000,
)
scale_pixel_aspect: bool = Field(
scale_pixel_aspect: bool = SettingsField(
True,
title="Scale pixel aspect",
description=(
@ -410,7 +415,7 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
" Usefull for anamorph reviews."
)
)
bg_color: ColorRGBA_uint8 = Field(
bg_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 0.0),
description=(
"Background color is used only when input have transparency"
@ -418,7 +423,7 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
),
title="Background color",
)
letter_box: ExtractReviewLetterBox = Field(
letter_box: ExtractReviewLetterBox = SettingsField(
default_factory=ExtractReviewLetterBox,
title="Letter Box"
)
@ -431,14 +436,14 @@ class ExtractReviewOutputDefModel(BaseSettingsModel):
class ExtractReviewProfileModel(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list, title="Product types"
)
# TODO use hosts enum
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list, title="Host names"
)
outputs: list[ExtractReviewOutputDefModel] = Field(
outputs: list[ExtractReviewOutputDefModel] = SettingsField(
default_factory=list, title="Output Definitions"
)
@ -450,8 +455,8 @@ class ExtractReviewProfileModel(BaseSettingsModel):
class ExtractReviewModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
profiles: list[ExtractReviewProfileModel] = Field(
enabled: bool = SettingsField(True)
profiles: list[ExtractReviewProfileModel] = SettingsField(
default_factory=list,
title="Profiles"
)
@ -460,30 +465,30 @@ class ExtractReviewModel(BaseSettingsModel):
# --- [Start] Extract Burnin ---
class ExtractBurninOptionsModel(BaseSettingsModel):
font_size: int = Field(0, ge=0, title="Font size")
font_color: ColorRGBA_uint8 = Field(
font_size: int = SettingsField(0, ge=0, title="Font size")
font_color: ColorRGBA_uint8 = SettingsField(
(255, 255, 255, 1.0),
title="Font color"
)
bg_color: ColorRGBA_uint8 = Field(
bg_color: ColorRGBA_uint8 = SettingsField(
(0, 0, 0, 1.0),
title="Background color"
)
x_offset: int = Field(0, title="X Offset")
y_offset: int = Field(0, title="Y Offset")
bg_padding: int = Field(0, title="Padding around text")
font_filepath: MultiplatformPathModel = Field(
x_offset: int = SettingsField(0, title="X Offset")
y_offset: int = SettingsField(0, title="Y Offset")
bg_padding: int = SettingsField(0, title="Padding around text")
font_filepath: MultiplatformPathModel = SettingsField(
default_factory=MultiplatformPathModel,
title="Font file path"
)
class ExtractBurninDefFilter(BaseSettingsModel):
families: list[str] = Field(
families: list[str] = SettingsField(
default_factory=list,
title="Families"
)
tags: list[str] = Field(
tags: list[str] = SettingsField(
default_factory=list,
title="Tags"
)
@ -492,14 +497,14 @@ class ExtractBurninDefFilter(BaseSettingsModel):
class ExtractBurninDef(BaseSettingsModel):
_isGroup = True
_layout = "expanded"
name: str = Field("")
TOP_LEFT: str = Field("", topic="Top Left")
TOP_CENTERED: str = Field("", topic="Top Centered")
TOP_RIGHT: str = Field("", topic="Top Right")
BOTTOM_LEFT: str = Field("", topic="Bottom Left")
BOTTOM_CENTERED: str = Field("", topic="Bottom Centered")
BOTTOM_RIGHT: str = Field("", topic="Bottom Right")
filter: ExtractBurninDefFilter = Field(
name: str = SettingsField("")
TOP_LEFT: str = SettingsField("", topic="Top Left")
TOP_CENTERED: str = SettingsField("", topic="Top Centered")
TOP_RIGHT: str = SettingsField("", topic="Top Right")
BOTTOM_LEFT: str = SettingsField("", topic="Bottom Left")
BOTTOM_CENTERED: str = SettingsField("", topic="Bottom Centered")
BOTTOM_RIGHT: str = SettingsField("", topic="Bottom Right")
filter: ExtractBurninDefFilter = SettingsField(
default_factory=ExtractBurninDefFilter,
title="Additional filtering"
)
@ -512,28 +517,28 @@ class ExtractBurninDef(BaseSettingsModel):
class ExtractBurninProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Produt types"
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Host names"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list,
title="Product names"
)
burnins: list[ExtractBurninDef] = Field(
burnins: list[ExtractBurninDef] = SettingsField(
default_factory=list,
title="Burnins"
)
@ -547,12 +552,12 @@ class ExtractBurninProfile(BaseSettingsModel):
class ExtractBurninModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
options: ExtractBurninOptionsModel = Field(
enabled: bool = SettingsField(True)
options: ExtractBurninOptionsModel = SettingsField(
default_factory=ExtractBurninOptionsModel,
title="Burnin formatting options"
)
profiles: list[ExtractBurninProfile] = Field(
profiles: list[ExtractBurninProfile] = SettingsField(
default_factory=list,
title="Profiles"
)
@ -561,24 +566,24 @@ class ExtractBurninModel(BaseSettingsModel):
class PreIntegrateThumbnailsProfile(BaseSettingsModel):
_isGroup = True
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types",
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Hosts",
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list,
title="Product names",
)
integrate_thumbnail: bool = Field(True)
integrate_thumbnail: bool = SettingsField(True)
class PreIntegrateThumbnailsModel(BaseSettingsModel):
@ -589,26 +594,26 @@ class PreIntegrateThumbnailsModel(BaseSettingsModel):
"""
_isGroup = True
enabled: bool = Field(True)
integrate_profiles: list[PreIntegrateThumbnailsProfile] = Field(
enabled: bool = SettingsField(True)
integrate_profiles: list[PreIntegrateThumbnailsProfile] = SettingsField(
default_factory=list,
title="Integrate profiles"
)
class IntegrateProductGroupProfile(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
template: str = Field("", title="Template")
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
template: str = SettingsField("", title="Template")
class IntegrateProductGroupModel(BaseSettingsModel):
@ -622,163 +627,169 @@ class IntegrateProductGroupModel(BaseSettingsModel):
"""
_isGroup = True
product_grouping_profiles: list[IntegrateProductGroupProfile] = Field(
default_factory=list,
title="Product group profiles"
product_grouping_profiles: list[IntegrateProductGroupProfile] = (
SettingsField(
default_factory=list,
title="Product group profiles"
)
)
class IntegrateANProductGroupProfileModel(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Hosts"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
tasks: list[str] = Field(
tasks: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
template: str = Field("", title="Template")
template: str = SettingsField("", title="Template")
class IntegrateANTemplateNameProfileModel(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Hosts"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
tasks: list[str] = Field(
tasks: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
template_name: str = Field("", title="Template name")
template_name: str = SettingsField("", title="Template name")
class IntegrateHeroTemplateNameProfileModel(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
hosts: list[str] = Field(
hosts: list[str] = SettingsField(
default_factory=list,
title="Hosts"
)
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names"
)
template_name: str = Field("", title="Template name")
template_name: str = SettingsField("", title="Template name")
class IntegrateHeroVersionModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
families: list[str] = Field(default_factory=list, title="Families")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
families: list[str] = SettingsField(default_factory=list, title="Families")
class CleanUpModel(BaseSettingsModel):
_isGroup = True
paterns: list[str] = Field(
paterns: list[str] = SettingsField(
default_factory=list,
title="Patterns (regex)"
)
remove_temp_renders: bool = Field(False, title="Remove Temp renders")
remove_temp_renders: bool = SettingsField(
False, title="Remove Temp renders"
)
class CleanUpFarmModel(BaseSettingsModel):
_isGroup = True
enabled: bool = Field(True)
enabled: bool = SettingsField(True)
class PublishPuginsModel(BaseSettingsModel):
CollectAnatomyInstanceData: CollectAnatomyInstanceDataModel = Field(
default_factory=CollectAnatomyInstanceDataModel,
title="Collect Anatomy Instance Data"
CollectAnatomyInstanceData: CollectAnatomyInstanceDataModel = (
SettingsField(
default_factory=CollectAnatomyInstanceDataModel,
title="Collect Anatomy Instance Data"
)
)
CollectAudio: CollectAudioModel = Field(
CollectAudio: CollectAudioModel = SettingsField(
default_factory=CollectAudioModel,
title="Collect Audio"
)
CollectSceneVersion: CollectSceneVersionModel = Field(
CollectSceneVersion: CollectSceneVersionModel = SettingsField(
default_factory=CollectSceneVersionModel,
title="Collect Version from Workfile"
)
collect_comment_per_instance: CollectCommentPIModel = Field(
collect_comment_per_instance: CollectCommentPIModel = SettingsField(
default_factory=CollectCommentPIModel,
title="Collect comment per instance",
)
CollectFramesFixDef: CollectFramesFixDefModel = Field(
CollectFramesFixDef: CollectFramesFixDefModel = SettingsField(
default_factory=CollectFramesFixDefModel,
title="Collect Frames to Fix",
)
ValidateEditorialAssetName: ValidateBaseModel = Field(
ValidateEditorialAssetName: ValidateBaseModel = SettingsField(
default_factory=ValidateBaseModel,
title="Validate Editorial Asset Name"
)
ValidateVersion: ValidateBaseModel = Field(
ValidateVersion: ValidateBaseModel = SettingsField(
default_factory=ValidateBaseModel,
title="Validate Version"
)
ValidateIntent: ValidateIntentModel = Field(
ValidateIntent: ValidateIntentModel = SettingsField(
default_factory=ValidateIntentModel,
title="Validate Intent"
)
ExtractThumbnail: ExtractThumbnailModel = Field(
ExtractThumbnail: ExtractThumbnailModel = SettingsField(
default_factory=ExtractThumbnailModel,
title="Extract Thumbnail"
)
ExtractOIIOTranscode: ExtractOIIOTranscodeModel = Field(
ExtractOIIOTranscode: ExtractOIIOTranscodeModel = SettingsField(
default_factory=ExtractOIIOTranscodeModel,
title="Extract OIIO Transcode"
)
ExtractReview: ExtractReviewModel = Field(
ExtractReview: ExtractReviewModel = SettingsField(
default_factory=ExtractReviewModel,
title="Extract Review"
)
ExtractBurnin: ExtractBurninModel = Field(
ExtractBurnin: ExtractBurninModel = SettingsField(
default_factory=ExtractBurninModel,
title="Extract Burnin"
)
PreIntegrateThumbnails: PreIntegrateThumbnailsModel = Field(
PreIntegrateThumbnails: PreIntegrateThumbnailsModel = SettingsField(
default_factory=PreIntegrateThumbnailsModel,
title="Override Integrate Thumbnail Representations"
)
IntegrateProductGroup: IntegrateProductGroupModel = Field(
IntegrateProductGroup: IntegrateProductGroupModel = SettingsField(
default_factory=IntegrateProductGroupModel,
title="Integrate Product Group"
)
IntegrateHeroVersion: IntegrateHeroVersionModel = Field(
IntegrateHeroVersion: IntegrateHeroVersionModel = SettingsField(
default_factory=IntegrateHeroVersionModel,
title="Integrate Hero Version"
)
CleanUp: CleanUpModel = Field(
CleanUp: CleanUpModel = SettingsField(
default_factory=CleanUpModel,
title="Clean Up"
)
CleanUpFarm: CleanUpFarmModel = Field(
CleanUpFarm: CleanUpFarmModel = SettingsField(
default_factory=CleanUpFarmModel,
title="Clean Up Farm"
)

View file

@ -1,6 +1,7 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
normalize_name,
ensure_unique_names,
task_types_enum,
@ -9,8 +10,10 @@ from ayon_server.settings import (
class ProductTypeSmartSelectModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Product type")
task_names: list[str] = Field(default_factory=list, title="Task names")
name: str = SettingsField("", title="Product type")
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
@validator("name")
def normalize_value(cls, value):
@ -19,26 +22,28 @@ class ProductTypeSmartSelectModel(BaseSettingsModel):
class ProductNameProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list, title="Product types"
)
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
template: str = Field("", title="Template")
tasks: list[str] = SettingsField(default_factory=list, title="Task names")
template: str = SettingsField("", title="Template")
class CreatorToolModel(BaseSettingsModel):
# TODO this was dynamic dictionary '{name: task_names}'
product_types_smart_select: list[ProductTypeSmartSelectModel] = Field(
default_factory=list,
title="Create Smart Select"
product_types_smart_select: list[ProductTypeSmartSelectModel] = (
SettingsField(
default_factory=list,
title="Create Smart Select"
)
)
product_name_profiles: list[ProductNameProfile] = Field(
product_name_profiles: list[ProductNameProfile] = SettingsField(
default_factory=list,
title="Product name profiles"
)
@ -51,29 +56,29 @@ class CreatorToolModel(BaseSettingsModel):
class WorkfileTemplateProfile(BaseSettingsModel):
_layout = "expanded"
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Hosts")
hosts: list[str] = SettingsField(default_factory=list, title="Hosts")
# TODO this was using project anatomy template name
workfile_template: str = Field("", title="Workfile template")
workfile_template: str = SettingsField("", title="Workfile template")
class LastWorkfileOnStartupProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
enabled: bool = Field(True, title="Enabled")
use_last_published_workfile: bool = Field(
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"
)
@ -81,54 +86,60 @@ class LastWorkfileOnStartupProfile(BaseSettingsModel):
class WorkfilesToolOnStartupProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
enabled: bool = Field(True, title="Enabled")
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] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
folders: list[str] = Field(default_factory=list, title="Folders")
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] = Field(default_factory=list, title="Hosts")
enabled: bool = Field(True, title="Enabled")
host_names: list[str] = SettingsField(default_factory=list, title="Hosts")
enabled: bool = SettingsField(True, title="Enabled")
class WorkfilesToolModel(BaseSettingsModel):
workfile_template_profiles: list[WorkfileTemplateProfile] = Field(
workfile_template_profiles: list[WorkfileTemplateProfile] = SettingsField(
default_factory=list,
title="Workfile template profiles"
)
last_workfile_on_startup: list[LastWorkfileOnStartupProfile] = Field(
default_factory=list,
title="Open last workfile on launch"
last_workfile_on_startup: list[LastWorkfileOnStartupProfile] = (
SettingsField(
default_factory=list,
title="Open last workfile on launch"
)
)
open_workfile_tool_on_startup: list[WorkfilesToolOnStartupProfile] = Field(
default_factory=list,
title="Open workfile tool on launch"
open_workfile_tool_on_startup: list[WorkfilesToolOnStartupProfile] = (
SettingsField(
default_factory=list,
title="Open workfile tool on launch"
)
)
extra_folders: list[ExtraWorkFoldersProfile] = Field(
extra_folders: list[ExtraWorkFoldersProfile] = SettingsField(
default_factory=list,
title="Extra work folders"
)
workfile_lock_profiles: list[WorkfilesLockProfile] = Field(
workfile_lock_profiles: list[WorkfilesLockProfile] = SettingsField(
default_factory=list,
title="Workfile lock profiles"
)
@ -175,95 +186,100 @@ def _product_types_enum():
class LoaderProductTypeFilterProfile(BaseSettingsModel):
_layout = "expanded"
# TODO this should use hosts enum
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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
)
is_include: bool = Field(True, title="Exclude / Include")
filter_product_types: list[str] = Field(
is_include: bool = SettingsField(True, title="Exclude / Include")
filter_product_types: list[str] = SettingsField(
default_factory=list,
enum_resolver=_product_types_enum
)
class LoaderToolModel(BaseSettingsModel):
product_type_filter_profiles: list[LoaderProductTypeFilterProfile] = Field(
default_factory=list,
title="Product type filtering"
product_type_filter_profiles: list[LoaderProductTypeFilterProfile] = (
SettingsField(default_factory=list, title="Product type filtering")
)
class PublishTemplateNameProfile(BaseSettingsModel):
_layout = "expanded"
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
# TODO this should use hosts enum
hosts: list[str] = Field(default_factory=list, title="Hosts")
task_types: list[str] = Field(
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] = Field(default_factory=list, title="Task names")
template_name: str = Field("", title="Template name")
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
template_name: str = SettingsField("", title="Template name")
class CustomStagingDirProfileModel(BaseSettingsModel):
active: bool = Field(True, title="Is active")
hosts: list[str] = Field(default_factory=list, title="Host names")
task_types: list[str] = Field(
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] = Field(
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list, title="Product types"
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list, title="Product names"
)
custom_staging_dir_persistent: bool = Field(
custom_staging_dir_persistent: bool = SettingsField(
False, title="Custom Staging Folder Persistent"
)
template_name: str = Field("", title="Template Name")
template_name: str = SettingsField("", title="Template Name")
class PublishToolModel(BaseSettingsModel):
template_name_profiles: list[PublishTemplateNameProfile] = Field(
template_name_profiles: list[PublishTemplateNameProfile] = SettingsField(
default_factory=list,
title="Template name profiles"
)
hero_template_name_profiles: list[PublishTemplateNameProfile] = Field(
default_factory=list,
title="Hero template name profiles"
hero_template_name_profiles: list[PublishTemplateNameProfile] = (
SettingsField(
default_factory=list,
title="Hero template name profiles"
)
)
custom_staging_dir_profiles: list[CustomStagingDirProfileModel] = Field(
default_factory=list,
title="Custom Staging Dir Profiles"
custom_staging_dir_profiles: list[CustomStagingDirProfileModel] = (
SettingsField(
default_factory=list,
title="Custom Staging Dir Profiles"
)
)
class GlobalToolsModel(BaseSettingsModel):
creator: CreatorToolModel = Field(
creator: CreatorToolModel = SettingsField(
default_factory=CreatorToolModel,
title="Creator"
)
Workfiles: WorkfilesToolModel = Field(
Workfiles: WorkfilesToolModel = SettingsField(
default_factory=WorkfilesToolModel,
title="Workfiles"
)
loader: LoaderToolModel = Field(
loader: LoaderToolModel = SettingsField(
default_factory=LoaderToolModel,
title="Loader"
)
publish: PublishToolModel = Field(
publish: PublishToolModel = SettingsField(
default_factory=PublishToolModel,
title="Publish"
)

View file

@ -1,6 +1,10 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
from .publish_plugins import (
PublishPluginsModel,
@ -10,8 +14,8 @@ from .publish_plugins import (
class ServerListSubmodel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: str = Field(title="Value")
name: str = SettingsField(title="Name")
value: str = SettingsField(title="Value")
async def defined_deadline_ws_name_enum_resolver(
@ -33,18 +37,18 @@ async def defined_deadline_ws_name_enum_resolver(
class DeadlineSettings(BaseSettingsModel):
deadline_urls: list[ServerListSubmodel] = Field(
deadline_urls: list[ServerListSubmodel] = SettingsField(
default_factory=list,
title="System Deadline Webservice URLs",
scope=["studio"],
)
deadline_server: str = Field(
deadline_server: str = SettingsField(
title="Project deadline server",
section="---",
scope=["project"],
enum_resolver=defined_deadline_ws_name_enum_resolver
)
publish: PublishPluginsModel = Field(
publish: PublishPluginsModel = SettingsField(
default_factory=PublishPluginsModel,
title="Publish Plugins",
)

View file

@ -1,26 +1,30 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
class CollectDeadlinePoolsModel(BaseSettingsModel):
"""Settings Deadline default pools."""
primary_pool: str = Field(title="Primary Pool")
primary_pool: str = SettingsField(title="Primary Pool")
secondary_pool: str = Field(title="Secondary Pool")
secondary_pool: str = SettingsField(title="Secondary Pool")
class ValidateExpectedFilesModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
active: bool = Field(True, title="Active")
allow_user_override: bool = Field(
enabled: bool = SettingsField(True, title="Enabled")
active: bool = SettingsField(True, title="Active")
allow_user_override: bool = SettingsField(
True, title="Allow user change frame range"
)
families: list[str] = Field(
families: list[str] = SettingsField(
default_factory=list, title="Trigger on families"
)
targets: list[str] = Field(
targets: list[str] = SettingsField(
default_factory=list, title="Trigger for plugins"
)
@ -45,45 +49,47 @@ def tile_assembler_enum():
class ScenePatchesSubmodel(BaseSettingsModel):
_layout = "expanded"
name: str = Field(title="Patch name")
regex: str = Field(title="Patch regex")
line: str = Field(title="Patch line")
name: str = SettingsField(title="Patch name")
regex: str = SettingsField(title="Patch regex")
line: str = SettingsField(title="Patch line")
class MayaSubmitDeadlineModel(BaseSettingsModel):
"""Maya deadline submitter settings."""
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
use_published: bool = Field(title="Use Published scene")
import_reference: bool = Field(title="Use Scene with Imported Reference")
asset_dependencies: bool = Field(title="Use Asset dependencies")
priority: int = Field(title="Priority")
tile_priority: int = Field(title="Tile Priority")
group: str = Field(title="Group")
limit: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene")
import_reference: bool = SettingsField(
title="Use Scene with Imported Reference"
)
asset_dependencies: bool = SettingsField(title="Use Asset dependencies")
priority: int = SettingsField(title="Priority")
tile_priority: int = SettingsField(title="Tile Priority")
group: str = SettingsField(title="Group")
limit: list[str] = SettingsField(
default_factory=list,
title="Limit Groups"
)
tile_assembler_plugin: str = Field(
tile_assembler_plugin: str = SettingsField(
title="Tile Assembler Plugin",
enum_resolver=tile_assembler_enum,
)
jobInfo: str = Field(
jobInfo: str = SettingsField(
title="Additional JobInfo data",
widget="textarea",
)
pluginInfo: str = Field(
pluginInfo: str = SettingsField(
title="Additional PluginInfo data",
widget="textarea",
)
scene_patches: list[ScenePatchesSubmodel] = Field(
scene_patches: list[ScenePatchesSubmodel] = SettingsField(
default_factory=list,
title="Scene patches",
)
strict_error_checking: bool = Field(
strict_error_checking: bool = SettingsField(
title="Disable Strict Error Check profiles"
)
@ -94,25 +100,25 @@ class MayaSubmitDeadlineModel(BaseSettingsModel):
class MaxSubmitDeadlineModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
use_published: bool = Field(title="Use Published scene")
priority: int = Field(title="Priority")
chunk_size: int = Field(title="Frame per Task")
group: str = Field("", title="Group Name")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene")
priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Frame per Task")
group: str = SettingsField("", title="Group Name")
class EnvSearchReplaceSubmodel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: str = Field(title="Value")
name: str = SettingsField(title="Name")
value: str = SettingsField(title="Value")
class LimitGroupsSubmodel(BaseSettingsModel):
_layout = "expanded"
name: str = Field(title="Name")
value: list[str] = Field(
name: str = SettingsField(title="Name")
value: list[str] = SettingsField(
default_factory=list,
title="Limit Groups"
)
@ -137,14 +143,16 @@ def fusion_deadline_plugin_enum():
class FusionSubmitDeadlineModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
priority: int = Field(50, title="Priority")
chunk_size: int = Field(10, title="Frame per Task")
concurrent_tasks: int = Field(1, title="Number of concurrent tasks")
group: str = Field("", title="Group Name")
plugin: str = Field("Fusion",
enabled: bool = SettingsField(True, title="Enabled")
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
priority: int = SettingsField(50, title="Priority")
chunk_size: int = SettingsField(10, title="Frame per Task")
concurrent_tasks: int = SettingsField(
1, title="Number of concurrent tasks"
)
group: str = SettingsField("", title="Group Name")
plugin: str = SettingsField("Fusion",
enum_resolver=fusion_deadline_plugin_enum,
title="Deadline Plugin")
@ -152,34 +160,39 @@ class FusionSubmitDeadlineModel(BaseSettingsModel):
class NukeSubmitDeadlineModel(BaseSettingsModel):
"""Nuke deadline submitter settings."""
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
priority: int = Field(title="Priority")
chunk_size: int = Field(title="Chunk Size")
concurrent_tasks: int = Field(title="Number of concurrent tasks")
group: str = Field(title="Group")
department: str = Field(title="Department")
use_gpu: bool = Field(title="Use GPU")
workfile_dependency: bool = Field(title="Workfile Dependency")
use_published_workfile: bool = Field(title="Use Published Workfile")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Chunk Size")
concurrent_tasks: int = SettingsField(title="Number of concurrent tasks")
group: str = SettingsField(title="Group")
department: str = SettingsField(title="Department")
use_gpu: bool = SettingsField(title="Use GPU")
workfile_dependency: bool = SettingsField(title="Workfile Dependency")
use_published_workfile: bool = SettingsField(
title="Use Published Workfile"
)
env_allowed_keys: list[str] = Field(
env_allowed_keys: list[str] = SettingsField(
default_factory=list,
title="Allowed environment keys"
)
env_search_replace_values: list[EnvSearchReplaceSubmodel] = Field(
env_search_replace_values: list[EnvSearchReplaceSubmodel] = SettingsField(
default_factory=list,
title="Search & replace in environment values",
)
limit_groups: list[LimitGroupsSubmodel] = Field(
limit_groups: list[LimitGroupsSubmodel] = SettingsField(
default_factory=list,
title="Limit Groups",
)
@validator("limit_groups", "env_allowed_keys", "env_search_replace_values")
@validator(
"limit_groups",
"env_allowed_keys",
"env_search_replace_values")
def validate_unique_names(cls, value):
ensure_unique_names(value)
return value
@ -188,58 +201,62 @@ class NukeSubmitDeadlineModel(BaseSettingsModel):
class HarmonySubmitDeadlineModel(BaseSettingsModel):
"""Harmony deadline submitter settings."""
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
use_published: bool = Field(title="Use Published scene")
priority: int = Field(title="Priority")
chunk_size: int = Field(title="Chunk Size")
group: str = Field(title="Group")
department: str = Field(title="Department")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene")
priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Chunk Size")
group: str = SettingsField(title="Group")
department: str = SettingsField(title="Department")
class AfterEffectsSubmitDeadlineModel(BaseSettingsModel):
"""After Effects deadline submitter settings."""
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
use_published: bool = Field(title="Use Published scene")
priority: int = Field(title="Priority")
chunk_size: int = Field(title="Chunk Size")
group: str = Field(title="Group")
department: str = Field(title="Department")
multiprocess: bool = Field(title="Optional")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene")
priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Chunk Size")
group: str = SettingsField(title="Group")
department: str = SettingsField(title="Department")
multiprocess: bool = SettingsField(title="Optional")
class CelactionSubmitDeadlineModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
deadline_department: str = Field("", title="Deadline apartment")
deadline_priority: int = Field(50, title="Deadline priority")
deadline_pool: str = Field("", title="Deadline pool")
deadline_pool_secondary: str = Field("", title="Deadline pool (secondary)")
deadline_group: str = Field("", title="Deadline Group")
deadline_chunk_size: int = Field(10, title="Deadline Chunk size")
deadline_job_delay: str = Field(
enabled: bool = SettingsField(True, title="Enabled")
deadline_department: str = SettingsField("", title="Deadline apartment")
deadline_priority: int = SettingsField(50, title="Deadline priority")
deadline_pool: str = SettingsField("", title="Deadline pool")
deadline_pool_secondary: str = SettingsField(
"", title="Deadline pool (secondary)"
)
deadline_group: str = SettingsField("", title="Deadline Group")
deadline_chunk_size: int = SettingsField(10, title="Deadline Chunk size")
deadline_job_delay: str = SettingsField(
"", title="Delay job (timecode dd:hh:mm:ss)"
)
class BlenderSubmitDeadlineModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
use_published: bool = Field(title="Use Published scene")
priority: int = Field(title="Priority")
chunk_size: int = Field(title="Frame per Task")
group: str = Field("", title="Group Name")
job_delay: str = Field("", title="Delay job (timecode dd:hh:mm:ss)")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene")
priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Frame per Task")
group: str = SettingsField("", title="Group Name")
job_delay: str = SettingsField(
"", title="Delay job (timecode dd:hh:mm:ss)"
)
class AOVFilterSubmodel(BaseSettingsModel):
_layout = "expanded"
name: str = Field(title="Host")
value: list[str] = Field(
name: str = SettingsField(title="Host")
value: list[str] = SettingsField(
default_factory=list,
title="AOV regex"
)
@ -248,29 +265,29 @@ class AOVFilterSubmodel(BaseSettingsModel):
class ProcessCacheJobFarmModel(BaseSettingsModel):
"""Process submitted job on farm."""
enabled: bool = Field(title="Enabled")
deadline_department: str = Field(title="Department")
deadline_pool: str = Field(title="Pool")
deadline_group: str = Field(title="Group")
deadline_chunk_size: int = Field(title="Chunk Size")
deadline_priority: int = Field(title="Priority")
enabled: bool = SettingsField(title="Enabled")
deadline_department: str = SettingsField(title="Department")
deadline_pool: str = SettingsField(title="Pool")
deadline_group: str = SettingsField(title="Group")
deadline_chunk_size: int = SettingsField(title="Chunk Size")
deadline_priority: int = SettingsField(title="Priority")
class ProcessSubmittedJobOnFarmModel(BaseSettingsModel):
"""Process submitted job on farm."""
enabled: bool = Field(title="Enabled")
deadline_department: str = Field(title="Department")
deadline_pool: str = Field(title="Pool")
deadline_group: str = Field(title="Group")
deadline_chunk_size: int = Field(title="Chunk Size")
deadline_priority: int = Field(title="Priority")
publishing_script: str = Field(title="Publishing script path")
skip_integration_repre_list: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
deadline_department: str = SettingsField(title="Department")
deadline_pool: str = SettingsField(title="Pool")
deadline_group: str = SettingsField(title="Group")
deadline_chunk_size: int = SettingsField(title="Chunk Size")
deadline_priority: int = SettingsField(title="Priority")
publishing_script: str = SettingsField(title="Publishing script path")
skip_integration_repre_list: list[str] = SettingsField(
default_factory=list,
title="Skip integration of representation with ext"
)
aov_filter: list[AOVFilterSubmodel] = Field(
aov_filter: list[AOVFilterSubmodel] = SettingsField(
default_factory=list,
title="Reviewable products filter",
)
@ -282,41 +299,44 @@ class ProcessSubmittedJobOnFarmModel(BaseSettingsModel):
class PublishPluginsModel(BaseSettingsModel):
CollectDeadlinePools: CollectDeadlinePoolsModel = Field(
CollectDeadlinePools: CollectDeadlinePoolsModel = SettingsField(
default_factory=CollectDeadlinePoolsModel,
title="Default Pools")
ValidateExpectedFiles: ValidateExpectedFilesModel = Field(
ValidateExpectedFiles: ValidateExpectedFilesModel = SettingsField(
default_factory=ValidateExpectedFilesModel,
title="Validate Expected Files"
)
MayaSubmitDeadline: MayaSubmitDeadlineModel = Field(
MayaSubmitDeadline: MayaSubmitDeadlineModel = SettingsField(
default_factory=MayaSubmitDeadlineModel,
title="Maya Submit to deadline")
MaxSubmitDeadline: MaxSubmitDeadlineModel = Field(
MaxSubmitDeadline: MaxSubmitDeadlineModel = SettingsField(
default_factory=MaxSubmitDeadlineModel,
title="Max Submit to deadline")
FusionSubmitDeadline: FusionSubmitDeadlineModel = Field(
FusionSubmitDeadline: FusionSubmitDeadlineModel = SettingsField(
default_factory=FusionSubmitDeadlineModel,
title="Fusion submit to Deadline")
NukeSubmitDeadline: NukeSubmitDeadlineModel = Field(
NukeSubmitDeadline: NukeSubmitDeadlineModel = SettingsField(
default_factory=NukeSubmitDeadlineModel,
title="Nuke Submit to deadline")
HarmonySubmitDeadline: HarmonySubmitDeadlineModel = Field(
HarmonySubmitDeadline: HarmonySubmitDeadlineModel = SettingsField(
default_factory=HarmonySubmitDeadlineModel,
title="Harmony Submit to deadline")
AfterEffectsSubmitDeadline: AfterEffectsSubmitDeadlineModel = Field(
default_factory=AfterEffectsSubmitDeadlineModel,
title="After Effects to deadline")
CelactionSubmitDeadline: CelactionSubmitDeadlineModel = Field(
AfterEffectsSubmitDeadline: AfterEffectsSubmitDeadlineModel = (
SettingsField(
default_factory=AfterEffectsSubmitDeadlineModel,
title="After Effects to deadline"
)
)
CelactionSubmitDeadline: CelactionSubmitDeadlineModel = SettingsField(
default_factory=CelactionSubmitDeadlineModel,
title="Celaction Submit Deadline")
BlenderSubmitDeadline: BlenderSubmitDeadlineModel = Field(
BlenderSubmitDeadline: BlenderSubmitDeadlineModel = SettingsField(
default_factory=BlenderSubmitDeadlineModel,
title="Blender Submit Deadline")
ProcessSubmittedCacheJobOnFarm: ProcessCacheJobFarmModel = Field(
ProcessSubmittedCacheJobOnFarm: ProcessCacheJobFarmModel = SettingsField(
default_factory=ProcessCacheJobFarmModel,
title="Process submitted cache Job on farm.")
ProcessSubmittedJobOnFarm: ProcessSubmittedJobOnFarmModel = Field(
ProcessSubmittedJobOnFarm: ProcessSubmittedJobOnFarmModel = SettingsField(
default_factory=ProcessSubmittedJobOnFarmModel,
title="Process submitted job on farm.")

View file

@ -1,95 +1,94 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class CreateShotClipModel(BaseSettingsModel):
hierarchy: str = Field(
hierarchy: str = SettingsField(
"shot",
title="Shot parent hierarchy",
section="Shot Hierarchy And Rename Settings"
)
useShotName: bool = Field(
useShotName: bool = SettingsField(
True,
title="Use Shot Name",
)
clipRename: bool = Field(
clipRename: bool = SettingsField(
False,
title="Rename clips",
)
clipName: str = Field(
clipName: str = SettingsField(
"{sequence}{shot}",
title="Clip name template"
)
segmentIndex: bool = Field(
segmentIndex: bool = SettingsField(
True,
title="Accept segment order"
)
countFrom: int = Field(
countFrom: int = SettingsField(
10,
title="Count sequence from"
)
countSteps: int = Field(
countSteps: int = SettingsField(
10,
title="Stepping number"
)
folder: str = Field(
folder: str = SettingsField(
"shots",
title="{folder}",
section="Shot Template Keywords"
)
episode: str = Field(
episode: str = SettingsField(
"ep01",
title="{episode}"
)
sequence: str = Field(
sequence: str = SettingsField(
"a",
title="{sequence}"
)
track: str = Field(
track: str = SettingsField(
"{_track_}",
title="{track}"
)
shot: str = Field(
shot: str = SettingsField(
"####",
title="{shot}"
)
vSyncOn: bool = Field(
vSyncOn: bool = SettingsField(
False,
title="Enable Vertical Sync",
section="Vertical Synchronization Of Attributes"
)
workfileFrameStart: int = Field(
workfileFrameStart: int = SettingsField(
1001,
title="Workfiles Start Frame",
section="Shot Attributes"
)
handleStart: int = Field(
handleStart: int = SettingsField(
10,
title="Handle start (head)"
)
handleEnd: int = Field(
handleEnd: int = SettingsField(
10,
title="Handle end (tail)"
)
includeHandles: bool = Field(
includeHandles: bool = SettingsField(
False,
title="Enable handles including"
)
retimedHandles: bool = Field(
retimedHandles: bool = SettingsField(
True,
title="Enable retimed handles"
)
retimedFramerange: bool = Field(
retimedFramerange: bool = SettingsField(
True,
title="Enable retimed shot frameranges"
)
class CreatePuginsModel(BaseSettingsModel):
CreateShotClip: CreateShotClipModel = Field(
CreateShotClip: CreateShotClipModel = SettingsField(
default_factory=CreateShotClipModel,
title="Create Shot Clip"
)

View file

@ -1,17 +1,21 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -23,24 +27,24 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class ImageIORemappingRulesModel(BaseSettingsModel):
host_native_name: str = Field(
host_native_name: str = SettingsField(
title="Application native colorspace name"
)
ocio_name: str = Field(title="OCIO colorspace name")
ocio_name: str = SettingsField(title="OCIO colorspace name")
class ImageIORemappingModel(BaseSettingsModel):
rules: list[ImageIORemappingRulesModel] = Field(
rules: list[ImageIORemappingRulesModel] = SettingsField(
default_factory=list
)
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
@ -49,30 +53,30 @@ class ImageIOConfigModel(BaseSettingsModel):
class ProfileNamesMappingInputsModel(BaseSettingsModel):
_layout = "expanded"
flameName: str = Field("", title="Flame name")
ocioName: str = Field("", title="OCIO name")
flameName: str = SettingsField("", title="Flame name")
ocioName: str = SettingsField("", title="OCIO name")
class ProfileNamesMappingModel(BaseSettingsModel):
_layout = "expanded"
inputs: list[ProfileNamesMappingInputsModel] = Field(
inputs: list[ProfileNamesMappingInputsModel] = SettingsField(
default_factory=list,
title="Profile names mapping"
)
class ImageIOProjectModel(BaseSettingsModel):
colourPolicy: str = Field(
colourPolicy: str = SettingsField(
"ACES 1.1",
title="Colour Policy (name or path)",
section="Project"
)
frameDepth: str = Field(
frameDepth: str = SettingsField(
"16-bit fp",
title="Image Depth"
)
fieldDominance: str = Field(
fieldDominance: str = SettingsField(
"PROGRESSIVE",
title="Field Dominance"
)
@ -80,18 +84,18 @@ class ImageIOProjectModel(BaseSettingsModel):
class FlameImageIOModel(BaseSettingsModel):
_isGroup = True
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
remapping: ImageIORemappingModel = Field(
remapping: ImageIORemappingModel = SettingsField(
title="Remapping colorspace names",
default_factory=ImageIORemappingModel
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)
@ -99,11 +103,11 @@ class FlameImageIOModel(BaseSettingsModel):
# inconsistency with v3 settings and harder conversion handling
# - it can be moved back but keep in mind that it must be handled in v3
# conversion script too
project: ImageIOProjectModel = Field(
project: ImageIOProjectModel = SettingsField(
default_factory=ImageIOProjectModel,
title="Project"
)
profilesMapping: ProfileNamesMappingModel = Field(
profilesMapping: ProfileNamesMappingModel = SettingsField(
default_factory=ProfileNamesMappingModel,
title="Profile names mapping"
)

View file

@ -1,60 +1,64 @@
from ayon_server.settings import Field, BaseSettingsModel
from ayon_server.settings import SettingsField, BaseSettingsModel
class LoadClipModel(BaseSettingsModel):
enabled: bool = Field(True)
enabled: bool = SettingsField(True)
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
reel_group_name: str = Field(
reel_group_name: str = SettingsField(
"OpenPype_Reels",
title="Reel group name"
)
reel_name: str = Field(
reel_name: str = SettingsField(
"Loaded",
title="Reel name"
)
clip_name_template: str = Field(
clip_name_template: str = SettingsField(
"{folder[name]}_{product[name]}<_{output}>",
title="Clip name template"
)
layer_rename_template: str = Field("", title="Layer name template")
layer_rename_patterns: list[str] = Field(
layer_rename_template: str = SettingsField(
"", title="Layer name template"
)
layer_rename_patterns: list[str] = SettingsField(
default_factory=list,
title="Layer rename patters",
)
class LoadClipBatchModel(BaseSettingsModel):
enabled: bool = Field(True)
product_types: list[str] = Field(
enabled: bool = SettingsField(True)
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
reel_name: str = Field(
reel_name: str = SettingsField(
"OP_LoadedReel",
title="Reel name"
)
clip_name_template: str = Field(
clip_name_template: str = SettingsField(
"{batch}_{folder[name]}_{product[name]}<_{output}>",
title="Clip name template"
)
layer_rename_template: str = Field("", title="Layer name template")
layer_rename_patterns: list[str] = Field(
layer_rename_template: str = SettingsField(
"", title="Layer name template"
)
layer_rename_patterns: list[str] = SettingsField(
default_factory=list,
title="Layer rename patters",
)
class LoaderPluginsModel(BaseSettingsModel):
LoadClip: LoadClipModel = Field(
LoadClip: LoadClipModel = SettingsField(
default_factory=LoadClipModel,
title="Load Clip"
)
LoadClipBatch: LoadClipBatchModel = Field(
LoadClipBatch: LoadClipBatchModel = SettingsField(
default_factory=LoadClipBatchModel,
title="Load as clip to current batch"
)

View file

@ -1,4 +1,4 @@
from ayon_server.settings import Field, BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import FlameImageIOModel, DEFAULT_IMAGEIO_SETTINGS
from .create_plugins import CreatePuginsModel, DEFAULT_CREATE_SETTINGS
@ -7,19 +7,19 @@ from .loader_plugins import LoaderPluginsModel, DEFAULT_LOADER_SETTINGS
class FlameSettings(BaseSettingsModel):
imageio: FlameImageIOModel = Field(
imageio: FlameImageIOModel = SettingsField(
default_factory=FlameImageIOModel,
title="Color Management (ImageIO)"
)
create: CreatePuginsModel = Field(
create: CreatePuginsModel = SettingsField(
default_factory=CreatePuginsModel,
title="Create plugins"
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish plugins"
)
load: LoaderPluginsModel = Field(
load: LoaderPluginsModel = SettingsField(
default_factory=LoaderPluginsModel,
title="Loader plugins"
)

View file

@ -1,10 +1,14 @@
from ayon_server.settings import Field, BaseSettingsModel, task_types_enum
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
task_types_enum,
)
class XMLPresetAttrsFromCommentsModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Attribute name")
type: str = Field(
name: str = SettingsField("", title="Attribute name")
type: str = SettingsField(
default_factory=str,
title="Attribute type",
enum_resolver=lambda: ["number", "float", "string"]
@ -13,13 +17,13 @@ class XMLPresetAttrsFromCommentsModel(BaseSettingsModel):
class AddTasksModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Task name")
type: str = Field(
name: str = SettingsField("", title="Task name")
type: str = SettingsField(
default_factory=str,
title="Task type",
enum_resolver=task_types_enum
)
create_batch_group: bool = Field(
create_batch_group: bool = SettingsField(
True,
title="Create batch group"
)
@ -28,11 +32,13 @@ class AddTasksModel(BaseSettingsModel):
class CollectTimelineInstancesModel(BaseSettingsModel):
_isGroup = True
xml_preset_attrs_from_comments: list[XMLPresetAttrsFromCommentsModel] = Field(
default_factory=list,
title="XML presets attributes parsable from segment comments"
xml_preset_attrs_from_comments: list[XMLPresetAttrsFromCommentsModel] = (
SettingsField(
default_factory=list,
title="XML presets attributes parsable from segment comments"
)
)
add_tasks: list[AddTasksModel] = Field(
add_tasks: list[AddTasksModel] = SettingsField(
default_factory=list,
title="Add tasks"
)
@ -41,22 +47,22 @@ class CollectTimelineInstancesModel(BaseSettingsModel):
class ExportPresetsMappingModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field(
name: str = SettingsField(
...,
title="Name"
)
active: bool = Field(True, title="Is active")
export_type: str = Field(
active: bool = SettingsField(True, title="Is active")
export_type: str = SettingsField(
"File Sequence",
title="Eport clip type",
enum_resolver=lambda: ["Movie", "File Sequence", "Sequence Publish"]
)
ext: str = Field("exr", title="Output extension")
xml_preset_file: str = Field(
ext: str = SettingsField("exr", title="Output extension")
xml_preset_file: str = SettingsField(
"OpenEXR (16-bit fp DWAA).xml",
title="XML preset file (with ext)"
)
colorspace_out: str = Field(
colorspace_out: str = SettingsField(
"ACES - ACEScg",
title="Output color (imageio)"
)
@ -65,31 +71,31 @@ class ExportPresetsMappingModel(BaseSettingsModel):
# created inconsistency with v3 settings and harder conversion handling
# - it can be moved back but keep in mind that it must be handled in v3
# conversion script too
xml_preset_dir: str = Field(
xml_preset_dir: str = SettingsField(
"",
title="XML preset directory"
)
parsed_comment_attrs: bool = Field(
parsed_comment_attrs: bool = SettingsField(
True,
title="Parsed comment attributes"
)
representation_add_range: bool = Field(
representation_add_range: bool = SettingsField(
True,
title="Add range to representation name"
)
representation_tags: list[str] = Field(
representation_tags: list[str] = SettingsField(
default_factory=list,
title="Representation tags"
)
load_to_batch_group: bool = Field(
load_to_batch_group: bool = SettingsField(
True,
title="Load to batch group reel"
)
batch_group_loader_name: str = Field(
batch_group_loader_name: str = SettingsField(
"LoadClipBatch",
title="Use loader name"
)
filter_path_regex: str = Field(
filter_path_regex: str = SettingsField(
".*",
title="Regex in clip path"
)
@ -98,35 +104,35 @@ class ExportPresetsMappingModel(BaseSettingsModel):
class ExtractProductResourcesModel(BaseSettingsModel):
_isGroup = True
keep_original_representation: bool = Field(
keep_original_representation: bool = SettingsField(
False,
title="Publish clip's original media"
)
export_presets_mapping: list[ExportPresetsMappingModel] = Field(
export_presets_mapping: list[ExportPresetsMappingModel] = SettingsField(
default_factory=list,
title="Export presets mapping"
)
class IntegrateBatchGroupModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
False,
title="Enabled"
)
class PublishPuginsModel(BaseSettingsModel):
CollectTimelineInstances: CollectTimelineInstancesModel = Field(
CollectTimelineInstances: CollectTimelineInstancesModel = SettingsField(
default_factory=CollectTimelineInstancesModel,
title="Collect Timeline Instances"
)
ExtractProductResources: ExtractProductResourcesModel = Field(
ExtractProductResources: ExtractProductResourcesModel = SettingsField(
default_factory=ExtractProductResourcesModel,
title="Extract Product Resources"
)
IntegrateBatchGroup: IntegrateBatchGroupModel = Field(
IntegrateBatchGroup: IntegrateBatchGroupModel = SettingsField(
default_factory=IntegrateBatchGroupModel,
title="IntegrateBatchGroup"
)

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class FusionImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,15 +1,15 @@
from pydantic import Field
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
)
from .imageio import FusionImageIOModel
class CopyFusionSettingsModel(BaseSettingsModel):
copy_path: str = Field("", title="Local Fusion profile directory")
copy_status: bool = Field(title="Copy profile on first launch")
force_sync: bool = Field(title="Resync profile on each launch")
copy_path: str = SettingsField("", title="Local Fusion profile directory")
copy_status: bool = SettingsField(title="Copy profile on first launch")
force_sync: bool = SettingsField(title="Resync profile on each launch")
def _create_saver_instance_attributes_enum():
@ -45,40 +45,40 @@ def _frame_range_options_enum():
class CreateSaverPluginModel(BaseSettingsModel):
_isGroup = True
temp_rendering_path_template: str = Field(
temp_rendering_path_template: str = SettingsField(
"", title="Temporary rendering path template"
)
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default variants"
)
instance_attributes: list[str] = Field(
instance_attributes: list[str] = SettingsField(
default_factory=list,
enum_resolver=_create_saver_instance_attributes_enum,
title="Instance attributes"
)
output_formats: list[str] = Field(
output_formats: list[str] = SettingsField(
default_factory=list,
title="Output formats"
)
class HookOptionalModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
True,
title="Enabled"
)
class HooksModel(BaseSettingsModel):
InstallPySideToFusion: HookOptionalModel = Field(
InstallPySideToFusion: HookOptionalModel = SettingsField(
default_factory=HookOptionalModel,
title="Install PySide2"
)
class CreateSaverModel(CreateSaverPluginModel):
default_frame_range_option: str = Field(
default_frame_range_option: str = SettingsField(
default="asset_db",
enum_resolver=_frame_range_options_enum,
title="Default frame range source"
@ -86,17 +86,17 @@ class CreateSaverModel(CreateSaverPluginModel):
class CreateImageSaverModel(CreateSaverPluginModel):
default_frame: int = Field(
default_frame: int = SettingsField(
0,
title="Default rendered frame"
)
class CreatPluginsModel(BaseSettingsModel):
CreateSaver: CreateSaverModel = Field(
CreateSaver: CreateSaverModel = SettingsField(
default_factory=CreateSaverModel,
title="Create Saver",
description="Creator for render product type (eg. sequence)"
)
CreateImageSaver: CreateImageSaverModel = Field(
CreateImageSaver: CreateImageSaverModel = SettingsField(
default_factory=CreateImageSaverModel,
title="Create Image Saver",
description="Creator for image product type (eg. single)"
@ -104,19 +104,19 @@ class CreatPluginsModel(BaseSettingsModel):
class FusionSettings(BaseSettingsModel):
imageio: FusionImageIOModel = Field(
imageio: FusionImageIOModel = SettingsField(
default_factory=FusionImageIOModel,
title="Color Management (ImageIO)"
)
copy_fusion_settings: CopyFusionSettingsModel = Field(
copy_fusion_settings: CopyFusionSettingsModel = SettingsField(
default_factory=CopyFusionSettingsModel,
title="Local Fusion profile settings"
)
hooks: HooksModel = Field(
hooks: HooksModel = SettingsField(
default_factory=HooksModel,
title="Hooks"
)
create: CreatPluginsModel = Field(
create: CreatPluginsModel = SettingsField(
default_factory=CreatPluginsModel,
title="Creator plugins"
)

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,21 +35,21 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class ImageIORemappingRulesModel(BaseSettingsModel):
host_native_name: str = Field(
host_native_name: str = SettingsField(
title="Application native colorspace name"
)
ocio_name: str = Field(title="OCIO colorspace name")
ocio_name: str = SettingsField(title="OCIO colorspace name")
class HarmonyImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import HarmonyImageIOModel
from .publish_plugins import HarmonyPublishPlugins
@ -8,11 +7,11 @@ from .publish_plugins import HarmonyPublishPlugins
class HarmonySettings(BaseSettingsModel):
"""Harmony Project Settings."""
imageio: HarmonyImageIOModel = Field(
imageio: HarmonyImageIOModel = SettingsField(
default_factory=HarmonyImageIOModel,
title="OCIO config"
)
publish: HarmonyPublishPlugins = Field(
publish: HarmonyPublishPlugins = SettingsField(
default_factory=HarmonyPublishPlugins,
title="Publish plugins"
)

View file

@ -1,12 +1,10 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class CollectPalettesPlugin(BaseSettingsModel):
"""Set regular expressions to filter triggering on specific task names. '.*' means on all.""" # noqa
allowed_tasks: list[str] = Field(
allowed_tasks: list[str] = SettingsField(
default_factory=list,
title="Allowed tasks"
)
@ -16,16 +14,16 @@ class ValidateAudioPlugin(BaseSettingsModel):
"""Check if scene contains audio track.""" #
_isGroup = True
enabled: bool = True
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
class ValidateContainersPlugin(BaseSettingsModel):
"""Check if loaded container is scene are latest versions."""
_isGroup = True
enabled: bool = True
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
class ValidateSceneSettingsPlugin(BaseSettingsModel):
@ -34,20 +32,20 @@ class ValidateSceneSettingsPlugin(BaseSettingsModel):
or task names."""
_isGroup = True
enabled: bool = True
optional: bool = Field(False, title="Optional")
active: bool = Field(True, title="Active")
optional: bool = SettingsField(False, title="Optional")
active: bool = SettingsField(True, title="Active")
frame_check_filter: list[str] = Field(
frame_check_filter: list[str] = SettingsField(
default_factory=list,
title="Skip Frame check for Assets with name containing"
)
skip_resolution_check: list[str] = Field(
skip_resolution_check: list[str] = SettingsField(
default_factory=list,
title="Skip Resolution Check for Tasks"
)
skip_timelines_check: list[str] = Field(
skip_timelines_check: list[str] = SettingsField(
default_factory=list,
title="Skip Timeline Check for Tasks"
)
@ -55,22 +53,22 @@ class ValidateSceneSettingsPlugin(BaseSettingsModel):
class HarmonyPublishPlugins(BaseSettingsModel):
CollectPalettes: CollectPalettesPlugin = Field(
CollectPalettes: CollectPalettesPlugin = SettingsField(
title="Collect Palettes",
default_factory=CollectPalettesPlugin,
)
ValidateAudio: ValidateAudioPlugin = Field(
ValidateAudio: ValidateAudioPlugin = SettingsField(
title="Validate Audio",
default_factory=ValidateAudioPlugin,
)
ValidateContainers: ValidateContainersPlugin = Field(
ValidateContainers: ValidateContainersPlugin = SettingsField(
title="Validate Containers",
default_factory=ValidateContainersPlugin,
)
ValidateSceneSettings: ValidateSceneSettingsPlugin = Field(
ValidateSceneSettings: ValidateSceneSettingsPlugin = SettingsField(
title="Validate Scene Settings",
default_factory=ValidateSceneSettingsPlugin,
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.types import (
ColorRGBA_float,
ColorRGB_uint8
@ -9,16 +8,16 @@ from ayon_server.types import (
class Vector2d(BaseSettingsModel):
_layout = "compact"
x: float = Field(1.0, title="X")
y: float = Field(1.0, title="Y")
x: float = SettingsField(1.0, title="X")
y: float = SettingsField(1.0, title="Y")
class Vector3d(BaseSettingsModel):
_layout = "compact"
x: float = Field(1.0, title="X")
y: float = Field(1.0, title="Y")
z: float = Field(1.0, title="Z")
x: float = SettingsField(1.0, title="X")
y: float = SettingsField(1.0, title="Y")
z: float = SettingsField(1.0, title="Z")
def formatable_knob_type_enum():
@ -34,12 +33,12 @@ def formatable_knob_type_enum():
class Formatable(BaseSettingsModel):
_layout = "compact"
template: str = Field(
template: str = SettingsField(
"",
placeholder="""{{key}} or {{key}};{{key}}""",
title="Template"
)
to_type: str = Field(
to_type: str = SettingsField(
"Text",
title="To Knob type",
enum_resolver=formatable_knob_type_enum,
@ -62,37 +61,37 @@ knob_types_enum = [
class KnobModel(BaseSettingsModel):
_layout = "expanded"
type: str = Field(
type: str = SettingsField(
title="Type",
description="Switch between different knob types",
enum_resolver=lambda: knob_types_enum,
conditionalEnum=True
)
name: str = Field(
name: str = SettingsField(
title="Name",
placeholder="Name"
)
text: str = Field("", title="Value")
color_gui: ColorRGB_uint8 = Field(
text: str = SettingsField("", title="Value")
color_gui: ColorRGB_uint8 = SettingsField(
(0, 0, 255),
title="RGB Uint8",
)
boolean: bool = Field(False, title="Value")
number: int = Field(0, title="Value")
decimal_number: float = Field(0.0, title="Value")
vector_2d: Vector2d = Field(
boolean: bool = SettingsField(False, title="Value")
number: int = SettingsField(0, title="Value")
decimal_number: float = SettingsField(0.0, title="Value")
vector_2d: Vector2d = SettingsField(
default_factory=Vector2d,
title="Value"
)
vector_3d: Vector3d = Field(
vector_3d: Vector3d = SettingsField(
default_factory=Vector3d,
title="Value"
)
color: ColorRGBA_float = Field(
color: ColorRGBA_float = SettingsField(
(0.0, 0.0, 1.0, 1.0),
title="RGBA Float"
)
formatable: Formatable = Field(
formatable: Formatable = SettingsField(
default_factory=Formatable,
title="Value"
)

View file

@ -1,75 +1,74 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class CreateShotClipModels(BaseSettingsModel):
hierarchy: str = Field(
hierarchy: str = SettingsField(
"{folder}/{sequence}",
title="Shot parent hierarchy",
section="Shot Hierarchy And Rename Settings"
)
clipRename: bool = Field(
clipRename: bool = SettingsField(
True,
title="Rename clips"
)
clipName: str = Field(
clipName: str = SettingsField(
"{track}{sequence}{shot}",
title="Clip name template"
)
countFrom: int = Field(
countFrom: int = SettingsField(
10,
title="Count sequence from"
)
countSteps: int = Field(
countSteps: int = SettingsField(
10,
title="Stepping number"
)
folder: str = Field(
folder: str = SettingsField(
"shots",
title="{folder}",
section="Shot Template Keywords"
)
episode: str = Field(
episode: str = SettingsField(
"ep01",
title="{episode}"
)
sequence: str = Field(
sequence: str = SettingsField(
"sq01",
title="{sequence}"
)
track: str = Field(
track: str = SettingsField(
"{_track_}",
title="{track}"
)
shot: str = Field(
shot: str = SettingsField(
"sh###",
title="{shot}"
)
vSyncOn: bool = Field(
vSyncOn: bool = SettingsField(
False,
title="Enable Vertical Sync",
section="Vertical Synchronization Of Attributes"
)
workfileFrameStart: int = Field(
workfileFrameStart: int = SettingsField(
1001,
title="Workfiles Start Frame",
section="Shot Attributes"
)
handleStart: int = Field(
handleStart: int = SettingsField(
10,
title="Handle start (head)"
)
handleEnd: int = Field(
handleEnd: int = SettingsField(
10,
title="Handle end (tail)"
)
class CreatorPluginsSettings(BaseSettingsModel):
CreateShotClip: CreateShotClipModels = Field(
CreateShotClip: CreateShotClipModels = SettingsField(
default_factory=CreateShotClipModels,
title="Create Shot Clip"
)

View file

@ -1,17 +1,23 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
class PublishGUIFilterItemModel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: bool = Field(True, title="Active")
name: str = SettingsField(title="Name")
value: bool = SettingsField(True, title="Active")
class PublishGUIFiltersModel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: list[PublishGUIFilterItemModel] = Field(default_factory=list)
name: str = SettingsField(title="Name")
value: list[PublishGUIFilterItemModel] = SettingsField(
default_factory=list
)
@validator("value")
def validate_unique_outputs(cls, value):

View file

@ -1,7 +1,8 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
@ -39,34 +40,34 @@ class WorkfileColorspaceSettings(BaseSettingsModel):
thumbnail_name = thumbnailLut
"""
ocioConfigName: str = Field(
ocioConfigName: str = SettingsField(
title="OpenColorIO Config",
description="Switch between OCIO configs",
enum_resolver=ocio_configs_switcher_enum,
conditionalEnum=True
)
workingSpace: str = Field(
workingSpace: str = SettingsField(
title="Working Space"
)
viewerLut: str = Field(
viewerLut: str = SettingsField(
title="Viewer"
)
eightBitLut: str = Field(
eightBitLut: str = SettingsField(
title="8-bit files"
)
sixteenBitLut: str = Field(
sixteenBitLut: str = SettingsField(
title="16-bit files"
)
logLut: str = Field(
logLut: str = SettingsField(
title="Log files"
)
floatLut: str = Field(
floatLut: str = SettingsField(
title="Float files"
)
thumbnailLut: str = Field(
thumbnailLut: str = SettingsField(
title="Thumnails"
)
monitorOutLut: str = Field(
monitorOutLut: str = SettingsField(
title="Monitor"
)
@ -74,38 +75,38 @@ class WorkfileColorspaceSettings(BaseSettingsModel):
class ClipColorspaceRulesItems(BaseSettingsModel):
_layout = "expanded"
regex: str = Field("", title="Regex expression")
colorspace: str = Field("", title="Colorspace")
regex: str = SettingsField("", title="Regex expression")
colorspace: str = SettingsField("", title="Colorspace")
class RegexInputsModel(BaseSettingsModel):
inputs: list[ClipColorspaceRulesItems] = Field(
inputs: list[ClipColorspaceRulesItems] = SettingsField(
default_factory=list,
title="Inputs"
)
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -119,18 +120,18 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class ImageIOSettings(BaseSettingsModel):
"""Hiero color management project settings. """
_isGroup: bool = True
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)
workfile: WorkfileColorspaceSettings = Field(
workfile: WorkfileColorspaceSettings = SettingsField(
default_factory=WorkfileColorspaceSettings,
title="Workfile"
)
@ -140,7 +141,7 @@ class ImageIOSettings(BaseSettingsModel):
- no need for `inputs` middle part. It can stay
directly on `regex_inputs`
"""
regexInputs: RegexInputsModel = Field(
regexInputs: RegexInputsModel = SettingsField(
default_factory=RegexInputsModel,
title="Assign colorspace to clips via rules"
)

View file

@ -1,23 +1,22 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class LoadClipModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
True,
title="Enabled"
)
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product types"
)
clip_name_template: str = Field(
clip_name_template: str = SettingsField(
title="Clip name template"
)
class LoaderPuginsModel(BaseSettingsModel):
LoadClip: LoadClipModel = Field(
LoadClip: LoadClipModel = SettingsField(
default_factory=LoadClipModel,
title="Load Clip"
)

View file

@ -1,6 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import (
ImageIOSettings,
@ -28,28 +26,28 @@ from .filters import PublishGUIFilterItemModel
class HieroSettings(BaseSettingsModel):
"""Nuke addon settings."""
imageio: ImageIOSettings = Field(
imageio: ImageIOSettings = SettingsField(
default_factory=ImageIOSettings,
title="Color Management (imageio)",
)
create: CreatorPluginsSettings = Field(
create: CreatorPluginsSettings = SettingsField(
default_factory=CreatorPluginsSettings,
title="Creator Plugins",
)
load: LoaderPuginsModel = Field(
load: LoaderPuginsModel = SettingsField(
default_factory=LoaderPuginsModel,
title="Loader plugins"
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish plugins"
)
scriptsmenu: ScriptsmenuSettings = Field(
scriptsmenu: ScriptsmenuSettings = SettingsField(
default_factory=ScriptsmenuSettings,
title="Scripts Menu Definition",
)
filters: list[PublishGUIFilterItemModel] = Field(
filters: list[PublishGUIFilterItemModel] = SettingsField(
default_factory=list
)

View file

@ -1,11 +1,14 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel, ensure_unique_names, normalize_name
BaseSettingsModel,
SettingsField,
ensure_unique_names,
normalize_name,
)
class CollectInstanceVersionModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
True,
title="Enabled"
)
@ -13,8 +16,8 @@ class CollectInstanceVersionModel(BaseSettingsModel):
class CollectClipEffectsDefModel(BaseSettingsModel):
_layout = "expanded"
name: str = Field("", title="Name")
effect_classes: list[str] = Field(
name: str = SettingsField("", title="Name")
effect_classes: list[str] = SettingsField(
default_factory=list, title="Effect Classes"
)
@ -25,7 +28,7 @@ class CollectClipEffectsDefModel(BaseSettingsModel):
class CollectClipEffectsModel(BaseSettingsModel):
effect_categories: list[CollectClipEffectsDefModel] = Field(
effect_categories: list[CollectClipEffectsDefModel] = SettingsField(
default_factory=list, title="Effect Categories"
)
@ -36,22 +39,22 @@ class CollectClipEffectsModel(BaseSettingsModel):
class ExtractReviewCutUpVideoModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
True,
title="Enabled"
)
tags_addition: list[str] = Field(
tags_addition: list[str] = SettingsField(
default_factory=list,
title="Additional tags"
)
class PublishPuginsModel(BaseSettingsModel):
CollectInstanceVersion: CollectInstanceVersionModel = Field(
CollectInstanceVersion: CollectInstanceVersionModel = SettingsField(
default_factory=CollectInstanceVersionModel,
title="Collect Instance Version"
)
CollectClipEffects: CollectClipEffectsModel = Field(
CollectClipEffects: CollectClipEffectsModel = SettingsField(
default_factory=CollectClipEffectsModel,
title="Collect Clip Effects"
)
@ -59,7 +62,7 @@ class PublishPuginsModel(BaseSettingsModel):
Rename class name and plugin name
to match title (it makes more sense)
"""
ExtractReviewCutUpVideo: ExtractReviewCutUpVideoModel = Field(
ExtractReviewCutUpVideo: ExtractReviewCutUpVideoModel = SettingsField(
default_factory=ExtractReviewCutUpVideoModel,
title="Exctract Review Trim"
)

View file

@ -1,16 +1,15 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class ScriptsmenuSubmodel(BaseSettingsModel):
"""Item Definition"""
_isGroup = True
type: str = Field(title="Type")
command: str = Field(title="Command")
sourcetype: str = Field(title="Source Type")
title: str = Field(title="Title")
tooltip: str = Field(title="Tooltip")
type: str = SettingsField(title="Type")
command: str = SettingsField(title="Command")
sourcetype: str = SettingsField(title="Source Type")
title: str = SettingsField(title="Title")
tooltip: str = SettingsField(title="Tooltip")
class ScriptsmenuSettings(BaseSettingsModel):
@ -20,8 +19,8 @@ class ScriptsmenuSettings(BaseSettingsModel):
"""# TODO: enhance settings with host api:
- in api rename key `name` to `menu_name`
"""
name: str = Field(title="Menu name")
definition: list[ScriptsmenuSubmodel] = Field(
name: str = SettingsField(title="Menu name")
definition: list[ScriptsmenuSubmodel] = SettingsField(
default_factory=list,
title="Definition",
description="Scriptmenu Items Definition")

View file

@ -1,92 +1,91 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
# Creator Plugins
class CreatorModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
title="Default Products",
default_factory=list,
)
class CreateArnoldAssModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
title="Default Products",
default_factory=list,
)
ext: str = Field(Title="Extension")
ext: str = SettingsField(Title="Extension")
class CreateStaticMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
static_mesh_prefix: str = Field("S", title="Static Mesh Prefix")
collision_prefixes: list[str] = Field(
static_mesh_prefix: str = SettingsField("S", title="Static Mesh Prefix")
collision_prefixes: list[str] = SettingsField(
default_factory=list,
title="Collision Prefixes"
)
class CreatePluginsModel(BaseSettingsModel):
CreateAlembicCamera: CreatorModel = Field(
CreateAlembicCamera: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Alembic Camera")
CreateArnoldAss: CreateArnoldAssModel = Field(
CreateArnoldAss: CreateArnoldAssModel = SettingsField(
default_factory=CreateArnoldAssModel,
title="Create Arnold Ass")
CreateArnoldRop: CreatorModel = Field(
CreateArnoldRop: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Arnold ROP")
CreateCompositeSequence: CreatorModel = Field(
CreateCompositeSequence: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Composite (Image Sequence)")
CreateHDA: CreatorModel = Field(
CreateHDA: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Houdini Digital Asset")
CreateKarmaROP: CreatorModel = Field(
CreateKarmaROP: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Karma ROP")
CreateMantraIFD: CreatorModel = Field(
CreateMantraIFD: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Mantra IFD")
CreateMantraROP: CreatorModel = Field(
CreateMantraROP: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Mantra ROP")
CreatePointCache: CreatorModel = Field(
CreatePointCache: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create PointCache (Abc)")
CreateBGEO: CreatorModel = Field(
CreateBGEO: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create PointCache (Bgeo)")
CreateRedshiftProxy: CreatorModel = Field(
CreateRedshiftProxy: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Redshift Proxy")
CreateRedshiftROP: CreatorModel = Field(
CreateRedshiftROP: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Redshift ROP")
CreateReview: CreatorModel = Field(
CreateReview: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create Review")
# "-" is not compatible in the new model
CreateStaticMesh: CreateStaticMeshModel = Field(
CreateStaticMesh: CreateStaticMeshModel = SettingsField(
default_factory=CreateStaticMeshModel,
title="Create Static Mesh")
CreateUSD: CreatorModel = Field(
CreateUSD: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create USD (experimental)")
CreateUSDRender: CreatorModel = Field(
CreateUSDRender: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create USD render (experimental)")
CreateVDBCache: CreatorModel = Field(
CreateVDBCache: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create VDB Cache")
CreateVrayROP: CreatorModel = Field(
CreateVrayROP: CreatorModel = SettingsField(
default_factory=CreatorModel,
title="Create VRay ROP")

View file

@ -1,12 +1,11 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class HoudiniVarModel(BaseSettingsModel):
_layout = "expanded"
var: str = Field("", title="Var")
value: str = Field("", title="Value")
is_directory: bool = Field(False, title="Treat as directory")
var: str = SettingsField("", title="Var")
value: str = SettingsField("", title="Value")
is_directory: bool = SettingsField(False, title="Treat as directory")
class UpdateHoudiniVarcontextModel(BaseSettingsModel):
@ -16,20 +15,20 @@ class UpdateHoudiniVarcontextModel(BaseSettingsModel):
it will be ensured the folder exists.
"""
enabled: bool = Field(title="Enabled")
enabled: bool = SettingsField(title="Enabled")
# TODO this was dynamic dictionary '{var: path}'
houdini_vars: list[HoudiniVarModel] = Field(
houdini_vars: list[HoudiniVarModel] = SettingsField(
default_factory=list,
title="Houdini Vars"
)
class GeneralSettingsModel(BaseSettingsModel):
add_self_publish_button: bool = Field(
add_self_publish_button: bool = SettingsField(
False,
title="Add Self Publish Button"
)
update_houdini_var_context: UpdateHoudiniVarcontextModel = Field(
update_houdini_var_context: UpdateHoudiniVarcontextModel = SettingsField(
default_factory=UpdateHoudiniVarcontextModel,
title="Update Houdini Vars on context change"
)

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class HoudiniImageIOModel(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .general import (
GeneralSettingsModel,
DEFAULT_GENERAL_SETTINGS
@ -17,23 +16,23 @@ from .publish import (
class HoudiniSettings(BaseSettingsModel):
general: GeneralSettingsModel = Field(
general: GeneralSettingsModel = SettingsField(
default_factory=GeneralSettingsModel,
title="General"
)
imageio: HoudiniImageIOModel = Field(
imageio: HoudiniImageIOModel = SettingsField(
default_factory=HoudiniImageIOModel,
title="Color Management (ImageIO)"
)
shelves: list[ShelvesModel] = Field(
shelves: list[ShelvesModel] = SettingsField(
default_factory=list,
title="Shelves Manager",
)
create: CreatePluginsModel = Field(
create: CreatePluginsModel = SettingsField(
default_factory=CreatePluginsModel,
title="Creator Plugins",
)
publish: PublishPluginsModel = Field(
publish: PublishPluginsModel = SettingsField(
default_factory=PublishPluginsModel,
title="Publish Plugins",
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
# Publish Plugins
@ -9,64 +8,64 @@ class CollectAssetHandlesModel(BaseSettingsModel):
ignore start and end handles specified in the
asset data for publish instances
"""
use_asset_handles: bool = Field(
use_asset_handles: bool = SettingsField(
title="Use asset handles")
class CollectChunkSizeModel(BaseSettingsModel):
"""Collect Chunk Size."""
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
chunk_size: int = Field(
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
chunk_size: int = SettingsField(
title="Frames Per Task")
class ValidateWorkfilePathsModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
node_types: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
node_types: list[str] = SettingsField(
default_factory=list,
title="Node Types"
)
prohibited_vars: list[str] = Field(
prohibited_vars: list[str] = SettingsField(
default_factory=list,
title="Prohibited Variables"
)
class BasicValidateModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class PublishPluginsModel(BaseSettingsModel):
CollectAssetHandles: CollectAssetHandlesModel = Field(
CollectAssetHandles: CollectAssetHandlesModel = SettingsField(
default_factory=CollectAssetHandlesModel,
title="Collect Asset Handles.",
section="Collectors"
)
CollectChunkSize: CollectChunkSizeModel = Field(
CollectChunkSize: CollectChunkSizeModel = SettingsField(
default_factory=CollectChunkSizeModel,
title="Collect Chunk Size."
)
ValidateContainers: BasicValidateModel = Field(
ValidateContainers: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Latest Containers.",
section="Validators")
ValidateMeshIsStatic: BasicValidateModel = Field(
ValidateMeshIsStatic: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh is Static.")
ValidateReviewColorspace: BasicValidateModel = Field(
ValidateReviewColorspace: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Review Colorspace.")
ValidateSubsetName: BasicValidateModel = Field(
ValidateSubsetName: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Subset Name.")
ValidateUnrealStaticMeshName: BasicValidateModel = Field(
ValidateUnrealStaticMeshName: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Unreal Static Mesh Name.")
ValidateWorkfilePaths: ValidateWorkfilePathsModel = Field(
ValidateWorkfilePaths: ValidateWorkfilePathsModel = SettingsField(
default_factory=ValidateWorkfilePathsModel,
title="Validate workfile paths settings.")

View file

@ -1,37 +1,37 @@
from pydantic import Field
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathModel
)
class ShelfToolsModel(BaseSettingsModel):
"""Name and Script Path are mandatory."""
label: str = Field(title="Name")
script: str = Field(title="Script Path")
icon: str = Field("", title="Icon Path")
help: str = Field("", title="Help text")
label: str = SettingsField(title="Name")
script: str = SettingsField(title="Script Path")
icon: str = SettingsField("", title="Icon Path")
help: str = SettingsField("", title="Help text")
class ShelfDefinitionModel(BaseSettingsModel):
_layout = "expanded"
shelf_name: str = Field(title="Shelf name")
tools_list: list[ShelfToolsModel] = Field(
shelf_name: str = SettingsField(title="Shelf name")
tools_list: list[ShelfToolsModel] = SettingsField(
default_factory=list,
title="Shelf Tools"
)
class AddShelfFileModel(BaseSettingsModel):
shelf_set_source_path: MultiplatformPathModel = Field(
shelf_set_source_path: MultiplatformPathModel = SettingsField(
default_factory=MultiplatformPathModel,
title="Shelf Set Path"
)
class AddSetAndDefinitionsModel(BaseSettingsModel):
shelf_set_name: str = Field("", title="Shelf Set Name")
shelf_definition: list[ShelfDefinitionModel] = Field(
shelf_set_name: str = SettingsField("", title="Shelf Set Name")
shelf_definition: list[ShelfDefinitionModel] = SettingsField(
default_factory=list,
title="Shelves Definitions"
)
@ -51,17 +51,17 @@ def shelves_enum_options():
class ShelvesModel(BaseSettingsModel):
options: str = Field(
options: str = SettingsField(
title="Options",
description="Switch between shelves manager options",
enum_resolver=shelves_enum_options,
conditionalEnum=True
)
add_shelf_file: AddShelfFileModel = Field(
add_shelf_file: AddShelfFileModel = SettingsField(
title="Add a .shelf file",
default_factory=AddShelfFileModel
)
add_set_and_definitions: AddSetAndDefinitionsModel = Field(
add_set_and_definitions: AddSetAndDefinitionsModel = SettingsField(
title="Add Shelf Set Name and Shelves Definitions",
default_factory=AddSetAndDefinitionsModel
)

View file

@ -1,19 +0,0 @@
from typing import Type
from ayon_server.addons import BaseServerAddon
from .version import __version__
from .settings import KitsuSettings, DEFAULT_VALUES
class KitsuAddon(BaseServerAddon):
name = "kitsu"
title = "Kitsu"
version = __version__
settings_model: Type[KitsuSettings] = KitsuSettings
frontend_scopes = {}
services = {}
async def get_default_settings(self):
settings_model_cls = self.get_settings_model()
return settings_model_cls(**DEFAULT_VALUES)

View file

@ -1,112 +0,0 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
class EntityPattern(BaseSettingsModel):
episode: str = Field(title="Episode")
sequence: str = Field(title="Sequence")
shot: str = Field(title="Shot")
def _status_change_cond_enum():
return [
{"value": "equal", "label": "Equal"},
{"value": "not_equal", "label": "Not equal"}
]
class StatusChangeCondition(BaseSettingsModel):
condition: str = Field(
"equal",
enum_resolver=_status_change_cond_enum,
title="Condition"
)
short_name: str = Field("", title="Short name")
class StatusChangeProductTypeRequirementModel(BaseSettingsModel):
condition: str = Field(
"equal",
enum_resolver=_status_change_cond_enum,
title="Condition"
)
product_type: str = Field("", title="Product type")
class StatusChangeConditionsModel(BaseSettingsModel):
status_conditions: list[StatusChangeCondition] = Field(
default_factory=list,
title="Status conditions"
)
product_type_requirements: list[StatusChangeProductTypeRequirementModel] = Field(
default_factory=list,
title="Product type requirements")
class CustomCommentTemplateModel(BaseSettingsModel):
enabled: bool = Field(True)
comment_template: str = Field("", title="Custom comment")
class IntegrateKitsuNotes(BaseSettingsModel):
"""Kitsu supports markdown and here you can create a custom comment template.
You can use data from your publishing instance's data.
"""
set_status_note: bool = Field(title="Set status on note")
note_status_shortname: str = Field(title="Note shortname")
status_change_conditions: StatusChangeConditionsModel = Field(
default_factory=StatusChangeConditionsModel,
title="Status change conditions"
)
custom_comment_template: CustomCommentTemplateModel = Field(
default_factory=CustomCommentTemplateModel,
title="Custom Comment Template",
)
class PublishPlugins(BaseSettingsModel):
IntegrateKitsuNote: IntegrateKitsuNotes = Field(
default_factory=IntegrateKitsuNotes,
title="Integrate Kitsu Note"
)
class KitsuSettings(BaseSettingsModel):
server: str = Field(
"",
title="Kitsu Server",
scope=["studio"],
)
entities_naming_pattern: EntityPattern = Field(
default_factory=EntityPattern,
title="Entities naming pattern",
)
publish: PublishPlugins = Field(
default_factory=PublishPlugins,
title="Publish plugins",
)
DEFAULT_VALUES = {
"entities_naming_pattern": {
"episode": "E##",
"sequence": "SQ##",
"shot": "SH##"
},
"publish": {
"IntegrateKitsuNote": {
"set_status_note": False,
"note_status_shortname": "wfa",
"status_change_conditions": {
"status_conditions": [],
"product_type_requirements": []
},
"custom_comment_template": {
"enabled": False,
"comment_template": "{comment}\n\n| | |\n|--|--|\n| version| `{version}` |\n| product type | `{product[type]}` |\n| name | `{name}` |"
}
}
}
}

View file

@ -1 +0,0 @@
__version__ = "0.1.1"

View file

@ -1,6 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
def image_format_enum():
@ -57,27 +55,27 @@ def anti_aliasing_enum():
class CreateReviewModel(BaseSettingsModel):
review_width: int = Field(1920, title="Review Width")
review_height: int = Field(1080, title="Review Height")
percentSize: float = Field(100.0, title="Percent of Output")
keep_images: bool = Field(False, title="Keep Image Sequences")
image_format: str = Field(
review_width: int = SettingsField(1920, title="Review Width")
review_height: int = SettingsField(1080, title="Review Height")
percentSize: float = SettingsField(100.0, title="Percent of Output")
keep_images: bool = SettingsField(False, title="Keep Image Sequences")
image_format: str = SettingsField(
enum_resolver=image_format_enum,
title="Image Format Options"
)
visual_style: str = Field(
visual_style: str = SettingsField(
enum_resolver=visual_style_enum,
title="Preference"
)
viewport_preset: str = Field(
viewport_preset: str = SettingsField(
enum_resolver=preview_preset_enum,
title="Preview Preset"
)
anti_aliasing: str = Field(
anti_aliasing: str = SettingsField(
enum_resolver=anti_aliasing_enum,
title="Anti-aliasing Quality"
)
vp_texture: bool = Field(True, title="Viewport Texture")
vp_texture: bool = SettingsField(True, title="Viewport Texture")
DEFAULT_CREATE_REVIEW_SETTINGS = {

View file

@ -1,29 +1,29 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.settings.validators import ensure_unique_names
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -35,14 +35,14 @@ class ImageIOFileRulesModel(BaseSettingsModel):
class ImageIOSettings(BaseSettingsModel):
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)

View file

@ -1,5 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from .imageio import ImageIOSettings
from .render_settings import (
RenderSettingsModel, DEFAULT_RENDER_SETTINGS
@ -23,8 +22,8 @@ def unit_scale_enum():
class UnitScaleSettings(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
scene_unit_scale: str = Field(
enabled: bool = SettingsField(True, title="Enabled")
scene_unit_scale: str = SettingsField(
"Centimeters",
title="Scene Unit Scale",
enum_resolver=unit_scale_enum
@ -33,37 +32,37 @@ class UnitScaleSettings(BaseSettingsModel):
class PRTAttributesModel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: str = Field(title="Attribute")
name: str = SettingsField(title="Name")
value: str = SettingsField(title="Attribute")
class PointCloudSettings(BaseSettingsModel):
attribute: list[PRTAttributesModel] = Field(
attribute: list[PRTAttributesModel] = SettingsField(
default_factory=list, title="Channel Attribute")
class MaxSettings(BaseSettingsModel):
unit_scale_settings: UnitScaleSettings = Field(
unit_scale_settings: UnitScaleSettings = SettingsField(
default_factory=UnitScaleSettings,
title="Set Unit Scale"
)
imageio: ImageIOSettings = Field(
imageio: ImageIOSettings = SettingsField(
default_factory=ImageIOSettings,
title="Color Management (ImageIO)"
)
RenderSettings: RenderSettingsModel = Field(
RenderSettings: RenderSettingsModel = SettingsField(
default_factory=RenderSettingsModel,
title="Render Settings"
)
CreateReview: CreateReviewModel = Field(
CreateReview: CreateReviewModel = SettingsField(
default_factory=CreateReviewModel,
title="Create Review"
)
PointCloud: PointCloudSettings = Field(
PointCloud: PointCloudSettings = SettingsField(
default_factory=PointCloudSettings,
title="Point Cloud"
)
publish: PublishersModel = Field(
publish: PublishersModel = SettingsField(
default_factory=PublishersModel,
title="Publish Plugins")

View file

@ -1,13 +1,13 @@
import json
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.exceptions import BadRequestException
class ValidateAttributesModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateAttributes")
attributes: str = Field(
enabled: bool = SettingsField(title="ValidateAttributes")
attributes: str = SettingsField(
"{}", title="Attributes", widget="textarea")
@validator("attributes")
@ -28,64 +28,64 @@ class ValidateAttributesModel(BaseSettingsModel):
class FamilyMappingItemModel(BaseSettingsModel):
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
title="Product Types"
)
plugins: list[str] = Field(
plugins: list[str] = SettingsField(
default_factory=list,
title="Plugins"
)
class ValidateLoadedPluginModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
family_plugins_mapping: list[FamilyMappingItemModel] = Field(
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
family_plugins_mapping: list[FamilyMappingItemModel] = SettingsField(
default_factory=list,
title="Family Plugins Mapping"
)
class BasicValidateModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class PublishersModel(BaseSettingsModel):
ValidateFrameRange: BasicValidateModel = Field(
ValidateFrameRange: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Frame Range",
section="Validators"
)
ValidateAttributes: ValidateAttributesModel = Field(
ValidateAttributes: ValidateAttributesModel = SettingsField(
default_factory=ValidateAttributesModel,
title="Validate Attributes"
)
ValidateLoadedPlugin: ValidateLoadedPluginModel = Field(
ValidateLoadedPlugin: ValidateLoadedPluginModel = SettingsField(
default_factory=ValidateLoadedPluginModel,
title="Validate Loaded Plugin"
)
ExtractModelObj: BasicValidateModel = Field(
ExtractModelObj: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract OBJ",
section="Extractors"
)
ExtractModelFbx: BasicValidateModel = Field(
ExtractModelFbx: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract FBX"
)
ExtractModelUSD: BasicValidateModel = Field(
ExtractModelUSD: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract Geometry (USD)"
)
ExtractModel: BasicValidateModel = Field(
ExtractModel: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract Geometry (Alembic)"
)
ExtractMaxSceneRaw: BasicValidateModel = Field(
ExtractMaxSceneRaw: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Extract Max Scene (Raw)"
)

View file

@ -1,6 +1,4 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
def aov_separators_enum():
@ -26,19 +24,19 @@ def image_format_enum():
class RenderSettingsModel(BaseSettingsModel):
default_render_image_folder: str = Field(
default_render_image_folder: str = SettingsField(
title="Default render image folder"
)
aov_separator: str = Field(
aov_separator: str = SettingsField(
"underscore",
title="AOV Separator character",
enum_resolver=aov_separators_enum
)
image_format: str = Field(
image_format: str = SettingsField(
enum_resolver=image_format_enum,
title="Output Image Format"
)
multipass: bool = Field(title="multipass")
multipass: bool = SettingsField(title="multipass")
DEFAULT_RENDER_SETTINGS = {

View file

@ -1,232 +1,235 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import task_types_enum
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
task_types_enum,
)
class CreateLookModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
make_tx: bool = Field(title="Make tx files")
rs_tex: bool = Field(title="Make Redshift texture files")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
make_tx: bool = SettingsField(title="Make tx files")
rs_tex: bool = SettingsField(title="Make Redshift texture files")
default_variants: list[str] = SettingsField(
default_factory=list, title="Default Products"
)
class BasicCreatorModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
class CreateUnrealStaticMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
static_mesh_prefix: str = Field("S", title="Static Mesh Prefix")
collision_prefixes: list[str] = Field(
static_mesh_prefix: str = SettingsField("S", title="Static Mesh Prefix")
collision_prefixes: list[str] = SettingsField(
default_factory=list,
title="Collision Prefixes"
)
class CreateUnrealSkeletalMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
default_variants: list[str] = SettingsField(
default_factory=list, title="Default Products")
joint_hints: str = Field("jnt_org", title="Joint root hint")
joint_hints: str = SettingsField("jnt_org", title="Joint root hint")
class CreateMultiverseLookModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
publish_mip_map: bool = Field(title="publish_mip_map")
enabled: bool = SettingsField(title="Enabled")
publish_mip_map: bool = SettingsField(title="publish_mip_map")
class BasicExportMeshModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
write_color_sets: bool = SettingsField(title="Write Color Sets")
write_face_sets: bool = SettingsField(title="Write Face Sets")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
class CreateAnimationModel(BaseSettingsModel):
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
include_parent_hierarchy: bool = Field(
write_color_sets: bool = SettingsField(title="Write Color Sets")
write_face_sets: bool = SettingsField(title="Write Face Sets")
include_parent_hierarchy: bool = SettingsField(
title="Include Parent Hierarchy")
include_user_defined_attributes: bool = Field(
include_user_defined_attributes: bool = SettingsField(
title="Include User Defined Attributes")
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
class CreatePointCacheModel(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_user_defined_attributes: bool = Field(
enabled: bool = SettingsField(title="Enabled")
write_color_sets: bool = SettingsField(title="Write Color Sets")
write_face_sets: bool = SettingsField(title="Write Face Sets")
include_user_defined_attributes: bool = SettingsField(
title="Include User Defined Attributes"
)
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
class CreateProxyAlembicModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
write_color_sets: bool = Field(title="Write Color Sets")
write_face_sets: bool = Field(title="Write Face Sets")
default_variants: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
write_color_sets: bool = SettingsField(title="Write Color Sets")
write_face_sets: bool = SettingsField(title="Write Face Sets")
default_variants: list[str] = SettingsField(
default_factory=list,
title="Default Products"
)
class CreateAssModel(BasicCreatorModel):
expandProcedurals: bool = Field(title="Expand Procedurals")
motionBlur: bool = Field(title="Motion Blur")
motionBlurKeys: int = Field(2, title="Motion Blur Keys")
motionBlurLength: float = Field(0.5, title="Motion Blur Length")
maskOptions: bool = Field(title="Mask Options")
maskCamera: bool = Field(title="Mask Camera")
maskLight: bool = Field(title="Mask Light")
maskShape: bool = Field(title="Mask Shape")
maskShader: bool = Field(title="Mask Shader")
maskOverride: bool = Field(title="Mask Override")
maskDriver: bool = Field(title="Mask Driver")
maskFilter: bool = Field(title="Mask Filter")
maskColor_manager: bool = Field(title="Mask Color Manager")
maskOperator: bool = Field(title="Mask Operator")
expandProcedurals: bool = SettingsField(title="Expand Procedurals")
motionBlur: bool = SettingsField(title="Motion Blur")
motionBlurKeys: int = SettingsField(2, title="Motion Blur Keys")
motionBlurLength: float = SettingsField(0.5, title="Motion Blur Length")
maskOptions: bool = SettingsField(title="Mask Options")
maskCamera: bool = SettingsField(title="Mask Camera")
maskLight: bool = SettingsField(title="Mask Light")
maskShape: bool = SettingsField(title="Mask Shape")
maskShader: bool = SettingsField(title="Mask Shader")
maskOverride: bool = SettingsField(title="Mask Override")
maskDriver: bool = SettingsField(title="Mask Driver")
maskFilter: bool = SettingsField(title="Mask Filter")
maskColor_manager: bool = SettingsField(title="Mask Color Manager")
maskOperator: bool = SettingsField(title="Mask Operator")
class CreateReviewModel(BasicCreatorModel):
useMayaTimeline: bool = Field(title="Use Maya Timeline for Frame Range.")
useMayaTimeline: bool = SettingsField(
title="Use Maya Timeline for Frame Range."
)
class CreateVrayProxyModel(BaseSettingsModel):
enabled: bool = Field(True)
vrmesh: bool = Field(title="VrMesh")
alembic: bool = Field(title="Alembic")
default_variants: list[str] = Field(
enabled: bool = SettingsField(True)
vrmesh: bool = SettingsField(title="VrMesh")
alembic: bool = SettingsField(title="Alembic")
default_variants: list[str] = SettingsField(
default_factory=list, title="Default Products")
class CreateMultishotLayout(BasicCreatorModel):
shotParent: str = Field(title="Shot Parent Folder")
groupLoadedAssets: bool = Field(title="Group Loaded Assets")
task_type: list[str] = Field(
shotParent: str = SettingsField(title="Shot Parent Folder")
groupLoadedAssets: bool = SettingsField(title="Group Loaded Assets")
task_type: list[str] = SettingsField(
title="Task types",
enum_resolver=task_types_enum
)
task_name: str = Field(title="Task name (regex)")
task_name: str = SettingsField(title="Task name (regex)")
class CreatorsModel(BaseSettingsModel):
CreateLook: CreateLookModel = Field(
CreateLook: CreateLookModel = SettingsField(
default_factory=CreateLookModel,
title="Create Look"
)
CreateRender: BasicCreatorModel = Field(
CreateRender: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Render"
)
# "-" is not compatible in the new model
CreateUnrealStaticMesh: CreateUnrealStaticMeshModel = Field(
CreateUnrealStaticMesh: CreateUnrealStaticMeshModel = SettingsField(
default_factory=CreateUnrealStaticMeshModel,
title="Create Unreal_Static Mesh"
)
# "-" is not compatible in the new model
CreateUnrealSkeletalMesh: CreateUnrealSkeletalMeshModel = Field(
CreateUnrealSkeletalMesh: CreateUnrealSkeletalMeshModel = SettingsField(
default_factory=CreateUnrealSkeletalMeshModel,
title="Create Unreal_Skeletal Mesh"
)
CreateMultiverseLook: CreateMultiverseLookModel = Field(
CreateMultiverseLook: CreateMultiverseLookModel = SettingsField(
default_factory=CreateMultiverseLookModel,
title="Create Multiverse Look"
)
CreateAnimation: CreateAnimationModel = Field(
CreateAnimation: CreateAnimationModel = SettingsField(
default_factory=CreateAnimationModel,
title="Create Animation"
)
CreateModel: BasicExportMeshModel = Field(
CreateModel: BasicExportMeshModel = SettingsField(
default_factory=BasicExportMeshModel,
title="Create Model"
)
CreatePointCache: CreatePointCacheModel = Field(
CreatePointCache: CreatePointCacheModel = SettingsField(
default_factory=CreatePointCacheModel,
title="Create Point Cache"
)
CreateProxyAlembic: CreateProxyAlembicModel = Field(
CreateProxyAlembic: CreateProxyAlembicModel = SettingsField(
default_factory=CreateProxyAlembicModel,
title="Create Proxy Alembic"
)
CreateMultiverseUsd: BasicCreatorModel = Field(
CreateMultiverseUsd: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Multiverse USD"
)
CreateMultiverseUsdComp: BasicCreatorModel = Field(
CreateMultiverseUsdComp: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Multiverse USD Composition"
)
CreateMultiverseUsdOver: BasicCreatorModel = Field(
CreateMultiverseUsdOver: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Multiverse USD Override"
)
CreateAss: CreateAssModel = Field(
CreateAss: CreateAssModel = SettingsField(
default_factory=CreateAssModel,
title="Create Ass"
)
CreateAssembly: BasicCreatorModel = Field(
CreateAssembly: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Assembly"
)
CreateCamera: BasicCreatorModel = Field(
CreateCamera: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Camera"
)
CreateLayout: BasicCreatorModel = Field(
CreateLayout: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Layout"
)
CreateMayaScene: BasicCreatorModel = Field(
CreateMayaScene: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Maya Scene"
)
CreateRenderSetup: BasicCreatorModel = Field(
CreateRenderSetup: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Render Setup"
)
CreateReview: CreateReviewModel = Field(
CreateReview: CreateReviewModel = SettingsField(
default_factory=CreateReviewModel,
title="Create Review"
)
CreateRig: BasicCreatorModel = Field(
CreateRig: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Rig"
)
CreateSetDress: BasicCreatorModel = Field(
CreateSetDress: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Set Dress"
)
CreateVrayProxy: CreateVrayProxyModel = Field(
CreateVrayProxy: CreateVrayProxyModel = SettingsField(
default_factory=CreateVrayProxyModel,
title="Create VRay Proxy"
)
CreateVRayScene: BasicCreatorModel = Field(
CreateVRayScene: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create VRay Scene"
)
CreateYetiRig: BasicCreatorModel = Field(
CreateYetiRig: BasicCreatorModel = SettingsField(
default_factory=BasicCreatorModel,
title="Create Yeti Rig"
)

View file

@ -1,19 +1,17 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class PluginsModel(BaseSettingsModel):
_layout = "expanded"
enabled: bool = Field(title="Enabled")
name: str = Field("", title="Name")
enabled: bool = SettingsField(title="Enabled")
name: str = SettingsField("", title="Name")
class ExplicitPluginsLoadingModel(BaseSettingsModel):
"""Maya Explicit Plugins Loading."""
_isGroup: bool = True
enabled: bool = Field(title="enabled")
plugins_to_load: list[PluginsModel] = Field(
enabled: bool = SettingsField(title="enabled")
plugins_to_load: list[PluginsModel] = SettingsField(
default_factory=list, title="Plugins To Load"
)

View file

@ -2,32 +2,36 @@
Note: Names were changed to get rid of the versions in class names.
"""
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -44,25 +48,27 @@ class ColorManagementPreferenceV2Model(BaseSettingsModel):
Please migrate all to 'imageio/workfile' and enable it.
"""
enabled: bool = Field(True, title="Use Color Management Preference v2")
enabled: bool = SettingsField(
True, title="Use Color Management Preference v2"
)
renderSpace: str = Field(title="Rendering Space")
displayName: str = Field(title="Display")
viewName: str = Field(title="View")
renderSpace: str = SettingsField(title="Rendering Space")
displayName: str = SettingsField(title="Display")
viewName: str = SettingsField(title="View")
class ColorManagementPreferenceModel(BaseSettingsModel):
"""Color Management Preference (legacy)."""
renderSpace: str = Field(title="Rendering Space")
viewTransform: str = Field(title="Viewer Transform ")
renderSpace: str = SettingsField(title="Rendering Space")
viewTransform: str = SettingsField(title="Viewer Transform ")
class WorkfileImageIOModel(BaseSettingsModel):
enabled: bool = Field(True, title="Enabled")
renderSpace: str = Field(title="Rendering Space")
displayName: str = Field(title="Display")
viewName: str = Field(title="View")
enabled: bool = SettingsField(True, title="Enabled")
renderSpace: str = SettingsField(title="Rendering Space")
displayName: str = SettingsField(title="Display")
viewName: str = SettingsField(title="View")
class ImageIOSettings(BaseSettingsModel):
@ -72,27 +78,29 @@ class ImageIOSettings(BaseSettingsModel):
"""
_isGroup: bool = True
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management"
)
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)
workfile: WorkfileImageIOModel = Field(
workfile: WorkfileImageIOModel = SettingsField(
default_factory=WorkfileImageIOModel,
title="Workfile"
)
# Deprecated
colorManagementPreference_v2: ColorManagementPreferenceV2Model = Field(
default_factory=ColorManagementPreferenceV2Model,
title="DEPRECATED: Color Management Preference v2 (Maya 2022+)"
colorManagementPreference_v2: ColorManagementPreferenceV2Model = (
SettingsField(
default_factory=ColorManagementPreferenceV2Model,
title="DEPRECATED: Color Management Preference v2 (Maya 2022+)"
)
)
colorManagementPreference: ColorManagementPreferenceModel = Field(
colorManagementPreference: ColorManagementPreferenceModel = SettingsField(
default_factory=ColorManagementPreferenceModel,
title="DEPRECATED: Color Management Preference (legacy)"
)

View file

@ -1,24 +1,26 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel, task_types_enum
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
task_types_enum,
)
class IncludeByTaskTypeModel(BaseSettingsModel):
task_type: list[str] = Field(
task_type: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
include_handles: bool = Field(True, title="Include handles")
include_handles: bool = SettingsField(True, title="Include handles")
class IncludeHandlesModel(BaseSettingsModel):
"""Maya dirmap settings."""
# _layout = "expanded"
include_handles_default: bool = Field(
include_handles_default: bool = SettingsField(
True, title="Include handles by default"
)
per_task_type: list[IncludeByTaskTypeModel] = Field(
per_task_type: list[IncludeByTaskTypeModel] = SettingsField(
default_factory=list,
title="Include/exclude handles by task type"
)

View file

@ -1,66 +1,66 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.types import ColorRGBA_uint8
class ColorsSetting(BaseSettingsModel):
model: ColorRGBA_uint8 = Field(
model: ColorRGBA_uint8 = SettingsField(
(209, 132, 30, 1.0), title="Model:")
rig: ColorRGBA_uint8 = Field(
rig: ColorRGBA_uint8 = SettingsField(
(59, 226, 235, 1.0), title="Rig:")
pointcache: ColorRGBA_uint8 = Field(
pointcache: ColorRGBA_uint8 = SettingsField(
(94, 209, 30, 1.0), title="Pointcache:")
animation: ColorRGBA_uint8 = Field(
animation: ColorRGBA_uint8 = SettingsField(
(94, 209, 30, 1.0), title="Animation:")
ass: ColorRGBA_uint8 = Field(
ass: ColorRGBA_uint8 = SettingsField(
(249, 135, 53, 1.0), title="Arnold StandIn:")
camera: ColorRGBA_uint8 = Field(
camera: ColorRGBA_uint8 = SettingsField(
(136, 114, 244, 1.0), title="Camera:")
fbx: ColorRGBA_uint8 = Field(
fbx: ColorRGBA_uint8 = SettingsField(
(215, 166, 255, 1.0), title="FBX:")
mayaAscii: ColorRGBA_uint8 = Field(
mayaAscii: ColorRGBA_uint8 = SettingsField(
(67, 174, 255, 1.0), title="Maya Ascii:")
mayaScene: ColorRGBA_uint8 = Field(
mayaScene: ColorRGBA_uint8 = SettingsField(
(67, 174, 255, 1.0), title="Maya Scene:")
setdress: ColorRGBA_uint8 = Field(
setdress: ColorRGBA_uint8 = SettingsField(
(255, 250, 90, 1.0), title="Set Dress:")
layout: ColorRGBA_uint8 = Field((
layout: ColorRGBA_uint8 = SettingsField((
255, 250, 90, 1.0), title="Layout:")
vdbcache: ColorRGBA_uint8 = Field(
vdbcache: ColorRGBA_uint8 = SettingsField(
(249, 54, 0, 1.0), title="VDB Cache:")
vrayproxy: ColorRGBA_uint8 = Field(
vrayproxy: ColorRGBA_uint8 = SettingsField(
(255, 150, 12, 1.0), title="VRay Proxy:")
vrayscene_layer: ColorRGBA_uint8 = Field(
vrayscene_layer: ColorRGBA_uint8 = SettingsField(
(255, 150, 12, 1.0), title="VRay Scene:")
yeticache: ColorRGBA_uint8 = Field(
yeticache: ColorRGBA_uint8 = SettingsField(
(99, 206, 220, 1.0), title="Yeti Cache:")
yetiRig: ColorRGBA_uint8 = Field(
yetiRig: ColorRGBA_uint8 = SettingsField(
(0, 205, 125, 1.0), title="Yeti Rig:")
class ReferenceLoaderModel(BaseSettingsModel):
namespace: str = Field(title="Namespace")
group_name: str = Field(title="Group name")
display_handle: bool = Field(title="Display Handle On Load References")
namespace: str = SettingsField(title="Namespace")
group_name: str = SettingsField(title="Group name")
display_handle: bool = SettingsField(
title="Display Handle On Load References"
)
class ImportLoaderModel(BaseSettingsModel):
namespace: str = Field(title="Namespace")
group_name: str = Field(title="Group name")
namespace: str = SettingsField(title="Namespace")
group_name: str = SettingsField(title="Group name")
class LoadersModel(BaseSettingsModel):
colors: ColorsSetting = Field(
colors: ColorsSetting = SettingsField(
default_factory=ColorsSetting,
title="Loaded Products Outliner Colors")
reference_loader: ReferenceLoaderModel = Field(
reference_loader: ReferenceLoaderModel = SettingsField(
default_factory=ReferenceLoaderModel,
title="Reference Loader"
)
import_loader: ImportLoaderModel = Field(
import_loader: ImportLoaderModel = SettingsField(
default_factory=ImportLoaderModel,
title="Import Loader"
)

View file

@ -1,5 +1,9 @@
from pydantic import Field, validator
from ayon_server.settings import BaseSettingsModel, ensure_unique_names
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
from .imageio import ImageIOSettings, DEFAULT_IMAGEIO_SETTINGS
from .maya_dirmap import MayaDirmapModel, DEFAULT_MAYA_DIRMAP_SETTINGS
from .include_handles import IncludeHandlesModel, DEFAULT_INCLUDE_HANDLES
@ -19,44 +23,46 @@ from .templated_workfile_settings import (
class ExtMappingItemModel(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Product type")
value: str = Field(title="Extension")
name: str = SettingsField(title="Product type")
value: str = SettingsField(title="Extension")
class MayaSettings(BaseSettingsModel):
"""Maya Project Settings."""
open_workfile_post_initialization: bool = Field(
open_workfile_post_initialization: bool = SettingsField(
True, title="Open Workfile Post Initialization")
explicit_plugins_loading: ExplicitPluginsLoadingModel = Field(
explicit_plugins_loading: ExplicitPluginsLoadingModel = SettingsField(
default_factory=ExplicitPluginsLoadingModel,
title="Explicit Plugins Loading")
imageio: ImageIOSettings = Field(
imageio: ImageIOSettings = SettingsField(
default_factory=ImageIOSettings, title="Color Management (imageio)")
mel_workspace: str = Field(title="Maya MEL Workspace", widget="textarea")
ext_mapping: list[ExtMappingItemModel] = Field(
mel_workspace: str = SettingsField(
title="Maya MEL Workspace", widget="textarea"
)
ext_mapping: list[ExtMappingItemModel] = SettingsField(
default_factory=list, title="Extension Mapping")
maya_dirmap: MayaDirmapModel = Field(
maya_dirmap: MayaDirmapModel = SettingsField(
default_factory=MayaDirmapModel, title="Maya dirmap Settings")
include_handles: IncludeHandlesModel = Field(
include_handles: IncludeHandlesModel = SettingsField(
default_factory=IncludeHandlesModel,
title="Include/Exclude Handles in default playback & render range"
)
scriptsmenu: ScriptsmenuModel = Field(
scriptsmenu: ScriptsmenuModel = SettingsField(
default_factory=ScriptsmenuModel,
title="Scriptsmenu Settings"
)
render_settings: RenderSettingsModel = Field(
render_settings: RenderSettingsModel = SettingsField(
default_factory=RenderSettingsModel, title="Render Settings")
create: CreatorsModel = Field(
create: CreatorsModel = SettingsField(
default_factory=CreatorsModel, title="Creators")
publish: PublishersModel = Field(
publish: PublishersModel = SettingsField(
default_factory=PublishersModel, title="Publishers")
load: LoadersModel = Field(
load: LoadersModel = SettingsField(
default_factory=LoadersModel, title="Loaders")
workfile_build: ProfilesModel = Field(
workfile_build: ProfilesModel = SettingsField(
default_factory=ProfilesModel, title="Workfile Build Settings")
templated_workfile_build: TemplatedProfilesModel = Field(
templated_workfile_build: TemplatedProfilesModel = SettingsField(
default_factory=TemplatedProfilesModel,
title="Templated Workfile Build Settings")

View file

@ -1,14 +1,12 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class MayaDirmapPathsSubmodel(BaseSettingsModel):
_layout = "compact"
source_path: list[str] = Field(
source_path: list[str] = SettingsField(
default_factory=list, title="Source Paths"
)
destination_path: list[str] = Field(
destination_path: list[str] = SettingsField(
default_factory=list, title="Destination Paths"
)
@ -18,13 +16,13 @@ class MayaDirmapModel(BaseSettingsModel):
# _layout = "expanded"
_isGroup: bool = True
enabled: bool = Field(title="enabled")
enabled: bool = SettingsField(title="enabled")
# Use ${} placeholder instead of absolute value of a root in
# referenced filepaths.
use_env_var_as_root: bool = Field(
use_env_var_as_root: bool = SettingsField(
title="Use env var placeholder in referenced paths"
)
paths: MayaDirmapPathsSubmodel = Field(
paths: MayaDirmapPathsSubmodel = SettingsField(
default_factory=MayaDirmapPathsSubmodel,
title="Dirmap Paths"
)

View file

@ -1,7 +1,8 @@
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
task_types_enum,
)
@ -43,36 +44,40 @@ def plugin_objects_default():
class CodecSetting(BaseSettingsModel):
_layout = "expanded"
compression: str = Field("png", title="Encoding")
format: str = Field("image", title="Format")
quality: int = Field(95, title="Quality", ge=0, le=100)
compression: str = SettingsField("png", title="Encoding")
format: str = SettingsField("image", title="Format")
quality: int = SettingsField(95, title="Quality", ge=0, le=100)
class DisplayOptionsSetting(BaseSettingsModel):
_layout = "expanded"
override_display: bool = Field(True, title="Override display options")
background: ColorRGBA_uint8 = Field(
override_display: bool = SettingsField(
True, title="Override display options"
)
background: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Color"
)
displayGradient: bool = Field(True, title="Display background gradient")
backgroundTop: ColorRGBA_uint8 = Field(
displayGradient: bool = SettingsField(
True, title="Display background gradient"
)
backgroundTop: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Top"
)
backgroundBottom: ColorRGBA_uint8 = Field(
backgroundBottom: ColorRGBA_uint8 = SettingsField(
(125, 125, 125, 1.0), title="Background Bottom"
)
class GenericSetting(BaseSettingsModel):
_layout = "expanded"
isolate_view: bool = Field(True, title="Isolate View")
off_screen: bool = Field(True, title="Off Screen")
pan_zoom: bool = Field(False, title="2D Pan/Zoom")
isolate_view: bool = SettingsField(True, title="Isolate View")
off_screen: bool = SettingsField(True, title="Off Screen")
pan_zoom: bool = SettingsField(False, title="2D Pan/Zoom")
class RendererSetting(BaseSettingsModel):
_layout = "expanded"
rendererName: str = Field(
rendererName: str = SettingsField(
"vp2Renderer",
enum_resolver=renderer_enum,
title="Renderer name"
@ -81,100 +86,112 @@ class RendererSetting(BaseSettingsModel):
class ResolutionSetting(BaseSettingsModel):
_layout = "expanded"
width: int = Field(0, title="Width")
height: int = Field(0, title="Height")
width: int = SettingsField(0, title="Width")
height: int = SettingsField(0, title="Height")
class PluginObjectsModel(BaseSettingsModel):
name: str = Field("", title="Name")
value: bool = Field(True, title="Enabled")
name: str = SettingsField("", title="Name")
value: bool = SettingsField(True, title="Enabled")
class ViewportOptionsSetting(BaseSettingsModel):
override_viewport_options: bool = Field(
override_viewport_options: bool = SettingsField(
True, title="Override viewport options"
)
displayLights: str = Field(
displayLights: str = SettingsField(
"default", enum_resolver=displayLights_enum, title="Display Lights"
)
displayTextures: bool = Field(True, title="Display Textures")
textureMaxResolution: int = Field(1024, title="Texture Clamp Resolution")
renderDepthOfField: bool = Field(
displayTextures: bool = SettingsField(True, title="Display Textures")
textureMaxResolution: int = SettingsField(
1024, title="Texture Clamp Resolution"
)
renderDepthOfField: bool = SettingsField(
True, title="Depth of Field", section="Depth of Field"
)
shadows: bool = Field(True, title="Display Shadows")
twoSidedLighting: bool = Field(True, title="Two Sided Lighting")
lineAAEnable: bool = Field(
shadows: bool = SettingsField(True, title="Display Shadows")
twoSidedLighting: bool = SettingsField(True, title="Two Sided Lighting")
lineAAEnable: bool = SettingsField(
True, title="Enable Anti-Aliasing", section="Anti-Aliasing"
)
multiSample: int = Field(8, title="Anti Aliasing Samples")
loadTextures: bool = Field(False, title="Load Textures")
useDefaultMaterial: bool = Field(False, title="Use Default Material")
wireframeOnShaded: bool = Field(False, title="Wireframe On Shaded")
xray: bool = Field(False, title="X-Ray")
jointXray: bool = Field(False, title="X-Ray Joints")
backfaceCulling: bool = Field(False, title="Backface Culling")
ssaoEnable: bool = Field(
multiSample: int = SettingsField(8, title="Anti Aliasing Samples")
loadTextures: bool = SettingsField(False, title="Load Textures")
useDefaultMaterial: bool = SettingsField(
False, title="Use Default Material"
)
wireframeOnShaded: bool = SettingsField(False, title="Wireframe On Shaded")
xray: bool = SettingsField(False, title="X-Ray")
jointXray: bool = SettingsField(False, title="X-Ray Joints")
backfaceCulling: bool = SettingsField(False, title="Backface Culling")
ssaoEnable: bool = SettingsField(
False, title="Screen Space Ambient Occlusion", section="SSAO"
)
ssaoAmount: int = Field(1, title="SSAO Amount")
ssaoRadius: int = Field(16, title="SSAO Radius")
ssaoFilterRadius: int = Field(16, title="SSAO Filter Radius")
ssaoSamples: int = Field(16, title="SSAO Samples")
fogging: bool = Field(False, title="Enable Hardware Fog", section="Fog")
hwFogFalloff: str = Field(
ssaoAmount: int = SettingsField(1, title="SSAO Amount")
ssaoRadius: int = SettingsField(16, title="SSAO Radius")
ssaoFilterRadius: int = SettingsField(16, title="SSAO Filter Radius")
ssaoSamples: int = SettingsField(16, title="SSAO Samples")
fogging: bool = SettingsField(
False, title="Enable Hardware Fog", section="Fog"
)
hwFogFalloff: str = SettingsField(
"0", enum_resolver=hardware_falloff_enum, title="Hardware Falloff"
)
hwFogDensity: float = Field(0.0, title="Fog Density")
hwFogStart: int = Field(0, title="Fog Start")
hwFogEnd: int = Field(100, title="Fog End")
hwFogAlpha: int = Field(0, title="Fog Alpha")
hwFogColorR: float = Field(1.0, title="Fog Color R")
hwFogColorG: float = Field(1.0, title="Fog Color G")
hwFogColorB: float = Field(1.0, title="Fog Color B")
motionBlurEnable: bool = Field(
hwFogDensity: float = SettingsField(0.0, title="Fog Density")
hwFogStart: int = SettingsField(0, title="Fog Start")
hwFogEnd: int = SettingsField(100, title="Fog End")
hwFogAlpha: int = SettingsField(0, title="Fog Alpha")
hwFogColorR: float = SettingsField(1.0, title="Fog Color R")
hwFogColorG: float = SettingsField(1.0, title="Fog Color G")
hwFogColorB: float = SettingsField(1.0, title="Fog Color B")
motionBlurEnable: bool = SettingsField(
False, title="Enable Motion Blur", section="Motion Blur"
)
motionBlurSampleCount: int = Field(8, title="Motion Blur Sample Count")
motionBlurShutterOpenFraction: float = Field(
motionBlurSampleCount: int = SettingsField(
8, title="Motion Blur Sample Count"
)
motionBlurShutterOpenFraction: float = SettingsField(
0.2, title="Shutter Open Fraction"
)
cameras: bool = Field(False, title="Cameras", section="Show")
clipGhosts: bool = Field(False, title="Clip Ghosts")
deformers: bool = Field(False, title="Deformers")
dimensions: bool = Field(False, title="Dimensions")
dynamicConstraints: bool = Field(False, title="Dynamic Constraints")
dynamics: bool = Field(False, title="Dynamics")
fluids: bool = Field(False, title="Fluids")
follicles: bool = Field(False, title="Follicles")
greasePencils: bool = Field(False, title="Grease Pencils")
grid: bool = Field(False, title="Grid")
hairSystems: bool = Field(True, title="Hair Systems")
handles: bool = Field(False, title="Handles")
headsUpDisplay: bool = Field(False, title="HUD")
ikHandles: bool = Field(False, title="IK Handles")
imagePlane: bool = Field(True, title="Image Plane")
joints: bool = Field(False, title="Joints")
lights: bool = Field(False, title="Lights")
locators: bool = Field(False, title="Locators")
manipulators: bool = Field(False, title="Manipulators")
motionTrails: bool = Field(False, title="Motion Trails")
nCloths: bool = Field(False, title="nCloths")
nParticles: bool = Field(False, title="nParticles")
nRigids: bool = Field(False, title="nRigids")
controlVertices: bool = Field(False, title="NURBS CVs")
nurbsCurves: bool = Field(False, title="NURBS Curves")
hulls: bool = Field(False, title="NURBS Hulls")
nurbsSurfaces: bool = Field(False, title="NURBS Surfaces")
particleInstancers: bool = Field(False, title="Particle Instancers")
pivots: bool = Field(False, title="Pivots")
planes: bool = Field(False, title="Planes")
pluginShapes: bool = Field(False, title="Plugin Shapes")
polymeshes: bool = Field(True, title="Polygons")
strokes: bool = Field(False, title="Strokes")
subdivSurfaces: bool = Field(False, title="Subdiv Surfaces")
textures: bool = Field(False, title="Texture Placements")
pluginObjects: list[PluginObjectsModel] = Field(
cameras: bool = SettingsField(False, title="Cameras", section="Show")
clipGhosts: bool = SettingsField(False, title="Clip Ghosts")
deformers: bool = SettingsField(False, title="Deformers")
dimensions: bool = SettingsField(False, title="Dimensions")
dynamicConstraints: bool = SettingsField(
False, title="Dynamic Constraints"
)
dynamics: bool = SettingsField(False, title="Dynamics")
fluids: bool = SettingsField(False, title="Fluids")
follicles: bool = SettingsField(False, title="Follicles")
greasePencils: bool = SettingsField(False, title="Grease Pencils")
grid: bool = SettingsField(False, title="Grid")
hairSystems: bool = SettingsField(True, title="Hair Systems")
handles: bool = SettingsField(False, title="Handles")
headsUpDisplay: bool = SettingsField(False, title="HUD")
ikHandles: bool = SettingsField(False, title="IK Handles")
imagePlane: bool = SettingsField(True, title="Image Plane")
joints: bool = SettingsField(False, title="Joints")
lights: bool = SettingsField(False, title="Lights")
locators: bool = SettingsField(False, title="Locators")
manipulators: bool = SettingsField(False, title="Manipulators")
motionTrails: bool = SettingsField(False, title="Motion Trails")
nCloths: bool = SettingsField(False, title="nCloths")
nParticles: bool = SettingsField(False, title="nParticles")
nRigids: bool = SettingsField(False, title="nRigids")
controlVertices: bool = SettingsField(False, title="NURBS CVs")
nurbsCurves: bool = SettingsField(False, title="NURBS Curves")
hulls: bool = SettingsField(False, title="NURBS Hulls")
nurbsSurfaces: bool = SettingsField(False, title="NURBS Surfaces")
particleInstancers: bool = SettingsField(
False, title="Particle Instancers"
)
pivots: bool = SettingsField(False, title="Pivots")
planes: bool = SettingsField(False, title="Planes")
pluginShapes: bool = SettingsField(False, title="Plugin Shapes")
polymeshes: bool = SettingsField(True, title="Polygons")
strokes: bool = SettingsField(False, title="Strokes")
subdivSurfaces: bool = SettingsField(False, title="Subdiv Surfaces")
textures: bool = SettingsField(False, title="Texture Placements")
pluginObjects: list[PluginObjectsModel] = SettingsField(
default_factory=plugin_objects_default,
title="Plugin Objects"
)
@ -186,67 +203,71 @@ class ViewportOptionsSetting(BaseSettingsModel):
class CameraOptionsSetting(BaseSettingsModel):
displayGateMask: bool = Field(False, title="Display Gate Mask")
displayResolution: bool = Field(False, title="Display Resolution")
displayFilmGate: bool = Field(False, title="Display Film Gate")
displayFieldChart: bool = Field(False, title="Display Field Chart")
displaySafeAction: bool = Field(False, title="Display Safe Action")
displaySafeTitle: bool = Field(False, title="Display Safe Title")
displayFilmPivot: bool = Field(False, title="Display Film Pivot")
displayFilmOrigin: bool = Field(False, title="Display Film Origin")
overscan: int = Field(1.0, title="Overscan")
displayGateMask: bool = SettingsField(False, title="Display Gate Mask")
displayResolution: bool = SettingsField(False, title="Display Resolution")
displayFilmGate: bool = SettingsField(False, title="Display Film Gate")
displayFieldChart: bool = SettingsField(False, title="Display Field Chart")
displaySafeAction: bool = SettingsField(False, title="Display Safe Action")
displaySafeTitle: bool = SettingsField(False, title="Display Safe Title")
displayFilmPivot: bool = SettingsField(False, title="Display Film Pivot")
displayFilmOrigin: bool = SettingsField(False, title="Display Film Origin")
overscan: int = SettingsField(1.0, title="Overscan")
class CapturePresetSetting(BaseSettingsModel):
Codec: CodecSetting = Field(
Codec: CodecSetting = SettingsField(
default_factory=CodecSetting,
title="Codec",
section="Codec")
DisplayOptions: DisplayOptionsSetting = Field(
DisplayOptions: DisplayOptionsSetting = SettingsField(
default_factory=DisplayOptionsSetting,
title="Display Options",
section="Display Options")
Generic: GenericSetting = Field(
Generic: GenericSetting = SettingsField(
default_factory=GenericSetting,
title="Generic",
section="Generic")
Renderer: RendererSetting = Field(
Renderer: RendererSetting = SettingsField(
default_factory=RendererSetting,
title="Renderer",
section="Renderer")
Resolution: ResolutionSetting = Field(
Resolution: ResolutionSetting = SettingsField(
default_factory=ResolutionSetting,
title="Resolution",
section="Resolution")
ViewportOptions: ViewportOptionsSetting = Field(
ViewportOptions: ViewportOptionsSetting = SettingsField(
default_factory=ViewportOptionsSetting,
title="Viewport Options")
CameraOptions: CameraOptionsSetting = Field(
CameraOptions: CameraOptionsSetting = SettingsField(
default_factory=CameraOptionsSetting,
title="Camera Options")
class ProfilesModel(BaseSettingsModel):
_layout = "expanded"
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = Field(default_factory=list, title="Task names")
product_names: list[str] = Field(default_factory=list, title="Products names")
capture_preset: CapturePresetSetting = Field(
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
product_names: list[str] = SettingsField(
default_factory=list, title="Products names"
)
capture_preset: CapturePresetSetting = SettingsField(
default_factory=CapturePresetSetting,
title="Capture Preset"
)
class ExtractPlayblastSetting(BaseSettingsModel):
capture_preset: CapturePresetSetting = Field(
capture_preset: CapturePresetSetting = SettingsField(
default_factory=CapturePresetSetting,
title="DEPRECATED! Please use \"Profiles\" below. Capture Preset"
)
profiles: list[ProfilesModel] = Field(
profiles: list[ProfilesModel] = SettingsField(
default_factory=list,
title="Profiles"
)

View file

@ -1,7 +1,8 @@
import json
from pydantic import Field, validator
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathModel,
ensure_unique_names,
)
@ -35,9 +36,9 @@ def angular_unit_enum():
class BasicValidateModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class ValidateMeshUVSetMap1Model(BasicValidateModel):
@ -51,22 +52,24 @@ class ValidateNoAnimationModel(BasicValidateModel):
class ValidateRigOutSetNodeIdsModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateSkinclusterDeformerSet")
optional: bool = Field(title="Optional")
allow_history_only: bool = Field(title="Allow history only")
enabled: bool = SettingsField(title="ValidateSkinclusterDeformerSet")
optional: bool = SettingsField(title="Optional")
allow_history_only: bool = SettingsField(title="Allow history only")
class ValidateModelNameModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
database: bool = Field(title="Use database shader name definitions")
material_file: MultiplatformPathModel = Field(
enabled: bool = SettingsField(title="Enabled")
database: bool = SettingsField(
title="Use database shader name definitions"
)
material_file: MultiplatformPathModel = SettingsField(
default_factory=MultiplatformPathModel,
title="Material File",
description=(
"Path to material file defining list of material names to check."
)
)
regex: str = Field(
regex: str = SettingsField(
"(.*)_(\\d)*_(?P<shader>.*)_(GEO)",
title="Validation regex",
description=(
@ -74,7 +77,7 @@ class ValidateModelNameModel(BaseSettingsModel):
" named capturing groups:(?P<asset>.*) for Asset name"
)
)
top_level_regex: str = Field(
top_level_regex: str = SettingsField(
".*_GRP",
title="Top level group name regex",
description=(
@ -85,15 +88,15 @@ class ValidateModelNameModel(BaseSettingsModel):
class ValidateModelContentModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
validate_top_group: bool = Field(title="Validate one top group")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
validate_top_group: bool = SettingsField(title="Validate one top group")
class ValidateTransformNamingSuffixModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
SUFFIX_NAMING_TABLE: str = Field(
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
SUFFIX_NAMING_TABLE: str = SettingsField(
"{}",
title="Suffix Naming Tables",
widget="textarea",
@ -118,34 +121,34 @@ class ValidateTransformNamingSuffixModel(BaseSettingsModel):
"The text can't be parsed as json object"
)
return value
ALLOW_IF_NOT_IN_SUFFIX_TABLE: bool = Field(
ALLOW_IF_NOT_IN_SUFFIX_TABLE: bool = SettingsField(
title="Allow if suffix not in table"
)
class CollectMayaRenderModel(BaseSettingsModel):
sync_workfile_version: bool = Field(
sync_workfile_version: bool = SettingsField(
title="Sync render version with workfile"
)
class CollectFbxAnimationModel(BaseSettingsModel):
enabled: bool = Field(title="Collect Fbx Animation")
enabled: bool = SettingsField(title="Collect Fbx Animation")
class CollectFbxCameraModel(BaseSettingsModel):
enabled: bool = Field(title="CollectFbxCamera")
enabled: bool = SettingsField(title="CollectFbxCamera")
class CollectGLTFModel(BaseSettingsModel):
enabled: bool = Field(title="CollectGLTF")
enabled: bool = SettingsField(title="CollectGLTF")
class ValidateFrameRangeModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateFrameRange")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
exclude_product_types: list[str] = Field(
enabled: bool = SettingsField(title="ValidateFrameRange")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
exclude_product_types: list[str] = SettingsField(
default_factory=list,
title="Exclude product types"
)
@ -155,15 +158,18 @@ class ValidateShaderNameModel(BaseSettingsModel):
"""
Shader name regex can use named capture group asset to validate against current asset name.
"""
enabled: bool = Field(title="ValidateShaderName")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
regex: str = Field("(?P<asset>.*)_(.*)_SHD", title="Validation regex")
enabled: bool = SettingsField(title="ValidateShaderName")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
regex: str = SettingsField(
"(?P<asset>.*)_(.*)_SHD",
title="Validation regex"
)
class ValidateAttributesModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateAttributes")
attributes: str = Field(
enabled: bool = SettingsField(title="ValidateAttributes")
attributes: str = SettingsField(
"{}", title="Attributes", widget="textarea")
@validator("attributes")
@ -184,46 +190,50 @@ class ValidateAttributesModel(BaseSettingsModel):
class ValidateLoadedPluginModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateLoadedPlugin")
optional: bool = Field(title="Optional")
whitelist_native_plugins: bool = Field(
enabled: bool = SettingsField(title="ValidateLoadedPlugin")
optional: bool = SettingsField(title="Optional")
whitelist_native_plugins: bool = SettingsField(
title="Whitelist Maya Native Plugins"
)
authorized_plugins: list[str] = Field(
authorized_plugins: list[str] = SettingsField(
default_factory=list, title="Authorized plugins"
)
class ValidateMayaUnitsModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateMayaUnits")
optional: bool = Field(title="Optional")
validate_linear_units: bool = Field(title="Validate linear units")
linear_units: str = Field(
enabled: bool = SettingsField(title="ValidateMayaUnits")
optional: bool = SettingsField(title="Optional")
validate_linear_units: bool = SettingsField(title="Validate linear units")
linear_units: str = SettingsField(
enum_resolver=linear_unit_enum, title="Linear Units"
)
validate_angular_units: bool = Field(title="Validate angular units")
angular_units: str = Field(
validate_angular_units: bool = SettingsField(
title="Validate angular units"
)
angular_units: str = SettingsField(
enum_resolver=angular_unit_enum, title="Angular units"
)
validate_fps: bool = Field(title="Validate fps")
validate_fps: bool = SettingsField(title="Validate fps")
class ValidateUnrealStaticMeshNameModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateUnrealStaticMeshName")
optional: bool = Field(title="Optional")
validate_mesh: bool = Field(title="Validate mesh names")
validate_collision: bool = Field(title="Validate collison names")
enabled: bool = SettingsField(title="ValidateUnrealStaticMeshName")
optional: bool = SettingsField(title="Optional")
validate_mesh: bool = SettingsField(title="Validate mesh names")
validate_collision: bool = SettingsField(title="Validate collison names")
class ValidateCycleErrorModel(BaseSettingsModel):
enabled: bool = Field(title="ValidateCycleError")
optional: bool = Field(title="Optional")
families: list[str] = Field(default_factory=list, title="Families")
enabled: bool = SettingsField(title="ValidateCycleError")
optional: bool = SettingsField(title="Optional")
families: list[str] = SettingsField(
default_factory=list, title="Families"
)
class ValidatePluginPathAttributesAttrModel(BaseSettingsModel):
name: str = Field(title="Node type")
value: str = Field(title="Attribute")
name: str = SettingsField(title="Node type")
value: str = SettingsField(title="Attribute")
class ValidatePluginPathAttributesModel(BaseSettingsModel):
@ -234,9 +244,9 @@ class ValidatePluginPathAttributesModel(BaseSettingsModel):
"""
enabled: bool = True
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
attribute: list[ValidatePluginPathAttributesAttrModel] = Field(
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
attribute: list[ValidatePluginPathAttributesAttrModel] = SettingsField(
default_factory=list,
title="File Attribute"
)
@ -250,66 +260,68 @@ class ValidatePluginPathAttributesModel(BaseSettingsModel):
# Validate Render Setting
class RendererAttributesModel(BaseSettingsModel):
_layout = "compact"
type: str = Field(title="Type")
value: str = Field(title="Value")
type: str = SettingsField(title="Type")
value: str = SettingsField(title="Value")
class ValidateRenderSettingsModel(BaseSettingsModel):
arnold_render_attributes: list[RendererAttributesModel] = Field(
arnold_render_attributes: list[RendererAttributesModel] = SettingsField(
default_factory=list, title="Arnold Render Attributes")
vray_render_attributes: list[RendererAttributesModel] = Field(
vray_render_attributes: list[RendererAttributesModel] = SettingsField(
default_factory=list, title="VRay Render Attributes")
redshift_render_attributes: list[RendererAttributesModel] = Field(
redshift_render_attributes: list[RendererAttributesModel] = SettingsField(
default_factory=list, title="Redshift Render Attributes")
renderman_render_attributes: list[RendererAttributesModel] = Field(
renderman_render_attributes: list[RendererAttributesModel] = SettingsField(
default_factory=list, title="Renderman Render Attributes")
class BasicValidateModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class ValidateCameraContentsModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
validate_shapes: bool = Field(title="Validate presence of shapes")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
validate_shapes: bool = SettingsField(title="Validate presence of shapes")
class ExtractProxyAlembicModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
families: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
families: list[str] = SettingsField(
default_factory=list,
title="Families")
class ExtractAlembicModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
families: list[str] = Field(
enabled: bool = SettingsField(title="Enabled")
families: list[str] = SettingsField(
default_factory=list,
title="Families")
class ExtractObjModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
class ExtractMayaSceneRawModel(BaseSettingsModel):
"""Add loaded instances to those published families:"""
enabled: bool = Field(title="ExtractMayaSceneRaw")
add_for_families: list[str] = Field(default_factory=list, title="Families")
enabled: bool = SettingsField(title="ExtractMayaSceneRaw")
add_for_families: list[str] = SettingsField(
default_factory=list, title="Families"
)
class ExtractCameraAlembicModel(BaseSettingsModel):
"""
List of attributes that will be added to the baked alembic camera. Needs to be written in python list syntax.
"""
enabled: bool = Field(title="ExtractCameraAlembic")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
bake_attributes: str = Field(
enabled: bool = SettingsField(title="ExtractCameraAlembic")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
bake_attributes: str = SettingsField(
"[]", title="Base Attributes", widget="textarea"
)
@ -332,17 +344,19 @@ class ExtractCameraAlembicModel(BaseSettingsModel):
class ExtractGLBModel(BaseSettingsModel):
enabled: bool = True
active: bool = Field(title="Active")
ogsfx_path: str = Field(title="GLSL Shader Directory")
active: bool = SettingsField(title="Active")
ogsfx_path: str = SettingsField(title="GLSL Shader Directory")
class ExtractLookArgsModel(BaseSettingsModel):
argument: str = Field(title="Argument")
parameters: list[str] = Field(default_factory=list, title="Parameters")
argument: str = SettingsField(title="Argument")
parameters: list[str] = SettingsField(
default_factory=list, title="Parameters"
)
class ExtractLookModel(BaseSettingsModel):
maketx_arguments: list[ExtractLookArgsModel] = Field(
maketx_arguments: list[ExtractLookArgsModel] = SettingsField(
default_factory=list,
title="Extra arguments for maketx command line"
)
@ -350,423 +364,437 @@ class ExtractLookModel(BaseSettingsModel):
class ExtractGPUCacheModel(BaseSettingsModel):
enabled: bool = True
families: list[str] = Field(default_factory=list, title="Families")
step: float = Field(1.0, ge=1.0, title="Step")
stepSave: int = Field(1, ge=1, title="Step Save")
optimize: bool = Field(title="Optimize Hierarchy")
optimizationThreshold: int = Field(1, ge=1, title="Optimization Threshold")
optimizeAnimationsForMotionBlur: bool = Field(
families: list[str] = SettingsField(default_factory=list, title="Families")
step: float = SettingsField(1.0, ge=1.0, title="Step")
stepSave: int = SettingsField(1, ge=1, title="Step Save")
optimize: bool = SettingsField(title="Optimize Hierarchy")
optimizationThreshold: int = SettingsField(
1, ge=1, title="Optimization Threshold"
)
optimizeAnimationsForMotionBlur: bool = SettingsField(
title="Optimize Animations For Motion Blur"
)
writeMaterials: bool = Field(title="Write Materials")
useBaseTessellation: bool = Field(title="User Base Tesselation")
writeMaterials: bool = SettingsField(title="Write Materials")
useBaseTessellation: bool = SettingsField(title="User Base Tesselation")
class PublishersModel(BaseSettingsModel):
CollectMayaRender: CollectMayaRenderModel = Field(
CollectMayaRender: CollectMayaRenderModel = SettingsField(
default_factory=CollectMayaRenderModel,
title="Collect Render Layers",
section="Collectors"
)
CollectFbxAnimation: CollectFbxAnimationModel = Field(
CollectFbxAnimation: CollectFbxAnimationModel = SettingsField(
default_factory=CollectFbxAnimationModel,
title="Collect FBX Animation",
)
CollectFbxCamera: CollectFbxCameraModel = Field(
CollectFbxCamera: CollectFbxCameraModel = SettingsField(
default_factory=CollectFbxCameraModel,
title="Collect Camera for FBX export",
)
CollectGLTF: CollectGLTFModel = Field(
CollectGLTF: CollectGLTFModel = SettingsField(
default_factory=CollectGLTFModel,
title="Collect Assets for GLB/GLTF export"
)
ValidateInstanceInContext: BasicValidateModel = Field(
ValidateInstanceInContext: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Instance In Context",
section="Validators"
)
ValidateContainers: BasicValidateModel = Field(
ValidateContainers: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Containers"
)
ValidateFrameRange: ValidateFrameRangeModel = Field(
ValidateFrameRange: ValidateFrameRangeModel = SettingsField(
default_factory=ValidateFrameRangeModel,
title="Validate Frame Range"
)
ValidateShaderName: ValidateShaderNameModel = Field(
ValidateShaderName: ValidateShaderNameModel = SettingsField(
default_factory=ValidateShaderNameModel,
title="Validate Shader Name"
)
ValidateShadingEngine: BasicValidateModel = Field(
ValidateShadingEngine: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Look Shading Engine Naming"
)
ValidateMayaColorSpace: BasicValidateModel = Field(
ValidateMayaColorSpace: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Colorspace"
)
ValidateAttributes: ValidateAttributesModel = Field(
ValidateAttributes: ValidateAttributesModel = SettingsField(
default_factory=ValidateAttributesModel,
title="Validate Attributes"
)
ValidateLoadedPlugin: ValidateLoadedPluginModel = Field(
ValidateLoadedPlugin: ValidateLoadedPluginModel = SettingsField(
default_factory=ValidateLoadedPluginModel,
title="Validate Loaded Plugin"
)
ValidateMayaUnits: ValidateMayaUnitsModel = Field(
ValidateMayaUnits: ValidateMayaUnitsModel = SettingsField(
default_factory=ValidateMayaUnitsModel,
title="Validate Maya Units"
)
ValidateUnrealStaticMeshName: ValidateUnrealStaticMeshNameModel = Field(
default_factory=ValidateUnrealStaticMeshNameModel,
title="Validate Unreal Static Mesh Name"
ValidateUnrealStaticMeshName: ValidateUnrealStaticMeshNameModel = (
SettingsField(
default_factory=ValidateUnrealStaticMeshNameModel,
title="Validate Unreal Static Mesh Name"
)
)
ValidateCycleError: ValidateCycleErrorModel = Field(
ValidateCycleError: ValidateCycleErrorModel = SettingsField(
default_factory=ValidateCycleErrorModel,
title="Validate Cycle Error"
)
ValidatePluginPathAttributes: ValidatePluginPathAttributesModel = Field(
default_factory=ValidatePluginPathAttributesModel,
title="Plug-in Path Attributes"
ValidatePluginPathAttributes: ValidatePluginPathAttributesModel = (
SettingsField(
default_factory=ValidatePluginPathAttributesModel,
title="Plug-in Path Attributes"
)
)
ValidateRenderSettings: ValidateRenderSettingsModel = Field(
ValidateRenderSettings: ValidateRenderSettingsModel = SettingsField(
default_factory=ValidateRenderSettingsModel,
title="Validate Render Settings"
)
ValidateResolution: BasicValidateModel = Field(
ValidateResolution: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Resolution Setting"
)
ValidateCurrentRenderLayerIsRenderable: BasicValidateModel = Field(
default_factory=BasicValidateModel,
title="Validate Current Render Layer Has Renderable Camera"
ValidateCurrentRenderLayerIsRenderable: BasicValidateModel = (
SettingsField(
default_factory=BasicValidateModel,
title="Validate Current Render Layer Has Renderable Camera"
)
)
ValidateGLSLMaterial: BasicValidateModel = Field(
ValidateGLSLMaterial: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate GLSL Material"
)
ValidateGLSLPlugin: BasicValidateModel = Field(
ValidateGLSLPlugin: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate GLSL Plugin"
)
ValidateRenderImageRule: BasicValidateModel = Field(
ValidateRenderImageRule: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Render Image Rule (Workspace)"
)
ValidateRenderNoDefaultCameras: BasicValidateModel = Field(
ValidateRenderNoDefaultCameras: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No Default Cameras Renderable"
)
ValidateRenderSingleCamera: BasicValidateModel = Field(
ValidateRenderSingleCamera: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Render Single Camera "
)
ValidateRenderLayerAOVs: BasicValidateModel = Field(
ValidateRenderLayerAOVs: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Render Passes/AOVs Are Registered"
)
ValidateStepSize: BasicValidateModel = Field(
ValidateStepSize: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Step Size"
)
ValidateVRayDistributedRendering: BasicValidateModel = Field(
ValidateVRayDistributedRendering: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="VRay Distributed Rendering"
)
ValidateVrayReferencedAOVs: BasicValidateModel = Field(
ValidateVrayReferencedAOVs: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="VRay Referenced AOVs"
)
ValidateVRayTranslatorEnabled: BasicValidateModel = Field(
ValidateVRayTranslatorEnabled: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="VRay Translator Settings"
)
ValidateVrayProxy: BasicValidateModel = Field(
ValidateVrayProxy: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="VRay Proxy Settings"
)
ValidateVrayProxyMembers: BasicValidateModel = Field(
ValidateVrayProxyMembers: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="VRay Proxy Members"
)
ValidateYetiRenderScriptCallbacks: BasicValidateModel = Field(
ValidateYetiRenderScriptCallbacks: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Yeti Render Script Callbacks"
)
ValidateYetiRigCacheState: BasicValidateModel = Field(
ValidateYetiRigCacheState: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Yeti Rig Cache State"
)
ValidateYetiRigInputShapesInInstance: BasicValidateModel = Field(
ValidateYetiRigInputShapesInInstance: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Yeti Rig Input Shapes In Instance"
)
ValidateYetiRigSettings: BasicValidateModel = Field(
ValidateYetiRigSettings: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Yeti Rig Settings"
)
# Model - START
ValidateModelName: ValidateModelNameModel = Field(
ValidateModelName: ValidateModelNameModel = SettingsField(
default_factory=ValidateModelNameModel,
title="Validate Model Name",
section="Model",
)
ValidateModelContent: ValidateModelContentModel = Field(
ValidateModelContent: ValidateModelContentModel = SettingsField(
default_factory=ValidateModelContentModel,
title="Validate Model Content",
)
ValidateTransformNamingSuffix: ValidateTransformNamingSuffixModel = Field(
default_factory=ValidateTransformNamingSuffixModel,
title="Validate Transform Naming Suffix",
ValidateTransformNamingSuffix: ValidateTransformNamingSuffixModel = (
SettingsField(
default_factory=ValidateTransformNamingSuffixModel,
title="Validate Transform Naming Suffix",
)
)
ValidateColorSets: BasicValidateModel = Field(
ValidateColorSets: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Color Sets",
)
ValidateMeshHasOverlappingUVs: BasicValidateModel = Field(
ValidateMeshHasOverlappingUVs: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Has Overlapping UVs",
)
ValidateMeshArnoldAttributes: BasicValidateModel = Field(
ValidateMeshArnoldAttributes: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Arnold Attributes",
)
ValidateMeshShaderConnections: BasicValidateModel = Field(
ValidateMeshShaderConnections: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Shader Connections",
)
ValidateMeshSingleUVSet: BasicValidateModel = Field(
ValidateMeshSingleUVSet: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Single UV Set",
)
ValidateMeshHasUVs: BasicValidateModel = Field(
ValidateMeshHasUVs: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Has UVs",
)
ValidateMeshLaminaFaces: BasicValidateModel = Field(
ValidateMeshLaminaFaces: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Lamina Faces",
)
ValidateMeshNgons: BasicValidateModel = Field(
ValidateMeshNgons: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Ngons",
)
ValidateMeshNonManifold: BasicValidateModel = Field(
ValidateMeshNonManifold: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Non-Manifold",
)
ValidateMeshNoNegativeScale: BasicValidateModel = Field(
ValidateMeshNoNegativeScale: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh No Negative Scale",
)
ValidateMeshNonZeroEdgeLength: BasicValidateModel = Field(
ValidateMeshNonZeroEdgeLength: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Edge Length Non Zero",
)
ValidateMeshNormalsUnlocked: BasicValidateModel = Field(
ValidateMeshNormalsUnlocked: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Normals Unlocked",
)
ValidateMeshUVSetMap1: ValidateMeshUVSetMap1Model = Field(
ValidateMeshUVSetMap1: ValidateMeshUVSetMap1Model = SettingsField(
default_factory=ValidateMeshUVSetMap1Model,
title="Validate Mesh UV Set Map 1",
)
ValidateMeshVerticesHaveEdges: BasicValidateModel = Field(
ValidateMeshVerticesHaveEdges: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Mesh Vertices Have Edges",
)
ValidateNoAnimation: ValidateNoAnimationModel = Field(
ValidateNoAnimation: ValidateNoAnimationModel = SettingsField(
default_factory=ValidateNoAnimationModel,
title="Validate No Animation",
)
ValidateNoNamespace: BasicValidateModel = Field(
ValidateNoNamespace: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No Namespace",
)
ValidateNoNullTransforms: BasicValidateModel = Field(
ValidateNoNullTransforms: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No Null Transforms",
)
ValidateNoUnknownNodes: BasicValidateModel = Field(
ValidateNoUnknownNodes: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No Unknown Nodes",
)
ValidateNodeNoGhosting: BasicValidateModel = Field(
ValidateNodeNoGhosting: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Node No Ghosting",
)
ValidateShapeDefaultNames: BasicValidateModel = Field(
ValidateShapeDefaultNames: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Shape Default Names",
)
ValidateShapeRenderStats: BasicValidateModel = Field(
ValidateShapeRenderStats: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Shape Render Stats",
)
ValidateShapeZero: BasicValidateModel = Field(
ValidateShapeZero: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Shape Zero",
)
ValidateTransformZero: BasicValidateModel = Field(
ValidateTransformZero: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Transform Zero",
)
ValidateUniqueNames: BasicValidateModel = Field(
ValidateUniqueNames: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Unique Names",
)
ValidateNoVRayMesh: BasicValidateModel = Field(
ValidateNoVRayMesh: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No V-Ray Proxies (VRayMesh)",
)
ValidateUnrealMeshTriangulated: BasicValidateModel = Field(
ValidateUnrealMeshTriangulated: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate if Mesh is Triangulated",
)
ValidateAlembicVisibleOnly: BasicValidateModel = Field(
ValidateAlembicVisibleOnly: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Alembic Visible Node",
)
ExtractProxyAlembic: ExtractProxyAlembicModel = Field(
ExtractProxyAlembic: ExtractProxyAlembicModel = SettingsField(
default_factory=ExtractProxyAlembicModel,
title="Extract Proxy Alembic",
section="Model Extractors",
)
ExtractAlembic: ExtractAlembicModel = Field(
ExtractAlembic: ExtractAlembicModel = SettingsField(
default_factory=ExtractAlembicModel,
title="Extract Alembic",
)
ExtractObj: ExtractObjModel = Field(
ExtractObj: ExtractObjModel = SettingsField(
default_factory=ExtractObjModel,
title="Extract OBJ"
)
# Model - END
# Rig - START
ValidateRigContents: BasicValidateModel = Field(
ValidateRigContents: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Rig Contents",
section="Rig",
)
ValidateRigJointsHidden: BasicValidateModel = Field(
ValidateRigJointsHidden: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Rig Joints Hidden",
)
ValidateRigControllers: BasicValidateModel = Field(
ValidateRigControllers: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Rig Controllers",
)
ValidateAnimatedReferenceRig: BasicValidateModel = Field(
ValidateAnimatedReferenceRig: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Animated Reference Rig",
)
ValidateAnimationContent: BasicValidateModel = Field(
ValidateAnimationContent: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Animation Content",
)
ValidateOutRelatedNodeIds: BasicValidateModel = Field(
ValidateOutRelatedNodeIds: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Animation Out Set Related Node Ids",
)
ValidateRigControllersArnoldAttributes: BasicValidateModel = Field(
default_factory=BasicValidateModel,
title="Validate Rig Controllers (Arnold Attributes)",
ValidateRigControllersArnoldAttributes: BasicValidateModel = (
SettingsField(
default_factory=BasicValidateModel,
title="Validate Rig Controllers (Arnold Attributes)",
)
)
ValidateSkeletalMeshHierarchy: BasicValidateModel = Field(
ValidateSkeletalMeshHierarchy: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skeletal Mesh Top Node",
)
ValidateSkeletonRigContents: BasicValidateModel = Field(
ValidateSkeletonRigContents: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skeleton Rig Contents"
)
ValidateSkeletonRigControllers: BasicValidateModel = Field(
ValidateSkeletonRigControllers: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skeleton Rig Controllers"
)
ValidateSkinclusterDeformerSet: BasicValidateModel = Field(
ValidateSkinclusterDeformerSet: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skincluster Deformer Relationships",
)
ValidateSkeletonRigOutputIds: BasicValidateModel = Field(
ValidateSkeletonRigOutputIds: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skeleton Rig Output Ids"
)
ValidateSkeletonTopGroupHierarchy: BasicValidateModel = Field(
ValidateSkeletonTopGroupHierarchy: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Skeleton Top Group Hierarchy",
)
ValidateRigOutSetNodeIds: ValidateRigOutSetNodeIdsModel = Field(
ValidateRigOutSetNodeIds: ValidateRigOutSetNodeIdsModel = SettingsField(
default_factory=ValidateRigOutSetNodeIdsModel,
title="Validate Rig Out Set Node Ids",
)
ValidateSkeletonRigOutSetNodeIds: ValidateRigOutSetNodeIdsModel = Field(
default_factory=ValidateRigOutSetNodeIdsModel,
title="Validate Skeleton Rig Out Set Node Ids",
ValidateSkeletonRigOutSetNodeIds: ValidateRigOutSetNodeIdsModel = (
SettingsField(
default_factory=ValidateRigOutSetNodeIdsModel,
title="Validate Skeleton Rig Out Set Node Ids",
)
)
# Rig - END
ValidateCameraAttributes: BasicValidateModel = Field(
ValidateCameraAttributes: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Camera Attributes"
)
ValidateAssemblyName: BasicValidateModel = Field(
ValidateAssemblyName: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Assembly Name"
)
ValidateAssemblyNamespaces: BasicValidateModel = Field(
ValidateAssemblyNamespaces: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Assembly Namespaces"
)
ValidateAssemblyModelTransforms: BasicValidateModel = Field(
ValidateAssemblyModelTransforms: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Assembly Model Transforms"
)
ValidateAssRelativePaths: BasicValidateModel = Field(
ValidateAssRelativePaths: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Ass Relative Paths"
)
ValidateInstancerContent: BasicValidateModel = Field(
ValidateInstancerContent: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Instancer Content"
)
ValidateInstancerFrameRanges: BasicValidateModel = Field(
ValidateInstancerFrameRanges: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Instancer Cache Frame Ranges"
)
ValidateNoDefaultCameras: BasicValidateModel = Field(
ValidateNoDefaultCameras: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate No Default Cameras"
)
ValidateUnrealUpAxis: BasicValidateModel = Field(
ValidateUnrealUpAxis: BasicValidateModel = SettingsField(
default_factory=BasicValidateModel,
title="Validate Unreal Up-Axis Check"
)
ValidateCameraContents: ValidateCameraContentsModel = Field(
ValidateCameraContents: ValidateCameraContentsModel = SettingsField(
default_factory=ValidateCameraContentsModel,
title="Validate Camera Content"
)
ExtractPlayblast: ExtractPlayblastSetting = Field(
ExtractPlayblast: ExtractPlayblastSetting = SettingsField(
default_factory=ExtractPlayblastSetting,
title="Extract Playblast Settings",
section="Extractors"
)
ExtractMayaSceneRaw: ExtractMayaSceneRawModel = Field(
ExtractMayaSceneRaw: ExtractMayaSceneRawModel = SettingsField(
default_factory=ExtractMayaSceneRawModel,
title="Maya Scene(Raw)"
)
ExtractCameraAlembic: ExtractCameraAlembicModel = Field(
ExtractCameraAlembic: ExtractCameraAlembicModel = SettingsField(
default_factory=ExtractCameraAlembicModel,
title="Extract Camera Alembic"
)
ExtractGLB: ExtractGLBModel = Field(
ExtractGLB: ExtractGLBModel = SettingsField(
default_factory=ExtractGLBModel,
title="Extract GLB"
)
ExtractLook: ExtractLookModel = Field(
ExtractLook: ExtractLookModel = SettingsField(
default_factory=ExtractLookModel,
title="Extract Look"
)
ExtractGPUCache: ExtractGPUCacheModel = Field(
ExtractGPUCache: ExtractGPUCacheModel = SettingsField(
default_factory=ExtractGPUCacheModel,
title="Extract GPU Cache",
)

View file

@ -1,7 +1,5 @@
"""Providing models and values for Maya Render Settings."""
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
def aov_separators_enum():
@ -278,22 +276,22 @@ class AdditionalOptionsModel(BaseSettingsModel):
"""Additional Option"""
_layout = "compact"
attribute: str = Field("", title="Attribute name")
value: str = Field("", title="Value")
attribute: str = SettingsField("", title="Attribute name")
value: str = SettingsField("", title="Value")
class ArnoldSettingsModel(BaseSettingsModel):
image_prefix: str = Field(title="Image prefix template")
image_format: str = Field(
image_prefix: str = SettingsField(title="Image prefix template")
image_format: str = SettingsField(
enum_resolver=arnold_image_format_enum, title="Output Image Format")
multilayer_exr: bool = Field(title="Multilayer (exr)")
tiled: bool = Field(title="Tiled (tif, exr)")
aov_list: list[str] = Field(
multilayer_exr: bool = SettingsField(title="Multilayer (exr)")
tiled: bool = SettingsField(title="Tiled (tif, exr)")
aov_list: list[str] = SettingsField(
default_factory=list,
enum_resolver=arnold_aov_list_enum,
title="AOVs to create"
)
additional_options: list[AdditionalOptionsModel] = Field(
additional_options: list[AdditionalOptionsModel] = SettingsField(
default_factory=list,
title="Additional Arnold Options",
description=(
@ -303,25 +301,25 @@ class ArnoldSettingsModel(BaseSettingsModel):
class VraySettingsModel(BaseSettingsModel):
image_prefix: str = Field(title="Image prefix template")
image_prefix: str = SettingsField(title="Image prefix template")
# engine was str because of JSON limitation (key must be string)
engine: str = Field(
engine: str = SettingsField(
enum_resolver=lambda: [
{"label": "V-Ray", "value": "1"},
{"label": "V-Ray GPU", "value": "2"}
],
title="Production Engine"
)
image_format: str = Field(
image_format: str = SettingsField(
enum_resolver=vray_image_output_enum,
title="Output Image Format"
)
aov_list: list[str] = Field(
aov_list: list[str] = SettingsField(
default_factory=list,
enum_resolver=vray_aov_list_enum,
title="AOVs to create"
)
additional_options: list[AdditionalOptionsModel] = Field(
additional_options: list[AdditionalOptionsModel] = SettingsField(
default_factory=list,
title="Additional Vray Options",
description=(
@ -332,29 +330,29 @@ class VraySettingsModel(BaseSettingsModel):
class RedshiftSettingsModel(BaseSettingsModel):
image_prefix: str = Field(title="Image prefix template")
image_prefix: str = SettingsField(title="Image prefix template")
# both engines are using the same enumerator,
# both were originally str because of JSON limitation.
primary_gi_engine: str = Field(
primary_gi_engine: str = SettingsField(
enum_resolver=redshift_engine_enum,
title="Primary GI Engine"
)
secondary_gi_engine: str = Field(
secondary_gi_engine: str = SettingsField(
enum_resolver=redshift_engine_enum,
title="Secondary GI Engine"
)
image_format: str = Field(
image_format: str = SettingsField(
enum_resolver=redshift_image_output_enum,
title="Output Image Format"
)
multilayer_exr: bool = Field(title="Multilayer (exr)")
force_combine: bool = Field(title="Force combine beauty and AOVs")
aov_list: list[str] = Field(
multilayer_exr: bool = SettingsField(title="Multilayer (exr)")
force_combine: bool = SettingsField(title="Force combine beauty and AOVs")
aov_list: list[str] = SettingsField(
default_factory=list,
enum_resolver=redshift_aov_list_enum,
title="AOVs to create"
)
additional_options: list[AdditionalOptionsModel] = Field(
additional_options: list[AdditionalOptionsModel] = SettingsField(
default_factory=list,
title="Additional Vray Options",
description=(
@ -396,61 +394,61 @@ def renderman_sample_filters_enum():
class RendermanSettingsModel(BaseSettingsModel):
image_prefix: str = Field(
image_prefix: str = SettingsField(
"", title="Image prefix template")
image_dir: str = Field(
image_dir: str = SettingsField(
"", title="Image Output Directory")
display_filters: list[str] = Field(
display_filters: list[str] = SettingsField(
default_factory=list,
title="Display Filters",
enum_resolver=renderman_display_filters
)
imageDisplay_dir: str = Field(
imageDisplay_dir: str = SettingsField(
"", title="Image Display Filter Directory")
sample_filters: list[str] = Field(
sample_filters: list[str] = SettingsField(
default_factory=list,
title="Sample Filters",
enum_resolver=renderman_sample_filters_enum
)
cryptomatte_dir: str = Field(
cryptomatte_dir: str = SettingsField(
"", title="Cryptomatte Output Directory")
watermark_dir: str = Field(
watermark_dir: str = SettingsField(
"", title="Watermark Filter Directory")
additional_options: list[AdditionalOptionsModel] = Field(
additional_options: list[AdditionalOptionsModel] = SettingsField(
default_factory=list,
title="Additional Renderer Options"
)
class RenderSettingsModel(BaseSettingsModel):
apply_render_settings: bool = Field(
apply_render_settings: bool = SettingsField(
title="Apply Render Settings on creation"
)
default_render_image_folder: str = Field(
default_render_image_folder: str = SettingsField(
title="Default render image folder"
)
enable_all_lights: bool = Field(
enable_all_lights: bool = SettingsField(
title="Include all lights in Render Setup Layers by default"
)
aov_separator: str = Field(
aov_separator: str = SettingsField(
"underscore",
title="AOV Separator character",
enum_resolver=aov_separators_enum
)
reset_current_frame: bool = Field(
reset_current_frame: bool = SettingsField(
title="Reset Current Frame")
remove_aovs: bool = Field(
remove_aovs: bool = SettingsField(
title="Remove existing AOVs")
arnold_renderer: ArnoldSettingsModel = Field(
arnold_renderer: ArnoldSettingsModel = SettingsField(
default_factory=ArnoldSettingsModel,
title="Arnold Renderer")
vray_renderer: VraySettingsModel = Field(
vray_renderer: VraySettingsModel = SettingsField(
default_factory=VraySettingsModel,
title="Vray Renderer")
redshift_renderer: RedshiftSettingsModel = Field(
redshift_renderer: RedshiftSettingsModel = SettingsField(
default_factory=RedshiftSettingsModel,
title="Redshift Renderer")
renderman_renderer: RendermanSettingsModel = Field(
renderman_renderer: RendermanSettingsModel = SettingsField(
default_factory=RendermanSettingsModel,
title="Renderman Renderer")

View file

@ -1,24 +1,24 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class ScriptsmenuSubmodel(BaseSettingsModel):
"""Item Definition"""
_isGroup = True
type: str = Field(title="Type")
command: str = Field(title="Command")
sourcetype: str = Field(title="Source Type")
title: str = Field(title="Title")
tooltip: str = Field(title="Tooltip")
tags: list[str] = Field(default_factory=list, title="A list of tags")
type: str = SettingsField(title="Type")
command: str = SettingsField(title="Command")
sourcetype: str = SettingsField(title="Source Type")
title: str = SettingsField(title="Title")
tooltip: str = SettingsField(title="Tooltip")
tags: list[str] = SettingsField(
default_factory=list, title="A list of tags"
)
class ScriptsmenuModel(BaseSettingsModel):
_isGroup = True
name: str = Field(title="Menu Name")
definition: list[ScriptsmenuSubmodel] = Field(
name: str = SettingsField(title="Menu Name")
definition: list[ScriptsmenuSubmodel] = SettingsField(
default_factory=list,
title="Menu Definition",
description="Scriptmenu Items Definition"

View file

@ -1,20 +1,25 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel, task_types_enum
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
task_types_enum,
)
class WorkfileBuildProfilesModel(BaseSettingsModel):
_layout = "expanded"
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
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")
task_names: list[str] = SettingsField(
default_factory=list, title="Task names"
)
path: str = SettingsField("", title="Path to template")
class TemplatedProfilesModel(BaseSettingsModel):
profiles: list[WorkfileBuildProfilesModel] = Field(
profiles: list[WorkfileBuildProfilesModel] = SettingsField(
default_factory=list,
title="Profiles"
)

View file

@ -1,38 +1,41 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel, task_types_enum
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
task_types_enum,
)
class ContextItemModel(BaseSettingsModel):
_layout = "expanded"
product_name_filters: list[str] = Field(
product_name_filters: list[str] = SettingsField(
default_factory=list, title="Product name Filters")
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list, title="Product types")
repre_names: list[str] = Field(
repre_names: list[str] = SettingsField(
default_factory=list, title="Repre Names")
loaders: list[str] = Field(
loaders: list[str] = SettingsField(
default_factory=list, title="Loaders")
class WorkfileSettingModel(BaseSettingsModel):
_layout = "expanded"
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
enum_resolver=task_types_enum,
title="Task types")
tasks: list[str] = Field(
tasks: list[str] = SettingsField(
default_factory=list,
title="Task names")
current_context: list[ContextItemModel] = Field(
current_context: list[ContextItemModel] = SettingsField(
default_factory=list,
title="Current Context")
linked_assets: list[ContextItemModel] = Field(
linked_assets: list[ContextItemModel] = SettingsField(
default_factory=list,
title="Linked Assets")
class ProfilesModel(BaseSettingsModel):
profiles: list[WorkfileSettingModel] = Field(
profiles: list[WorkfileSettingModel] = SettingsField(
default_factory=list,
title="Profiles"
)

View file

@ -1,17 +0,0 @@
from typing import Type
from ayon_server.addons import BaseServerAddon
from .version import __version__
from .settings import MusterSettings, DEFAULT_VALUES
class MusterAddon(BaseServerAddon):
name = "muster"
version = __version__
title = "Muster"
settings_model: Type[MusterSettings] = MusterSettings
async def get_default_settings(self):
settings_model_cls = self.get_settings_model()
return settings_model_cls(**DEFAULT_VALUES)

View file

@ -1,41 +0,0 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
class TemplatesMapping(BaseSettingsModel):
_layout = "compact"
name: str = Field(title="Name")
value: int = Field(title="mapping")
class MusterSettings(BaseSettingsModel):
enabled: bool = True
MUSTER_REST_URL: str = Field(
"",
title="Muster Rest URL",
scope=["studio"],
)
templates_mapping: list[TemplatesMapping] = Field(
default_factory=list,
title="Templates mapping",
)
DEFAULT_VALUES = {
"enabled": False,
"MUSTER_REST_URL": "http://127.0.0.1:9890",
"templates_mapping": [
{"name": "file_layers", "value": 7},
{"name": "mentalray", "value": 2},
{"name": "mentalray_sf", "value": 6},
{"name": "redshift", "value": 55},
{"name": "renderman", "value": 29},
{"name": "software", "value": 1},
{"name": "software_sf", "value": 5},
{"name": "turtle", "value": 10},
{"name": "vector", "value": 4},
{"name": "vray", "value": 37},
{"name": "ffmpeg", "value": 48}
]
}

View file

@ -1 +0,0 @@
__version__ = "0.1.1"

View file

@ -1,7 +1,6 @@
import json
from pydantic import Field
from ayon_server.exceptions import BadRequestException
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
from ayon_server.types import (
ColorRGBA_float,
ColorRGB_uint8
@ -27,25 +26,25 @@ def validate_json_dict(value):
class Vector2d(BaseSettingsModel):
_layout = "compact"
x: float = Field(1.0, title="X")
y: float = Field(1.0, title="Y")
x: float = SettingsField(1.0, title="X")
y: float = SettingsField(1.0, title="Y")
class Vector3d(BaseSettingsModel):
_layout = "compact"
x: float = Field(1.0, title="X")
y: float = Field(1.0, title="Y")
z: float = Field(1.0, title="Z")
x: float = SettingsField(1.0, title="X")
y: float = SettingsField(1.0, title="Y")
z: float = SettingsField(1.0, title="Z")
class Box(BaseSettingsModel):
_layout = "compact"
x: float = Field(1.0, title="X")
y: float = Field(1.0, title="Y")
r: float = Field(1.0, title="R")
t: float = Field(1.0, title="T")
x: float = SettingsField(1.0, title="X")
y: float = SettingsField(1.0, title="Y")
r: float = SettingsField(1.0, title="R")
t: float = SettingsField(1.0, title="T")
def formatable_knob_type_enum():
@ -61,12 +60,12 @@ def formatable_knob_type_enum():
class Formatable(BaseSettingsModel):
_layout = "compact"
template: str = Field(
template: str = SettingsField(
"",
placeholder="""{{key}} or {{key}};{{key}}""",
title="Template"
)
to_type: str = Field(
to_type: str = SettingsField(
"Text",
title="To Knob type",
enum_resolver=formatable_knob_type_enum,
@ -91,46 +90,46 @@ knob_types_enum = [
class KnobModel(BaseSettingsModel):
_layout = "expanded"
type: str = Field(
type: str = SettingsField(
title="Type",
description="Switch between different knob types",
enum_resolver=lambda: knob_types_enum,
conditionalEnum=True
)
name: str = Field(
name: str = SettingsField(
title="Name",
placeholder="Name"
)
text: str = Field("", title="Value")
color_gui: ColorRGB_uint8 = Field(
text: str = SettingsField("", title="Value")
color_gui: ColorRGB_uint8 = SettingsField(
(0, 0, 255),
title="RGB Uint8",
)
boolean: bool = Field(False, title="Value")
number: int = Field(0, title="Value")
decimal_number: float = Field(0.0, title="Value")
vector_2d: Vector2d = Field(
boolean: bool = SettingsField(False, title="Value")
number: int = SettingsField(0, title="Value")
decimal_number: float = SettingsField(0.0, title="Value")
vector_2d: Vector2d = SettingsField(
default_factory=Vector2d,
title="Value"
)
vector_3d: Vector3d = Field(
vector_3d: Vector3d = SettingsField(
default_factory=Vector3d,
title="Value"
)
color: ColorRGBA_float = Field(
color: ColorRGBA_float = SettingsField(
(0.0, 0.0, 1.0, 1.0),
title="RGBA Float"
)
box: Box = Field(
box: Box = SettingsField(
default_factory=Box,
title="Value"
)
formatable: Formatable = Field(
formatable: Formatable = SettingsField(
default_factory=Formatable,
title="Formatable"
)
expression: str = Field(
expression: str = SettingsField(
"",
title="Expression"
)

View file

@ -1,6 +1,7 @@
from pydantic import validator, Field
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names
)
from .common import KnobModel
@ -16,20 +17,20 @@ def instance_attributes_enum():
class PrenodeModel(BaseSettingsModel):
name: str = Field(
name: str = SettingsField(
title="Node name"
)
nodeclass: str = Field(
nodeclass: str = SettingsField(
"",
title="Node class"
)
dependent: str = Field(
dependent: str = SettingsField(
"",
title="Incoming dependency"
)
knobs: list[KnobModel] = Field(
knobs: list[KnobModel] = SettingsField(
default_factory=list,
title="Knobs",
)
@ -42,20 +43,20 @@ class PrenodeModel(BaseSettingsModel):
class CreateWriteRenderModel(BaseSettingsModel):
temp_rendering_path_template: str = Field(
temp_rendering_path_template: str = SettingsField(
title="Temporary rendering path template"
)
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
title="Default variants",
default_factory=list
)
instance_attributes: list[str] = Field(
instance_attributes: list[str] = SettingsField(
default_factory=list,
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
prenodes: list[PrenodeModel] = Field(
prenodes: list[PrenodeModel] = SettingsField(
default_factory=list,
title="Preceding nodes",
)
@ -68,20 +69,20 @@ class CreateWriteRenderModel(BaseSettingsModel):
class CreateWritePrerenderModel(BaseSettingsModel):
temp_rendering_path_template: str = Field(
temp_rendering_path_template: str = SettingsField(
title="Temporary rendering path template"
)
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
title="Default variants",
default_factory=list
)
instance_attributes: list[str] = Field(
instance_attributes: list[str] = SettingsField(
default_factory=list,
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
prenodes: list[PrenodeModel] = Field(
prenodes: list[PrenodeModel] = SettingsField(
default_factory=list,
title="Preceding nodes",
)
@ -94,20 +95,20 @@ class CreateWritePrerenderModel(BaseSettingsModel):
class CreateWriteImageModel(BaseSettingsModel):
temp_rendering_path_template: str = Field(
temp_rendering_path_template: str = SettingsField(
title="Temporary rendering path template"
)
default_variants: list[str] = Field(
default_variants: list[str] = SettingsField(
title="Default variants",
default_factory=list
)
instance_attributes: list[str] = Field(
instance_attributes: list[str] = SettingsField(
default_factory=list,
enum_resolver=instance_attributes_enum,
title="Instance attributes"
)
prenodes: list[PrenodeModel] = Field(
prenodes: list[PrenodeModel] = SettingsField(
default_factory=list,
title="Preceding nodes",
)
@ -120,15 +121,15 @@ class CreateWriteImageModel(BaseSettingsModel):
class CreatorPluginsSettings(BaseSettingsModel):
CreateWriteRender: CreateWriteRenderModel = Field(
CreateWriteRender: CreateWriteRenderModel = SettingsField(
default_factory=CreateWriteRenderModel,
title="Create Write Render"
)
CreateWritePrerender: CreateWritePrerenderModel = Field(
CreateWritePrerender: CreateWritePrerenderModel = SettingsField(
default_factory=CreateWritePrerenderModel,
title="Create Write Prerender"
)
CreateWriteImage: CreateWriteImageModel = Field(
CreateWriteImage: CreateWriteImageModel = SettingsField(
default_factory=CreateWriteImageModel,
title="Create Write Image"
)

View file

@ -1,14 +1,13 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class DirmapPathsSubmodel(BaseSettingsModel):
_layout = "compact"
source_path: list[str] = Field(
source_path: list[str] = SettingsField(
default_factory=list,
title="Source Paths"
)
destination_path: list[str] = Field(
destination_path: list[str] = SettingsField(
default_factory=list,
title="Destination Paths"
)
@ -18,8 +17,8 @@ class DirmapSettings(BaseSettingsModel):
"""Nuke color management project settings."""
_isGroup: bool = True
enabled: bool = Field(title="enabled")
paths: DirmapPathsSubmodel = Field(
enabled: bool = SettingsField(title="enabled")
paths: DirmapPathsSubmodel = SettingsField(
default_factory=DirmapPathsSubmodel,
title="Dirmap Paths"
)

View file

@ -1,23 +1,22 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class MenuShortcut(BaseSettingsModel):
"""Nuke general project settings."""
create: str = Field(
create: str = SettingsField(
title="Create..."
)
publish: str = Field(
publish: str = SettingsField(
title="Publish..."
)
load: str = Field(
load: str = SettingsField(
title="Load..."
)
manage: str = Field(
manage: str = SettingsField(
title="Manage..."
)
build_workfile: str = Field(
build_workfile: str = SettingsField(
title="Build Workfile..."
)
@ -25,7 +24,7 @@ class MenuShortcut(BaseSettingsModel):
class GeneralSettings(BaseSettingsModel):
"""Nuke general project settings."""
menu: MenuShortcut = Field(
menu: MenuShortcut = SettingsField(
default_factory=MenuShortcut,
title="Menu Shortcuts",
)

View file

@ -1,52 +1,52 @@
from pydantic import Field
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
MultiplatformPathModel,
MultiplatformPathListModel,
)
class SubGizmoItem(BaseSettingsModel):
title: str = Field(
title: str = SettingsField(
title="Label"
)
sourcetype: str = Field(
sourcetype: str = SettingsField(
title="Type of usage"
)
command: str = Field(
command: str = SettingsField(
title="Python command"
)
icon: str = Field(
icon: str = SettingsField(
title="Icon Path"
)
shortcut: str = Field(
shortcut: str = SettingsField(
title="Hotkey"
)
class GizmoDefinitionItem(BaseSettingsModel):
gizmo_toolbar_path: str = Field(
gizmo_toolbar_path: str = SettingsField(
title="Gizmo Menu"
)
sub_gizmo_list: list[SubGizmoItem] = Field(
sub_gizmo_list: list[SubGizmoItem] = SettingsField(
default_factory=list, title="Sub Gizmo List")
class GizmoItem(BaseSettingsModel):
"""Nuke gizmo item """
toolbar_menu_name: str = Field(
toolbar_menu_name: str = SettingsField(
title="Toolbar Menu Name"
)
gizmo_source_dir: MultiplatformPathListModel = Field(
gizmo_source_dir: MultiplatformPathListModel = SettingsField(
default_factory=MultiplatformPathListModel,
title="Gizmo Directory Path"
)
toolbar_icon_path: MultiplatformPathModel = Field(
toolbar_icon_path: MultiplatformPathModel = SettingsField(
default_factory=MultiplatformPathModel,
title="Toolbar Icon Path"
)
gizmo_definition: list[GizmoDefinitionItem] = Field(
gizmo_definition: list[GizmoDefinitionItem] = SettingsField(
default_factory=list, title="Gizmo Definition")

View file

@ -1,7 +1,8 @@
from typing import Literal
from pydantic import validator, Field
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
)
@ -10,17 +11,17 @@ from .common import KnobModel
class NodesModel(BaseSettingsModel):
_layout = "expanded"
plugins: list[str] = Field(
plugins: list[str] = SettingsField(
default_factory=list,
title="Used in plugins"
)
nuke_node_class: str = Field(
nuke_node_class: str = SettingsField(
title="Nuke Node Class",
)
class RequiredNodesModel(NodesModel):
knobs: list[KnobModel] = Field(
knobs: list[KnobModel] = SettingsField(
default_factory=list,
title="Knobs",
)
@ -33,12 +34,12 @@ class RequiredNodesModel(NodesModel):
class OverrideNodesModel(NodesModel):
subsets: list[str] = Field(
subsets: list[str] = SettingsField(
default_factory=list,
title="Subsets"
)
knobs: list[KnobModel] = Field(
knobs: list[KnobModel] = SettingsField(
default_factory=list,
title="Knobs",
)
@ -51,11 +52,11 @@ class OverrideNodesModel(NodesModel):
class NodesSetting(BaseSettingsModel):
required_nodes: list[RequiredNodesModel] = Field(
required_nodes: list[RequiredNodesModel] = SettingsField(
title="Plugin required",
default_factory=list
)
override_nodes: list[OverrideNodesModel] = Field(
override_nodes: list[OverrideNodesModel] = SettingsField(
title="Plugin's node overrides",
default_factory=list
)
@ -82,21 +83,21 @@ def ocio_configs_switcher_enum():
class WorkfileColorspaceSettings(BaseSettingsModel):
"""Nuke workfile colorspace preset. """
color_management: Literal["Nuke", "OCIO"] = Field(
color_management: Literal["Nuke", "OCIO"] = SettingsField(
title="Color Management Workflow"
)
native_ocio_config: str = Field(
native_ocio_config: str = SettingsField(
title="Native OpenColorIO Config",
description="Switch between native OCIO configs",
enum_resolver=ocio_configs_switcher_enum,
conditionalEnum=True
)
working_space: str = Field(
working_space: str = SettingsField(
title="Working Space"
)
thumbnail_space: str = Field(
thumbnail_space: str = SettingsField(
title="Thumbnail Space"
)
@ -104,44 +105,44 @@ class WorkfileColorspaceSettings(BaseSettingsModel):
class ReadColorspaceRulesItems(BaseSettingsModel):
_layout = "expanded"
regex: str = Field("", title="Regex expression")
colorspace: str = Field("", title="Colorspace")
regex: str = SettingsField("", title="Regex expression")
colorspace: str = SettingsField("", title="Colorspace")
class RegexInputsModel(BaseSettingsModel):
inputs: list[ReadColorspaceRulesItems] = Field(
inputs: list[ReadColorspaceRulesItems] = SettingsField(
default_factory=list,
title="Inputs"
)
class ViewProcessModel(BaseSettingsModel):
viewerProcess: str = Field(
viewerProcess: str = SettingsField(
title="Viewer Process Name"
)
class ImageIOConfigModel(BaseSettingsModel):
override_global_config: bool = Field(
override_global_config: bool = SettingsField(
False,
title="Override global OCIO config"
)
filepath: list[str] = Field(
filepath: list[str] = SettingsField(
default_factory=list,
title="Config path"
)
class ImageIOFileRuleModel(BaseSettingsModel):
name: str = Field("", title="Rule name")
pattern: str = Field("", title="Regex pattern")
colorspace: str = Field("", title="Colorspace name")
ext: str = Field("", title="File extension")
name: str = SettingsField("", title="Rule name")
pattern: str = SettingsField("", title="Regex pattern")
colorspace: str = SettingsField("", title="Colorspace name")
ext: str = SettingsField("", title="File extension")
class ImageIOFileRulesModel(BaseSettingsModel):
activate_host_rules: bool = Field(False)
rules: list[ImageIOFileRuleModel] = Field(
activate_host_rules: bool = SettingsField(False)
rules: list[ImageIOFileRuleModel] = SettingsField(
default_factory=list,
title="Rules"
)
@ -162,17 +163,17 @@ class ImageIOSettings(BaseSettingsModel):
now: nuke/imageio/viewer/viewerProcess
future: nuke/imageio/viewer
"""
activate_host_color_management: bool = Field(
activate_host_color_management: bool = SettingsField(
True, title="Enable Color Management")
ocio_config: ImageIOConfigModel = Field(
ocio_config: ImageIOConfigModel = SettingsField(
default_factory=ImageIOConfigModel,
title="OCIO config"
)
file_rules: ImageIOFileRulesModel = Field(
file_rules: ImageIOFileRulesModel = SettingsField(
default_factory=ImageIOFileRulesModel,
title="File Rules"
)
viewer: ViewProcessModel = Field(
viewer: ViewProcessModel = SettingsField(
default_factory=ViewProcessModel,
title="Viewer",
description="""Viewer profile is used during
@ -185,19 +186,19 @@ class ImageIOSettings(BaseSettingsModel):
now: nuke/imageio/baking/viewerProcess
future: nuke/imageio/baking
"""
baking: ViewProcessModel = Field(
baking: ViewProcessModel = SettingsField(
default_factory=ViewProcessModel,
title="Baking",
description="""Baking profile is used during
publishing baked colorspace data at knob viewerProcess"""
)
workfile: WorkfileColorspaceSettings = Field(
workfile: WorkfileColorspaceSettings = SettingsField(
default_factory=WorkfileColorspaceSettings,
title="Workfile"
)
nodes: NodesSetting = Field(
nodes: NodesSetting = SettingsField(
default_factory=NodesSetting,
title="Nodes"
)
@ -205,7 +206,7 @@ class ImageIOSettings(BaseSettingsModel):
- [ ] no need for `inputs` middle part. It can stay
directly on `regex_inputs`
"""
regex_inputs: RegexInputsModel = Field(
regex_inputs: RegexInputsModel = SettingsField(
default_factory=RegexInputsModel,
title="Assign colorspace to read nodes via rules"
)

View file

@ -1,54 +1,53 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class LoadImageModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
title="Enabled"
)
representations_include: list[str] = Field(
representations_include: list[str] = SettingsField(
default_factory=list,
title="Include representations"
)
node_name_template: str = Field(
node_name_template: str = SettingsField(
title="Read node name template"
)
class LoadClipOptionsModel(BaseSettingsModel):
start_at_workfile: bool = Field(
start_at_workfile: bool = SettingsField(
title="Start at workfile's start frame"
)
add_retime: bool = Field(
add_retime: bool = SettingsField(
title="Add retime"
)
class LoadClipModel(BaseSettingsModel):
enabled: bool = Field(
enabled: bool = SettingsField(
title="Enabled"
)
representations_include: list[str] = Field(
representations_include: list[str] = SettingsField(
default_factory=list,
title="Include representations"
)
node_name_template: str = Field(
node_name_template: str = SettingsField(
title="Read node name template"
)
options_defaults: LoadClipOptionsModel = Field(
options_defaults: LoadClipOptionsModel = SettingsField(
default_factory=LoadClipOptionsModel,
title="Loader option defaults"
)
class LoaderPuginsModel(BaseSettingsModel):
LoadImage: LoadImageModel = Field(
LoadImage: LoadImageModel = SettingsField(
default_factory=LoadImageModel,
title="Load Image"
)
LoadClip: LoadClipModel = Field(
LoadClip: LoadClipModel = SettingsField(
default_factory=LoadClipModel,
title="Load Clip"
)

View file

@ -1,7 +1,6 @@
from pydantic import validator, Field
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names
)
@ -49,50 +48,50 @@ from .templated_workfile_build import (
class NukeSettings(BaseSettingsModel):
"""Nuke addon settings."""
general: GeneralSettings = Field(
general: GeneralSettings = SettingsField(
default_factory=GeneralSettings,
title="General",
)
imageio: ImageIOSettings = Field(
imageio: ImageIOSettings = SettingsField(
default_factory=ImageIOSettings,
title="Color Management (imageio)",
)
dirmap: DirmapSettings = Field(
dirmap: DirmapSettings = SettingsField(
default_factory=DirmapSettings,
title="Nuke Directory Mapping",
)
scriptsmenu: ScriptsmenuSettings = Field(
scriptsmenu: ScriptsmenuSettings = SettingsField(
default_factory=ScriptsmenuSettings,
title="Scripts Menu Definition",
)
gizmo: list[GizmoItem] = Field(
gizmo: list[GizmoItem] = SettingsField(
default_factory=list, title="Gizmo Menu")
create: CreatorPluginsSettings = Field(
create: CreatorPluginsSettings = SettingsField(
default_factory=CreatorPluginsSettings,
title="Creator Plugins",
)
publish: PublishPuginsModel = Field(
publish: PublishPuginsModel = SettingsField(
default_factory=PublishPuginsModel,
title="Publish Plugins",
)
load: LoaderPuginsModel = Field(
load: LoaderPuginsModel = SettingsField(
default_factory=LoaderPuginsModel,
title="Loader Plugins",
)
workfile_builder: WorkfileBuilderModel = Field(
workfile_builder: WorkfileBuilderModel = SettingsField(
default_factory=WorkfileBuilderModel,
title="Workfile Builder",
)
templated_workfile_build: TemplatedWorkfileBuildModel = Field(
templated_workfile_build: TemplatedWorkfileBuildModel = SettingsField(
title="Templated Workfile Build",
default_factory=TemplatedWorkfileBuildModel
)

View file

@ -1,6 +1,7 @@
from pydantic import validator, Field
from pydantic import validator
from ayon_server.settings import (
BaseSettingsModel,
SettingsField,
ensure_unique_names,
task_types_enum
)
@ -28,18 +29,18 @@ def nuke_product_types_enum():
class NodeModel(BaseSettingsModel):
name: str = Field(
name: str = SettingsField(
title="Node name"
)
nodeclass: str = Field(
nodeclass: str = SettingsField(
"",
title="Node class"
)
dependent: str = Field(
dependent: str = SettingsField(
"",
title="Incoming dependency"
)
knobs: list[KnobModel] = Field(
knobs: list[KnobModel] = SettingsField(
default_factory=list,
title="Knobs",
)
@ -52,7 +53,7 @@ class NodeModel(BaseSettingsModel):
class CollectInstanceDataModel(BaseSettingsModel):
sync_workfile_version_on_product_types: list[str] = Field(
sync_workfile_version_on_product_types: list[str] = SettingsField(
default_factory=list,
enum_resolver=nuke_product_types_enum,
title="Sync workfile versions for familes"
@ -60,14 +61,14 @@ class CollectInstanceDataModel(BaseSettingsModel):
class OptionalPluginModel(BaseSettingsModel):
enabled: bool = Field(True)
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(True)
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class ValidateKnobsModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
knobs: str = Field(
enabled: bool = SettingsField(title="Enabled")
knobs: str = SettingsField(
"{}",
title="Knobs",
widget="textarea",
@ -79,31 +80,31 @@ class ValidateKnobsModel(BaseSettingsModel):
class ExtractReviewDataModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
enabled: bool = SettingsField(title="Enabled")
class ExtractReviewDataLutModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
enabled: bool = SettingsField(title="Enabled")
class BakingStreamFilterModel(BaseSettingsModel):
task_types: list[str] = Field(
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
product_types: list[str] = Field(
product_types: list[str] = SettingsField(
default_factory=list,
enum_resolver=nuke_render_publish_types_enum,
title="Sync workfile versions for familes"
)
product_names: list[str] = Field(
product_names: list[str] = SettingsField(
default_factory=list, title="Product names")
class ReformatNodesRepositionNodes(BaseSettingsModel):
node_class: str = Field(title="Node class")
knobs: list[KnobModel] = Field(
node_class: str = SettingsField(title="Node class")
knobs: list[KnobModel] = SettingsField(
default_factory=list,
title="Node knobs")
@ -115,41 +116,41 @@ class ReformatNodesConfigModel(BaseSettingsModel):
Order of reformat nodes is important. First reformat node will
be applied first and last reformat node will be applied last.
"""
enabled: bool = Field(False)
reposition_nodes: list[ReformatNodesRepositionNodes] = Field(
enabled: bool = SettingsField(False)
reposition_nodes: list[ReformatNodesRepositionNodes] = SettingsField(
default_factory=list,
title="Reposition knobs"
)
class IntermediateOutputModel(BaseSettingsModel):
name: str = Field(title="Output name")
filter: BakingStreamFilterModel = Field(
name: str = SettingsField(title="Output name")
filter: BakingStreamFilterModel = SettingsField(
title="Filter", default_factory=BakingStreamFilterModel)
read_raw: bool = Field(
read_raw: bool = SettingsField(
False,
title="Read raw switch"
)
viewer_process_override: str = Field(
viewer_process_override: str = SettingsField(
"",
title="Viewer process override"
)
bake_viewer_process: bool = Field(
bake_viewer_process: bool = SettingsField(
True,
title="Bake viewer process"
)
bake_viewer_input_process: bool = Field(
bake_viewer_input_process: bool = SettingsField(
True,
title="Bake viewer input process node (LUT)"
)
reformat_nodes_config: ReformatNodesConfigModel = Field(
reformat_nodes_config: ReformatNodesConfigModel = SettingsField(
default_factory=ReformatNodesConfigModel,
title="Reformat Nodes")
extension: str = Field(
extension: str = SettingsField(
"mov",
title="File extension"
)
add_custom_tags: list[str] = Field(
add_custom_tags: list[str] = SettingsField(
title="Custom tags", default_factory=list)
@ -157,123 +158,125 @@ class ExtractReviewDataMovModel(BaseSettingsModel):
"""[deprecated] use Extract Review Data Baking
Streams instead.
"""
enabled: bool = Field(title="Enabled")
viewer_lut_raw: bool = Field(title="Viewer lut raw")
outputs: list[IntermediateOutputModel] = Field(
enabled: bool = SettingsField(title="Enabled")
viewer_lut_raw: bool = SettingsField(title="Viewer lut raw")
outputs: list[IntermediateOutputModel] = SettingsField(
default_factory=list,
title="Baking streams"
)
class ExtractReviewIntermediatesModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
viewer_lut_raw: bool = Field(title="Viewer lut raw")
outputs: list[IntermediateOutputModel] = Field(
enabled: bool = SettingsField(title="Enabled")
viewer_lut_raw: bool = SettingsField(title="Viewer lut raw")
outputs: list[IntermediateOutputModel] = SettingsField(
default_factory=list,
title="Baking streams"
)
class FSubmissionNoteModel(BaseSettingsModel):
enabled: bool = Field(title="enabled")
template: str = Field(title="Template")
enabled: bool = SettingsField(title="enabled")
template: str = SettingsField(title="Template")
class FSubmistingForModel(BaseSettingsModel):
enabled: bool = Field(title="enabled")
template: str = Field(title="Template")
enabled: bool = SettingsField(title="enabled")
template: str = SettingsField(title="Template")
class FVFXScopeOfWorkModel(BaseSettingsModel):
enabled: bool = Field(title="enabled")
template: str = Field(title="Template")
enabled: bool = SettingsField(title="enabled")
template: str = SettingsField(title="Template")
class ExctractSlateFrameParamModel(BaseSettingsModel):
f_submission_note: FSubmissionNoteModel = Field(
f_submission_note: FSubmissionNoteModel = SettingsField(
title="f_submission_note",
default_factory=FSubmissionNoteModel
)
f_submitting_for: FSubmistingForModel = Field(
f_submitting_for: FSubmistingForModel = SettingsField(
title="f_submitting_for",
default_factory=FSubmistingForModel
)
f_vfx_scope_of_work: FVFXScopeOfWorkModel = Field(
f_vfx_scope_of_work: FVFXScopeOfWorkModel = SettingsField(
title="f_vfx_scope_of_work",
default_factory=FVFXScopeOfWorkModel
)
class ExtractSlateFrameModel(BaseSettingsModel):
viewer_lut_raw: bool = Field(title="Viewer lut raw")
key_value_mapping: ExctractSlateFrameParamModel = Field(
viewer_lut_raw: bool = SettingsField(title="Viewer lut raw")
key_value_mapping: ExctractSlateFrameParamModel = SettingsField(
title="Key value mapping",
default_factory=ExctractSlateFrameParamModel
)
class IncrementScriptVersionModel(BaseSettingsModel):
enabled: bool = Field(title="Enabled")
optional: bool = Field(title="Optional")
active: bool = Field(title="Active")
enabled: bool = SettingsField(title="Enabled")
optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active")
class PublishPuginsModel(BaseSettingsModel):
CollectInstanceData: CollectInstanceDataModel = Field(
CollectInstanceData: CollectInstanceDataModel = SettingsField(
title="Collect Instance Version",
default_factory=CollectInstanceDataModel,
section="Collectors"
)
ValidateCorrectAssetContext: OptionalPluginModel = Field(
ValidateCorrectAssetContext: OptionalPluginModel = SettingsField(
title="Validate Correct Folder Name",
default_factory=OptionalPluginModel,
section="Validators"
)
ValidateContainers: OptionalPluginModel = Field(
ValidateContainers: OptionalPluginModel = SettingsField(
title="Validate Containers",
default_factory=OptionalPluginModel
)
ValidateKnobs: ValidateKnobsModel = Field(
ValidateKnobs: ValidateKnobsModel = SettingsField(
title="Validate Knobs",
default_factory=ValidateKnobsModel
)
ValidateOutputResolution: OptionalPluginModel = Field(
ValidateOutputResolution: OptionalPluginModel = SettingsField(
title="Validate Output Resolution",
default_factory=OptionalPluginModel
)
ValidateGizmo: OptionalPluginModel = Field(
ValidateGizmo: OptionalPluginModel = SettingsField(
title="Validate Gizmo",
default_factory=OptionalPluginModel
)
ValidateBackdrop: OptionalPluginModel = Field(
ValidateBackdrop: OptionalPluginModel = SettingsField(
title="Validate Backdrop",
default_factory=OptionalPluginModel
)
ValidateScriptAttributes: OptionalPluginModel = Field(
ValidateScriptAttributes: OptionalPluginModel = SettingsField(
title="Validate workfile attributes",
default_factory=OptionalPluginModel
)
ExtractReviewData: ExtractReviewDataModel = Field(
ExtractReviewData: ExtractReviewDataModel = SettingsField(
title="Extract Review Data",
default_factory=ExtractReviewDataModel
)
ExtractReviewDataLut: ExtractReviewDataLutModel = Field(
ExtractReviewDataLut: ExtractReviewDataLutModel = SettingsField(
title="Extract Review Data Lut",
default_factory=ExtractReviewDataLutModel
)
ExtractReviewDataMov: ExtractReviewDataMovModel = Field(
ExtractReviewDataMov: ExtractReviewDataMovModel = SettingsField(
title="Extract Review Data Mov",
default_factory=ExtractReviewDataMovModel
)
ExtractReviewIntermediates: ExtractReviewIntermediatesModel = Field(
title="Extract Review Intermediates",
default_factory=ExtractReviewIntermediatesModel
ExtractReviewIntermediates: ExtractReviewIntermediatesModel = (
SettingsField(
title="Extract Review Intermediates",
default_factory=ExtractReviewIntermediatesModel
)
)
ExtractSlateFrame: ExtractSlateFrameModel = Field(
ExtractSlateFrame: ExtractSlateFrameModel = SettingsField(
title="Extract Slate Frame",
default_factory=ExtractSlateFrameModel
)
IncrementScriptVersion: IncrementScriptVersionModel = Field(
IncrementScriptVersion: IncrementScriptVersionModel = SettingsField(
title="Increment Workfile Version",
default_factory=IncrementScriptVersionModel,
section="Integrators"

View file

@ -1,24 +1,23 @@
from pydantic import Field
from ayon_server.settings import BaseSettingsModel
from ayon_server.settings import BaseSettingsModel, SettingsField
class ScriptsmenuSubmodel(BaseSettingsModel):
"""Item Definition"""
_isGroup = True
type: str = Field(title="Type")
command: str = Field(title="Command")
sourcetype: str = Field(title="Source Type")
title: str = Field(title="Title")
tooltip: str = Field(title="Tooltip")
type: str = SettingsField(title="Type")
command: str = SettingsField(title="Command")
sourcetype: str = SettingsField(title="Source Type")
title: str = SettingsField(title="Title")
tooltip: str = SettingsField(title="Tooltip")
class ScriptsmenuSettings(BaseSettingsModel):
"""Nuke script menu project settings."""
_isGroup = True
name: str = Field(title="Menu Name")
definition: list[ScriptsmenuSubmodel] = Field(
name: str = SettingsField(title="Menu Name")
definition: list[ScriptsmenuSubmodel] = SettingsField(
default_factory=list,
title="Definition",
description="Scriptmenu Items Definition"

View file

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

Some files were not shown because too many files have changed in this diff Show more