Merge branch 'develop' into enhancement/AY-5648_Substance-work--publish-version-sync

This commit is contained in:
Kayla Man 2024-06-10 21:28:23 +08:00
commit 91c5866e10
90 changed files with 316 additions and 656 deletions

2
.gitmodules vendored
View file

@ -1,3 +1,3 @@
[submodule "client/ayon_core/hosts/unreal/integration"]
path = client/ayon_core/hosts/unreal/integration
path = server_addon/unreal/client/ayon_unreal/integration
url = https://github.com/ynput/ayon-unreal-plugin.git

View file

@ -63,6 +63,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = {
"royalrender": VersionInfo(0, 2, 0),
"substancepainter": VersionInfo(0, 2, 0),
"houdini": VersionInfo(0, 3, 0),
"unreal": VersionInfo(0, 2, 0),
}

View file

@ -1,6 +0,0 @@
from .addon import UnrealAddon
__all__ = (
"UnrealAddon",
)

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

@ -398,7 +398,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
@ -416,7 +420,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",
},
})
@ -439,15 +443,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

@ -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...")

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 HierarchyModel
from ayon_core.lib.profiles_filtering import filter_profiles
# Define constant for plugin orders offset
PLUGIN_ORDER_OFFSET = 0.5
@ -1686,6 +1688,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()
# Hierarchy model
def get_folder_items(self, project_name, sender=None):
return self._hierarchy_model.get_folder_items(project_name, sender)
@ -1827,8 +1838,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(
@ -1839,6 +1855,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.3"

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

@ -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"

View file

@ -0,0 +1,10 @@
from .version import __version__
from .addon import UNREAL_ADDON_ROOT, UnrealAddon
__all__ = (
"__version__",
"UNREAL_ADDON_ROOT",
"UnrealAddon",
)

View file

@ -2,16 +2,19 @@ import os
import re
from ayon_core.addon import AYONAddon, IHostAddon
UNREAL_ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
from .version import __version__
UNREAL_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__))
class UnrealAddon(AYONAddon, IHostAddon):
name = "unreal"
version = __version__
host_name = "unreal"
def get_global_environments(self):
return {
"AYON_UNREAL_ROOT": UNREAL_ROOT_DIR,
"AYON_UNREAL_ROOT": UNREAL_ADDON_ROOT,
}
def add_implementation_envs(self, env, app):
@ -40,11 +43,11 @@ class UnrealAddon(AYONAddon, IHostAddon):
ue_version = app.name.replace("-", ".")
unreal_plugin_path = os.path.join(
UNREAL_ROOT_DIR, "integration", "UE_{}".format(ue_version), "Ayon"
UNREAL_ADDON_ROOT, "integration", "UE_{}".format(ue_version), "Ayon"
)
if not Path(unreal_plugin_path).exists():
compatible_versions = get_compatible_integration(
ue_version, Path(UNREAL_ROOT_DIR) / "integration"
ue_version, Path(UNREAL_ADDON_ROOT) / "integration"
)
if compatible_versions:
unreal_plugin_path = compatible_versions[-1] / "Ayon"
@ -67,7 +70,7 @@ class UnrealAddon(AYONAddon, IHostAddon):
if app.host_name != self.host_name:
return []
return [
os.path.join(UNREAL_ROOT_DIR, "hooks")
os.path.join(UNREAL_ADDON_ROOT, "hooks")
]
def get_workfile_extensions(self):

View file

@ -21,8 +21,8 @@ from ayon_core.pipeline import (
get_current_project_name,
)
from ayon_core.tools.utils import host_tools
import ayon_core.hosts.unreal
from ayon_core.host import HostBase, ILoadHost, IPublishHost
from ayon_unreal import UNREAL_ADDON_ROOT
import unreal # noqa
@ -36,8 +36,7 @@ UNREAL_VERSION = semver.VersionInfo(
*os.getenv("AYON_UNREAL_VERSION").split(".")
)
HOST_DIR = os.path.dirname(os.path.abspath(ayon_core.hosts.unreal.__file__))
PLUGINS_DIR = os.path.join(HOST_DIR, "plugins")
PLUGINS_DIR = os.path.join(UNREAL_ADDON_ROOT, "plugins")
PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish")
LOAD_PATH = os.path.join(PLUGINS_DIR, "load")
CREATE_PATH = os.path.join(PLUGINS_DIR, "create")
@ -324,7 +323,7 @@ def show_tools_popup():
Popup will disappear on click or losing focus.
"""
from ayon_core.hosts.unreal.api import tools_ui
from ayon_unreal.api import tools_ui
tools_ui.show_tools_popup()
@ -334,7 +333,7 @@ def show_tools_dialog():
Dialog will stay visible.
"""
from ayon_core.hosts.unreal.api import tools_ui
from ayon_unreal.api import tools_ui
tools_ui.show_tools_dialog()

View file

@ -4,8 +4,8 @@ import unreal
from ayon_core.settings import get_project_settings
from ayon_core.pipeline import Anatomy
from ayon_core.hosts.unreal.api import pipeline
from ayon_core.tools.utils import show_message_dialog
from ayon_unreal.api import pipeline
queue = None

View file

@ -7,7 +7,7 @@ from ayon_core import (
)
from ayon_core.tools.utils import host_tools
from ayon_core.tools.utils.lib import qt_app_context
from ayon_core.hosts.unreal.api import rendering
from ayon_unreal.api import rendering
class ToolsBtnsWidget(QtWidgets.QWidget):

View file

@ -15,12 +15,12 @@ from ayon_applications import (
LaunchTypes,
)
from ayon_core.pipeline.workfile import get_workfile_template_key
import ayon_core.hosts.unreal.lib as unreal_lib
from ayon_core.hosts.unreal.ue_workers import (
import ayon_unreal.lib as unreal_lib
from ayon_unreal.ue_workers import (
UEProjectGenerationWorker,
UEPluginInstallWorker
)
from ayon_core.hosts.unreal.ui import SplashScreen
from ayon_unreal.ui import SplashScreen
class UnrealPrelaunchHook(PreLaunchHook):

View file

@ -2,8 +2,8 @@
import unreal
from ayon_core.pipeline import CreatorError
from ayon_core.hosts.unreal.api.pipeline import UNREAL_VERSION
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.pipeline import UNREAL_VERSION
from ayon_unreal.api.plugin import (
UnrealAssetCreator,
)

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.plugin import (
UnrealActorCreator,
)

View file

@ -2,10 +2,10 @@
import unreal
from ayon_core.pipeline import CreatorError
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api.pipeline import (
create_folder
)
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.plugin import (
UnrealAssetCreator
)
from ayon_core.lib import UILabelDef

View file

@ -3,12 +3,12 @@ from pathlib import Path
import unreal
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api.pipeline import (
UNREAL_VERSION,
create_folder,
get_subsequences,
)
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.plugin import (
UnrealAssetCreator
)
from ayon_core.lib import (

View file

@ -1,5 +1,5 @@
# -*- coding: utf-8 -*-
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.plugin import (
UnrealAssetCreator,
)

View file

@ -4,7 +4,7 @@ from pathlib import Path
import unreal
from ayon_core.pipeline import CreatorError
from ayon_core.hosts.unreal.api.plugin import (
from ayon_unreal.api.plugin import (
UnrealAssetCreator,
)

View file

@ -1,7 +1,7 @@
import unreal
from ayon_core.hosts.unreal.api.tools_ui import qt_app_context
from ayon_core.hosts.unreal.api.pipeline import delete_asset_if_unused
from ayon_unreal.api.tools_ui import qt_app_context
from ayon_unreal.api.pipeline import delete_asset_if_unused
from ayon_core.pipeline import InventoryAction

View file

@ -1,6 +1,6 @@
import unreal
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api.pipeline import (
ls,
replace_static_mesh_actors,
replace_skeletal_mesh_actors,

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api import pipeline as unreal_pipeline
from ayon_unreal.api import plugin
from ayon_unreal.api import pipeline as unreal_pipeline
import unreal # noqa

View file

@ -13,8 +13,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api import pipeline as unreal_pipeline
from ayon_unreal.api import plugin
from ayon_unreal.api import pipeline as unreal_pipeline
class AnimationFBXLoader(plugin.Loader):

View file

@ -16,8 +16,8 @@ from ayon_core.pipeline import (
get_current_project_name,
get_representation_path,
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
generate_sequence,
set_sequence_hierarchy,
create_container,

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
AYON_ASSET_DIR,
create_container,
imprint,

View file

@ -27,8 +27,8 @@ from ayon_core.pipeline import (
)
from ayon_core.pipeline.context_tools import get_current_folder_entity
from ayon_core.settings import get_current_project_settings
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
generate_sequence,
set_sequence_hierarchy,
create_container,

View file

@ -12,8 +12,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID,
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api import pipeline as upipeline
from ayon_unreal.api import plugin
from ayon_unreal.api import pipeline as upipeline
class ExistingLayoutLoader(plugin.Loader):

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
AYON_ASSET_DIR,
create_container,
imprint,

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
AYON_ASSET_DIR,
create_container,
imprint,

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
AYON_ASSET_DIR,
create_container,
imprint,

View file

@ -6,8 +6,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api.pipeline import (
from ayon_unreal.api import plugin
from ayon_unreal.api.pipeline import (
AYON_ASSET_DIR,
create_container,
imprint,

View file

@ -7,8 +7,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api import pipeline as unreal_pipeline
from ayon_unreal.api import plugin
from ayon_unreal.api import pipeline as unreal_pipeline
import unreal # noqa

View file

@ -7,8 +7,8 @@ from ayon_core.pipeline import (
get_representation_path,
AYON_CONTAINER_ID
)
from ayon_core.hosts.unreal.api import plugin
from ayon_core.hosts.unreal.api import pipeline as unreal_pipeline
from ayon_unreal.api import plugin
from ayon_unreal.api import pipeline as unreal_pipeline
import unreal # noqa

View file

@ -5,7 +5,7 @@ import pyblish.api
from ayon_core.pipeline import get_current_project_name
from ayon_core.pipeline import Anatomy
from ayon_core.hosts.unreal.api import pipeline
from ayon_unreal.api import pipeline
class CollectRenderInstances(pyblish.api.InstancePlugin):

View file

@ -5,7 +5,7 @@ import os
import unreal
from ayon_core.pipeline import publish
from ayon_core.hosts.unreal.api.pipeline import UNREAL_VERSION
from ayon_unreal.api.pipeline import UNREAL_VERSION
class ExtractCamera(publish.Extractor):

View file

@ -11,7 +11,7 @@ from typing import List, Union
from qtpy import QtCore
import ayon_core.hosts.unreal.lib as ue_lib
import ayon_unreal.lib as ue_lib
from ayon_core.settings import get_project_settings

View file

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

View file

@ -1,3 +1,10 @@
name = "unreal"
title = "Unreal"
version = "0.1.0"
version = "0.2.0"
client_dir = "ayon_unreal"
ayon_required_addons = {
"core": ">0.3.2",
}
ayon_compatible_addons = {}