Merge branch 'develop' into feature/material-symbols-in-uis

# Conflicts:
#	client/ayon_core/tools/publisher/control.py
This commit is contained in:
Jakub Trllo 2024-06-10 16:10:13 +02:00
commit c622fb37b4
47 changed files with 286 additions and 598 deletions

View file

@ -36,7 +36,7 @@ class Commands:
log.warning(
"Failed to add cli command for module \"{}\"".format(
addon.name
)
), exc_info=True
)
return click_func

View file

@ -37,6 +37,7 @@ from .creator_plugins import (
# Changes of instances and context are send as tuple of 2 information
UpdateData = collections.namedtuple("UpdateData", ["instance", "changes"])
_NOT_SET = object()
class UnavailableSharedData(Exception):
@ -1401,6 +1402,11 @@ class CreateContext:
self._current_folder_path = None
self._current_task_name = None
self._current_workfile_path = None
self._current_project_settings = None
self._current_folder_entity = _NOT_SET
self._current_task_entity = _NOT_SET
self._current_task_type = _NOT_SET
self._current_project_anatomy = None
@ -1571,6 +1577,64 @@ class CreateContext:
return self._current_task_name
def get_current_task_type(self):
"""Task type which was used as current context on context reset.
Returns:
Union[str, None]: Task type.
"""
if self._current_task_type is _NOT_SET:
task_type = None
task_entity = self.get_current_task_entity()
if task_entity:
task_type = task_entity["taskType"]
self._current_task_type = task_type
return self._current_task_type
def get_current_folder_entity(self):
"""Folder entity for current context folder.
Returns:
Union[dict[str, Any], None]: Folder entity.
"""
if self._current_folder_entity is not _NOT_SET:
return copy.deepcopy(self._current_folder_entity)
folder_entity = None
folder_path = self.get_current_folder_path()
if folder_path:
project_name = self.get_current_project_name()
folder_entity = ayon_api.get_folder_by_path(
project_name, folder_path
)
self._current_folder_entity = folder_entity
return copy.deepcopy(self._current_folder_entity)
def get_current_task_entity(self):
"""Task entity for current context task.
Returns:
Union[dict[str, Any], None]: Task entity.
"""
if self._current_task_entity is not _NOT_SET:
return copy.deepcopy(self._current_task_entity)
task_entity = None
task_name = self.get_current_task_name()
if task_name:
folder_entity = self.get_current_folder_entity()
if folder_entity:
project_name = self.get_current_project_name()
task_entity = ayon_api.get_task_by_name(
project_name,
folder_id=folder_entity["id"],
task_name=task_name
)
self._current_task_entity = task_entity
return copy.deepcopy(self._current_task_entity)
def get_current_workfile_path(self):
"""Workfile path which was opened on context reset.
@ -1592,6 +1656,12 @@ class CreateContext:
self._current_project_name)
return self._current_project_anatomy
def get_current_project_settings(self):
if self._current_project_settings is None:
self._current_project_settings = get_project_settings(
self.get_current_project_name())
return self._current_project_settings
@property
def context_has_changed(self):
"""Host context has changed.
@ -1718,7 +1788,12 @@ class CreateContext:
self._current_task_name = task_name
self._current_workfile_path = workfile_path
self._current_folder_entity = _NOT_SET
self._current_task_entity = _NOT_SET
self._current_task_type = _NOT_SET
self._current_project_anatomy = None
self._current_project_settings = None
def reset_plugins(self, discover_publish_plugins=True):
"""Reload plugins.
@ -1772,7 +1847,7 @@ class CreateContext:
def _reset_creator_plugins(self):
# Prepare settings
project_settings = get_project_settings(self.project_name)
project_settings = self.get_current_project_settings()
# Discover and prepare creators
creators = {}

View file

@ -391,7 +391,11 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
anatomy_data.update(folder_data)
return
if instance.data.get("newAssetPublishing"):
if (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
):
hierarchy = instance.data["hierarchy"]
anatomy_data["hierarchy"] = hierarchy
@ -409,7 +413,7 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
"path": instance.data["folderPath"],
# TODO get folder type from hierarchy
# Using 'Shot' is current default behavior of editorial
# (or 'newAssetPublishing') publishing.
# (or 'newHierarchyIntegration') publishing.
"type": "Shot",
},
})
@ -432,15 +436,22 @@ class CollectAnatomyInstanceData(pyblish.api.ContextPlugin):
if task_data:
# Fill task data
# - if we're in editorial, make sure the task type is filled
if (
not instance.data.get("newAssetPublishing")
or task_data["type"]
):
new_hierarchy = (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
)
if not new_hierarchy or task_data["type"]:
anatomy_data["task"] = task_data
return
# New hierarchy is not created, so we can only skip rest of the logic
if not instance.data.get("newAssetPublishing"):
new_hierarchy = (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
)
if not new_hierarchy:
return
# Try to find task data based on hierarchy context and folder path

View file

@ -27,7 +27,8 @@ class CollectSceneVersion(pyblish.api.ContextPlugin):
"nuke",
"photoshop",
"resolve",
"tvpaint"
"tvpaint",
"motionbuilder"
]
# in some cases of headless publishing (for example webpublisher using PS)

View file

@ -24,7 +24,11 @@ class ValidateFolderEntities(pyblish.api.InstancePlugin):
if instance.data.get("folderEntity"):
self.log.debug("Instance has set fodler entity in its data.")
elif instance.data.get("newAssetPublishing"):
elif (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
):
# skip if it is editorial
self.log.debug("Editorial instance has no need to check...")

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View file

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
width="2.93333in" height="3.06667in"
viewBox="0 0 512 512"
>
<g>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256">
<stop offset="0" style="stop-color:#541f1b"/>
<stop offset="1" style="stop-color:#a91b0d"/>
</linearGradient>
<circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/>
<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188">
<stop offset="0" style="stop-color:#a91b0d"/>
<stop offset="1" style="stop-color:#541f1b"/>
</linearGradient>
<path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/>
</g>
<g transform="
translate(80, 80)
scale(0.4)
">
<path id="glasses"
fill="#000"
d="M 314.00,503.21
C 307.04,504.43 299.79,504.67 294.04,509.39
281.95,519.33 287.74,545.64 293.31,558.00
305.34,584.70 329.18,602.65 359.00,603.00
359.00,603.00 367.00,603.00 367.00,603.00
390.85,602.89 413.70,588.04 421.25,565.00
424.01,556.59 424.10,550.65 424.00,542.00
423.57,505.69 375.59,507.27 350.00,504.83
350.00,504.83 335.00,503.91 335.00,503.91
335.00,503.91 325.00,503.21 325.00,503.21
325.00,503.21 314.00,503.21 314.00,503.21 Z
M 549.00,503.42
C 549.00,503.42 536.00,504.09 536.00,504.09
536.00,504.09 492.00,508.80 492.00,508.80
482.54,510.63 471.18,514.25 464.32,521.30
457.58,528.23 455.90,537.72 456.00,547.00
456.35,577.84 481.12,602.64 512.00,603.00
540.73,603.33 565.64,594.85 581.39,569.00
587.72,558.59 592.85,544.28 593.00,532.00
593.07,525.52 593.79,518.45 589.58,513.02
581.71,502.84 560.89,501.98 549.00,503.42 Z" />
<path id="head"
fill="#000"
d="M 196.00,310.00
C 157.00,317.34 100.69,333.54 68.00,355.67
49.93,367.90 32.97,386.48 45.31,409.00
56.44,429.32 84.25,442.43 105.00,450.99
105.00,450.99 124.00,458.31 124.00,458.31
126.46,459.18 131.76,460.54 133.18,462.51
135.43,465.18 132.87,477.62 133.18,482.00
133.72,499.63 138.37,519.19 146.27,535.00
146.27,535.00 160.00,558.00 160.00,558.00
151.04,562.00 138.14,570.76 130.00,576.58
106.10,593.66 85.83,612.72 66.73,635.00
66.73,635.00 50.58,655.00 50.58,655.00
46.85,659.79 43.49,662.96 42.00,669.00
42.00,669.00 80.00,697.58 80.00,697.58
80.00,697.58 134.00,738.63 134.00,738.63
134.00,738.63 159.00,757.63 159.00,757.63
159.00,757.63 168.69,766.17 168.69,766.17
168.69,766.17 166.41,788.00 166.41,788.00
166.41,788.00 159.00,839.00 159.00,839.00
159.00,839.00 725.00,839.00 725.00,839.00
725.00,839.00 715.00,787.00 715.00,787.00
714.23,783.16 710.80,769.90 711.69,767.01
712.77,763.46 718.06,760.08 721.00,757.87
721.00,757.87 746.00,738.87 746.00,738.87
746.00,738.87 805.00,693.88 805.00,693.88
805.00,693.88 839.00,668.00 839.00,668.00
830.81,653.76 810.68,631.16 799.04,619.00
779.93,599.05 746.32,568.97 721.00,558.00
736.80,531.67 747.05,511.60 746.88,480.00
746.99,476.23 745.11,464.71 746.88,462.51
748.19,460.62 752.74,459.42 755.00,458.67
755.00,458.67 773.00,451.99 773.00,451.99
789.48,445.21 809.73,435.70 823.00,423.83
833.14,414.76 839.34,405.89 838.99,392.00
838.62,377.75 825.69,365.33 815.00,357.38
791.37,339.79 750.60,326.38 722.00,318.42
722.00,318.42 698.00,312.65 698.00,312.65
694.98,311.97 689.62,311.22 687.31,309.28
684.49,306.90 682.00,295.04 680.86,291.00
680.86,291.00 667.37,242.00 667.37,242.00
655.66,196.99 634.72,129.32 611.40,90.00
599.32,69.64 582.92,49.09 559.00,42.75
551.96,40.89 546.17,40.92 539.00,41.00
521.02,41.21 499.67,47.67 482.00,51.58
468.77,54.50 455.47,55.86 442.00,56.82
442.00,56.82 432.00,56.04 432.00,56.04
400.44,54.66 371.26,41.33 343.00,41.00
335.69,40.92 330.19,40.64 323.00,42.48
298.44,48.76 281.88,68.37 268.95,89.00
244.31,128.34 223.03,195.41 211.63,241.00
211.63,241.00 199.63,288.00 199.63,288.00
198.01,294.48 194.47,303.56 196.00,310.00 Z
M 687.00,478.00
C 686.85,494.73 678.57,518.97 665.00,529.32
658.84,534.01 657.01,532.67 651.00,535.35
644.22,538.36 638.88,543.45 635.40,550.00
635.40,550.00 622.40,582.00 622.40,582.00
622.40,582.00 611.14,608.00 611.14,608.00
592.73,649.33 562.84,703.15 531.00,735.00
531.00,735.00 518.00,747.71 518.00,747.71
499.32,763.96 471.29,778.70 446.00,779.00
399.64,779.54 368.31,757.20 338.87,723.00
298.68,676.31 271.17,614.00 248.94,557.00
245.41,547.94 240.81,540.99 232.00,536.33
224.56,532.38 222.45,534.62 215.00,528.53
201.42,517.45 194.00,495.06 194.00,478.00
194.00,478.00 226.00,483.92 226.00,483.92
226.00,483.92 305.00,494.83 305.00,494.83
305.00,494.83 350.00,498.09 350.00,498.09
350.00,498.09 391.00,500.00 391.00,500.00
391.00,500.00 408.00,501.00 408.00,501.00
408.00,501.00 473.00,501.00 473.00,501.00
473.00,501.00 485.00,500.04 485.00,500.04
485.00,500.04 501.00,500.04 501.00,500.04
501.00,500.04 520.00,499.00 520.00,499.00
520.00,499.00 531.00,498.04 531.00,498.04
559.97,496.78 589.26,493.87 618.00,489.73
618.00,489.73 662.00,482.58 662.00,482.58
662.00,482.58 687.00,478.00 687.00,478.00 Z"
/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.8 KiB

View file

@ -1 +0,0 @@
<?xml version="1.0" ?><svg enable-background="new 0 0 512 512" id="Layer_1" version="1.1" viewBox="0 0 512 512" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><g><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x1="-0.0000027" x2="512" y1="256" y2="256"><stop offset="0" style="stop-color:#00AEEE"/><stop offset="1" style="stop-color:#0095DA"/></linearGradient><circle cx="256" cy="256" fill="url(#SVGID_1_)" r="256"/><linearGradient gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="42.6666641" x2="469.3333435" y1="256.0005188" y2="256.0005188"><stop offset="0" style="stop-color:#0095DA"/><stop offset="1" style="stop-color:#00AEEE"/></linearGradient><path d="M256,469.3338623c-117.6314697,0-213.3333435-95.7023926-213.3333435-213.3333435 c0-117.6314545,95.7018661-213.333313,213.3333435-213.333313c117.6357422,0,213.3333435,95.7018661,213.3333435,213.333313 C469.3333435,373.6314697,373.6357422,469.3338623,256,469.3338623z" fill="url(#SVGID_2_)"/></g><g><path d="M315.8906555,167.4933319h-28.3743896C287.5162659,154.4944,277.020813,144,264.0218811,144 c-13.0010834,0-23.4944153,10.4944-23.4944153,23.4933319h-28.3760071v40.6847992h103.7391968V167.4933319z" opacity="0.3"/><path d="M325.8906555,187.4895935v30.6885376H202.1504059v-30.6885376H164.354126V384h199.2911987V187.4895935 H325.8906555z M309.4405212,336.4693298l-7.0703735,7.0698853l-38.3712158-38.3712158l-38.3717346,38.3712158 l-7.0704041-7.0698853l38.3717346-38.3717346l-38.3717346-38.3717346l7.0704041-7.0698547l38.3717346,38.3711853 l38.3712158-38.3711853l7.0703735,7.0698547l-38.3717346,38.3717346L309.4405212,336.4693298z" opacity="0.3"/></g><g><path d="M307.8906555,159.4933319h-28.3743896C279.5162659,146.4944,269.020813,136,256.0218811,136 c-13.0010834,0-23.4944153,10.4944-23.4944153,23.4933319h-28.3760071v40.6847992h103.7391968V159.4933319z" fill="#FFFFFF"/><path d="M317.8906555,179.4895935v30.6885376H194.1504059v-30.6885376H156.354126V376h199.2911987V179.4895935 H317.8906555z M301.4405212,328.4693298l-7.0703735,7.0698853l-38.3712158-38.3712158l-38.3717346,38.3712158 l-7.0704041-7.0698853l38.3717346-38.3717346l-38.3717346-38.3717346l7.0704041-7.0698547l38.3717346,38.3711853 l38.3712158-38.3711853l7.0703735,7.0698547l-38.3717346,38.3717346L301.4405212,328.4693298z" fill="#FFFFFF"/></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 115 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 86 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 106 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 103 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 104 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 113 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 112 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 116 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 100 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 70 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 101 KiB

View file

@ -1,32 +0,0 @@
<html>
<style type="text/css">
body {
background-color: #333;
text-align: center;
color: #ccc;
margin-top: 200px;
}
h1 {
font-family: "DejaVu Sans";
font-size: 36px;
margin: 20px 0;
}
h3 {
font-weight: normal;
font-family: "DejaVu Sans";
margin: 30px 10px;
}
em {
color: #fff;
}
</style>
<body>
<h1>Sign in to Ftrack was successful</h1>
<h3>
You signed in with username <em>{}</em>.
</h3>
<h3>
You can close this window now.
</h3>
</body>
</html>

View file

@ -8,6 +8,7 @@ import tempfile
import shutil
import inspect
from abc import ABCMeta, abstractmethod
import re
import six
import arrow
@ -39,6 +40,7 @@ from ayon_core.pipeline.create.context import (
)
from ayon_core.pipeline.publish import get_publish_instance_label
from ayon_core.tools.common_models import ProjectsModel, HierarchyModel
from ayon_core.lib.profiles_filtering import filter_profiles
# Define constant for plugin orders offset
PLUGIN_ORDER_OFFSET = 0.5
@ -1687,6 +1689,15 @@ class PublisherController(BasePublisherController):
"""Publish plugins."""
return self._create_context.publish_plugins
def _get_current_project_settings(self):
"""Current project settings.
Returns:
dict
"""
return self._create_context.get_current_project_settings()
def get_folder_type_items(self, project_name, sender=None):
return self._projects_model.get_folder_type_items(
project_name, sender
@ -1835,8 +1846,13 @@ class PublisherController(BasePublisherController):
def _collect_creator_items(self):
# TODO add crashed initialization of create plugins to report
output = {}
allowed_creator_pattern = self._get_allowed_creators_pattern()
for identifier, creator in self._create_context.creators.items():
try:
if (not self._is_label_allowed(
creator.label, allowed_creator_pattern)):
self.log.debug(f"{creator.label} not allowed for context")
continue
output[identifier] = CreatorItem.from_creator(creator)
except Exception:
self.log.error(
@ -1847,6 +1863,60 @@ class PublisherController(BasePublisherController):
return output
def _get_allowed_creators_pattern(self):
"""Provide regex pattern for configured creator labels in this context
If no profile matches current context, it shows all creators.
Support usage of regular expressions for configured values.
Returns:
(re.Pattern)[optional]: None or regex compiled patterns
into single one ('Render|Image.*')
"""
task_type = self._create_context.get_current_task_type()
project_settings = self._get_current_project_settings()
filter_creator_profiles = (
project_settings
["core"]
["tools"]
["creator"]
["filter_creator_profiles"]
)
filtering_criteria = {
"task_names": self.current_task_name,
"task_types": task_type,
"host_names": self._create_context.host_name
}
profile = filter_profiles(
filter_creator_profiles,
filtering_criteria,
logger=self.log
)
allowed_creator_pattern = None
if profile:
allowed_creator_labels = {
label
for label in profile["creator_labels"]
if label
}
self.log.debug(f"Only allowed `{allowed_creator_labels}` creators")
allowed_creator_pattern = (
re.compile("|".join(allowed_creator_labels)))
return allowed_creator_pattern
def _is_label_allowed(self, label, allowed_labels_regex):
"""Implement regex support for allowed labels.
Args:
label (str): Label of creator - shown in Publisher
allowed_labels_regex (re.Pattern): compiled regular expression
"""
if not allowed_labels_regex:
return True
return bool(allowed_labels_regex.match(label))
def _reset_instances(self):
"""Reset create instances."""
if self._resetting_instances:

View file

@ -35,6 +35,28 @@ class ProductNameProfile(BaseSettingsModel):
template: str = SettingsField("", title="Template")
class FilterCreatorProfile(BaseSettingsModel):
"""Provide list of allowed Creator identifiers for context"""
_layout = "expanded"
host_names: list[str] = SettingsField(
default_factory=list, title="Host names"
)
task_types: list[str] = SettingsField(
default_factory=list,
title="Task types",
enum_resolver=task_types_enum
)
task_names: list[str] = SettingsField(
default_factory=list,
title="Task names")
creator_labels: list[str] = SettingsField(
default_factory=list,
title="Allowed Creator Labels",
description="Copy creator label from Publisher, regex supported."
)
class CreatorToolModel(BaseSettingsModel):
# TODO this was dynamic dictionary '{name: task_names}'
product_types_smart_select: list[ProductTypeSmartSelectModel] = (
@ -48,6 +70,13 @@ class CreatorToolModel(BaseSettingsModel):
title="Product name profiles"
)
filter_creator_profiles: list[FilterCreatorProfile] = SettingsField(
default_factory=list,
title="Filter creator profiles",
description="Allowed list of creator labels that will be only shown if "
"profile matches context."
)
@validator("product_types_smart_select")
def validate_unique_name(cls, value):
ensure_unique_names(value)
@ -420,7 +449,8 @@ DEFAULT_TOOLS_VALUES = {
"tasks": [],
"template": "SK_{folder[name]}{variant}"
}
]
],
"filter_creator_profiles": []
},
"Workfiles": {
"workfile_template_profiles": [

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'aftereffects' version."""
__version__ = "0.2.0"
__version__ = "0.2.1"

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'applications' version."""
__version__ = "0.2.4"

View file

@ -1,6 +1,6 @@
name = "applications"
title = "Applications"
version = "0.2.3"
version = "0.2.4"
client_dir = "ayon_applications"

View file

@ -1293,6 +1293,41 @@
}
]
},
"motionbuilder": {
"enabled": true,
"label": "Motion Builder",
"icon": "{}/app_icons/motionbuilder.png",
"host_name": "motionbuilder",
"environment": "{}",
"variants": [
{
"name": "2025",
"label": "2025",
"use_python_2": false,
"executables": {
"windows": [
"C:\\Program Files\\Autodesk\\MotionBuilder 2025\\bin\\x64\\motionbuilder.exe"
],
"darwin": [],
"linux": []
},
"environment": "{}"
},
{
"name": "2024",
"label": "2024",
"use_python_2": false,
"executables": {
"windows": [
"C:\\Program Files\\Autodesk\\MotionBuilder 2024\\bin\\x64\\motionbuilder.exe"
],
"darwin": [],
"linux": []
},
"environment": "{}"
}
]
},
"additional_apps": []
}
}

View file

@ -192,6 +192,8 @@ class ApplicationsSettings(BaseSettingsModel):
default_factory=AppGroupWithPython, title="Zbrush")
equalizer: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="3DEqualizer")
motionbuilder: AppGroup = SettingsField(
default_factory=AppGroupWithPython, title="Motion Builder")
additional_apps: list[AdditionalAppGroup] = SettingsField(
default_factory=list, title="Additional Applications")

View file

@ -152,7 +152,9 @@ class CollectTimelineInstances(pyblish.api.ContextPlugin):
task["name"]: {"type": task["type"]}
for task in self.add_tasks},
"representations": [],
"newAssetPublishing": True
"newHierarchyIntegration": True,
# Backwards compatible (Deprecated since 24/06/06)
"newAssetPublishing": True,
})
self.log.debug("__ inst_data: {}".format(pformat(inst_data)))

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'flame' version."""
__version__ = "0.2.0"
__version__ = "0.2.1"

View file

@ -1,6 +1,6 @@
name = "flame"
title = "Flame"
version = "0.2.0"
version = "0.2.1"
client_dir = "ayon_flame"

View file

@ -140,7 +140,9 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
# add all additional tags
"tags": phiero.get_track_item_tags(track_item),
"newAssetPublishing": True
"newHierarchyIntegration": True,
# Backwards compatible (Deprecated since 24/06/06)
"newAssetPublishing": True,
})
# otio clip data

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'hiero' version."""
__version__ = "0.2.1"
__version__ = "0.2.2"

View file

@ -1,6 +1,6 @@
name = "hiero"
title = "Hiero"
version = "0.2.1"
version = "0.2.2"
client_dir = "ayon_hiero"
ayon_required_addons = {

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'maya' version."""
__version__ = "0.2.2"

View file

@ -101,6 +101,8 @@ class PrecollectInstances(pyblish.api.ContextPlugin):
"fps": context.data["fps"],
"handleStart": handle_start,
"handleEnd": handle_end,
"newHierarchyIntegration": True,
# Backwards compatible (Deprecated since 24/06/06)
"newAssetPublishing": True,
"families": ["clip"],
"productType": product_type,

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'resolve' version."""
__version__ = "0.2.0"
__version__ = "0.2.1"

View file

@ -1,6 +1,6 @@
name = "resolve"
title = "DaVinci Resolve"
version = "0.2.0"
version = "0.2.1"
client_dir = "ayon_resolve"

View file

@ -46,6 +46,7 @@ class CreateTextures(Creator):
creator_attributes = instance_data.setdefault(
"creator_attributes", dict())
for key in [
"review",
"exportPresetUrl",
"exportFileFormat",
"exportSize",
@ -143,6 +144,10 @@ class CreateTextures(Creator):
}
return [
BoolDef("review",
label="Review",
tooltip="Mark as reviewable",
default=True),
EnumDef("exportChannel",
items=export_channel_enum,
multiselection=True,

View file

@ -124,7 +124,6 @@ class CollectTextureSet(pyblish.api.InstancePlugin):
staging_dir = os.path.dirname(first_filepath)
representation["tags"] = ["review"]
representation["stagingDir"] = staging_dir
# Clone the instance
product_type = "image"
image_instance = context.create_instance(image_product_name)
@ -136,6 +135,9 @@ class CollectTextureSet(pyblish.api.InstancePlugin):
image_instance.data["productType"] = product_type
image_instance.data["family"] = product_type
image_instance.data["families"] = [product_type, "textures"]
if instance.data["creator_attributes"].get("review"):
image_instance.data["families"].append("review")
image_instance.data["representations"] = [representation]
# Group the textures together in the loader

View file

@ -676,6 +676,8 @@ or updating already created. Publishing will create OTIO file.
"shotName": shot_name,
"variant": variant_name,
"task": None,
"newHierarchyIntegration": True,
# Backwards compatible (Deprecated since 24/06/06)
"newAssetPublishing": True,
"trackStartFrame": track_start_frame,
"timelineOffset": timeline_offset,

View file

@ -28,8 +28,12 @@ class CollectSequenceFrameData(
return
# editorial would fail since they might not be in database yet
new_folder_publishing = instance.data.get("newAssetPublishing")
if new_folder_publishing:
new_hierarchy = (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
)
if new_hierarchy:
self.log.debug("Instance is creating new folders. Skipping.")
return

View file

@ -33,8 +33,12 @@ class ValidateFrameRange(OptionalPyblishPluginMixin,
return
# editorial would fail since they might not be in database yet
new_folder_publishing = instance.data.get("newAssetPublishing")
if new_folder_publishing:
new_hierarchy = (
instance.data.get("newHierarchyIntegration")
# Backwards compatible (Deprecated since 24/06/06)
or instance.data.get("newAssetPublishing")
)
if new_hierarchy:
self.log.debug("Instance is creating new folder. Skipping.")
return

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*-
"""Package declaring AYON addon 'traypublisher' version."""
__version__ = "0.2.2"
__version__ = "0.2.3"

View file

@ -1,6 +1,6 @@
name = "traypublisher"
title = "TrayPublisher"
version = "0.2.2"
version = "0.2.3"
client_dir = "ayon_traypublisher"