mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merge branch 'develop' of https://github.com/ynput/ayon-core into enhancement/allow_disabling_removal_of_rendereed_files_on_farm
# Conflicts: # server/settings/publish_plugins.py
This commit is contained in:
commit
4c4993b7e2
2 changed files with 156 additions and 0 deletions
138
client/ayon_core/plugins/publish/integrate_attach_reviewable.py
Normal file
138
client/ayon_core/plugins/publish/integrate_attach_reviewable.py
Normal file
|
|
@ -0,0 +1,138 @@
|
||||||
|
import copy
|
||||||
|
import pyblish.api
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from ayon_core.lib import EnumDef
|
||||||
|
from ayon_core.pipeline import OptionalPyblishPluginMixin
|
||||||
|
|
||||||
|
|
||||||
|
class AttachReviewables(
|
||||||
|
pyblish.api.InstancePlugin, OptionalPyblishPluginMixin
|
||||||
|
):
|
||||||
|
"""Attach reviewable to other instances
|
||||||
|
|
||||||
|
This pre-integrator plugin allows instances to be 'attached to' other
|
||||||
|
instances by moving all its representations over to the other instance.
|
||||||
|
Even though this technically could work for any representation the current
|
||||||
|
intent is to use for reviewables only, like e.g. `review` or `render`
|
||||||
|
product type.
|
||||||
|
|
||||||
|
When the reviewable is attached to another instance, the instance itself
|
||||||
|
will not be published as a separate entity. Instead, the representations
|
||||||
|
will be copied/moved to the instances it is attached to.
|
||||||
|
"""
|
||||||
|
|
||||||
|
families = ["render", "review"]
|
||||||
|
order = pyblish.api.IntegratorOrder - 0.499
|
||||||
|
label = "Attach reviewables"
|
||||||
|
|
||||||
|
settings_category = "core"
|
||||||
|
|
||||||
|
def process(self, instance):
|
||||||
|
# TODO: Support farm.
|
||||||
|
# If instance is being submitted to the farm we should pass through
|
||||||
|
# the 'attached reviewables' metadata to the farm job
|
||||||
|
# TODO: Reviewable frame range and resolutions
|
||||||
|
# Because we are attaching the data to another instance, how do we
|
||||||
|
# correctly propagate the resolution + frame rate to the other
|
||||||
|
# instance? Do we even need to?
|
||||||
|
# TODO: If this were to attach 'renders' to another instance that would
|
||||||
|
# mean there wouldn't necessarily be a render publish separate as a
|
||||||
|
# result. Is that correct expected behavior?
|
||||||
|
attr_values = self.get_attr_values_from_data(instance.data)
|
||||||
|
attach_to = attr_values.get("attach", [])
|
||||||
|
if not attach_to:
|
||||||
|
self.log.debug(
|
||||||
|
"Reviewable is not set to attach to another instance."
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
attach_instances: List[pyblish.api.Instance] = []
|
||||||
|
for attach_instance_id in attach_to:
|
||||||
|
# Find the `pyblish.api.Instance` matching the `CreatedInstance.id`
|
||||||
|
# in the `attach_to` list
|
||||||
|
attach_instance = next(
|
||||||
|
(
|
||||||
|
_inst
|
||||||
|
for _inst in instance.context
|
||||||
|
if _inst.data.get("instance_id") == attach_instance_id
|
||||||
|
),
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
if attach_instance is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Skip inactive instances
|
||||||
|
if not attach_instance.data.get("active", True):
|
||||||
|
continue
|
||||||
|
|
||||||
|
# For now do not support attaching to 'farm' instances until we
|
||||||
|
# can pass the 'attaching' on to the farm jobs.
|
||||||
|
if attach_instance.data.get("farm"):
|
||||||
|
self.log.warning(
|
||||||
|
"Attaching to farm instances is not supported yet."
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
|
||||||
|
attach_instances.append(attach_instance)
|
||||||
|
|
||||||
|
instances_names = ", ".join(
|
||||||
|
instance.name for instance in attach_instances
|
||||||
|
)
|
||||||
|
self.log.info(
|
||||||
|
f"Attaching reviewable to other instances: {instances_names}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Copy the representations of this reviewable instance to the other
|
||||||
|
# instance
|
||||||
|
representations = instance.data.get("representations", [])
|
||||||
|
for attach_instance in attach_instances:
|
||||||
|
self.log.info(f"Attaching to {attach_instance.name}")
|
||||||
|
attach_instance.data.setdefault("representations", []).extend(
|
||||||
|
copy.deepcopy(representations)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Delete representations on the reviewable instance itself
|
||||||
|
for repre in representations:
|
||||||
|
self.log.debug(
|
||||||
|
"Marking representation as deleted because it was "
|
||||||
|
f"attached to other instances instead: {repre}"
|
||||||
|
)
|
||||||
|
repre.setdefault("tags", []).append("delete")
|
||||||
|
|
||||||
|
# Stop integrator from trying to integrate this instance
|
||||||
|
if attach_to:
|
||||||
|
instance.data["integrate"] = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_attr_defs_for_instance(cls, create_context, instance):
|
||||||
|
# TODO: Check if instance is actually a 'reviewable'
|
||||||
|
# Filtering of instance, if needed, can be customized
|
||||||
|
if not cls.instance_matches_plugin_families(instance):
|
||||||
|
return []
|
||||||
|
|
||||||
|
items = []
|
||||||
|
for other_instance in create_context.instances:
|
||||||
|
if other_instance == instance:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Do not allow attaching to other reviewable instances
|
||||||
|
if other_instance.data["productType"] in cls.families:
|
||||||
|
continue
|
||||||
|
|
||||||
|
items.append(
|
||||||
|
{
|
||||||
|
"label": other_instance.label,
|
||||||
|
"value": str(other_instance.id),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
return [
|
||||||
|
EnumDef(
|
||||||
|
"attach",
|
||||||
|
label="Attach reviewable",
|
||||||
|
multiselection=True,
|
||||||
|
items=items,
|
||||||
|
tooltip="Attach this reviewable to another instance",
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
@ -12,6 +12,10 @@ from ayon_server.settings import (
|
||||||
from ayon_server.types import ColorRGBA_uint8
|
from ayon_server.types import ColorRGBA_uint8
|
||||||
|
|
||||||
|
|
||||||
|
class EnabledModel(BaseSettingsModel):
|
||||||
|
enabled: bool = SettingsField(True)
|
||||||
|
|
||||||
|
|
||||||
class ValidateBaseModel(BaseSettingsModel):
|
class ValidateBaseModel(BaseSettingsModel):
|
||||||
_isGroup = True
|
_isGroup = True
|
||||||
enabled: bool = SettingsField(True)
|
enabled: bool = SettingsField(True)
|
||||||
|
|
@ -1040,6 +1044,17 @@ class PublishPuginsModel(BaseSettingsModel):
|
||||||
default_factory=IntegrateHeroVersionModel,
|
default_factory=IntegrateHeroVersionModel,
|
||||||
title="Integrate Hero Version"
|
title="Integrate Hero Version"
|
||||||
)
|
)
|
||||||
|
AttachReviewables: EnabledModel = SettingsField(
|
||||||
|
default_factory=EnabledModel,
|
||||||
|
title="Attach Reviewables",
|
||||||
|
description=(
|
||||||
|
"When enabled, expose an 'Attach Reviewables' attribute on review"
|
||||||
|
" and render instances in the publisher to allow including the"
|
||||||
|
" media to be attached to another instance.\n\n"
|
||||||
|
"If a reviewable is attached to another instance it will not be "
|
||||||
|
"published as a render/review product of its own."
|
||||||
|
)
|
||||||
|
)
|
||||||
CollectRenderedFiles: CollectRenderedFilesModel = SettingsField(
|
CollectRenderedFiles: CollectRenderedFilesModel = SettingsField(
|
||||||
default_factory=CollectRenderedFilesModel,
|
default_factory=CollectRenderedFilesModel,
|
||||||
title="Clean up farm rendered files"
|
title="Clean up farm rendered files"
|
||||||
|
|
@ -1428,6 +1443,9 @@ DEFAULT_PUBLISH_VALUES = {
|
||||||
],
|
],
|
||||||
"use_hardlinks": False
|
"use_hardlinks": False
|
||||||
},
|
},
|
||||||
|
"AttachReviewables": {
|
||||||
|
"enabled": True,
|
||||||
|
},
|
||||||
"CollectRenderedFiles": {
|
"CollectRenderedFiles": {
|
||||||
"remove_files": True
|
"remove_files": True
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue