Add Validate Instance In Context validator in Houdini

This commit is contained in:
Roy Nieterau 2024-02-06 13:34:36 +01:00 committed by MustafaJafar
parent 5628a93e3f
commit 98ee8a0486

View file

@ -0,0 +1,76 @@
# -*- coding: utf-8 -*-
"""Validate if instance asset is the same as context asset."""
import pyblish.api
from ayon_core.hosts.houdini.api.action import SelectROPAction
from ayon_core.pipeline.publish import (
RepairAction,
ValidateContentsOrder,
PublishValidationError,
OptionalPyblishPluginMixin
)
class ValidateInstanceInContextHoudini(pyblish.api.InstancePlugin,
OptionalPyblishPluginMixin):
"""Validator to check if instance asset match context asset.
When working in per-shot style you always publish data in context of
current asset (shot). This validator checks if this is so. It is optional
so it can be disabled when needed.
"""
# Similar to maya-equivalent `ValidateInstanceInContext`
order = ValidateContentsOrder
label = "Instance in same Context"
optional = True
hosts = ["houdini"]
actions = [SelectROPAction, RepairAction]
def process(self, instance):
if not self.is_active(instance.data):
return
folderPath = instance.data.get("folderPath")
task = instance.data.get("task")
context = self.get_context(instance)
if (folderPath, task) != context:
context_label = "{} > {}".format(*context)
instance_label = "{} > {}".format(folderPath, task)
raise PublishValidationError(
message=(
"Instance '{}' publishes to different asset than current "
"context: {}. Current context: {}".format(
instance.name, instance_label, context_label
)
),
description=(
"## Publishing to a different asset\n"
"There are publish instances present which are publishing "
"into a different asset than your current context.\n\n"
"Usually this is not what you want but there can be cases "
"where you might want to publish into another asset or "
"shot. If that's the case you can disable the validation "
"on the instance to ignore it."
)
)
@classmethod
def repair(cls, instance):
context_asset, context_task = cls.get_context(instance)
create_context = instance.context.data["create_context"]
instance_id = instance.data.get("instance_id")
created_instance = create_context.get_instance_by_id(
instance_id
)
created_instance["folderPath"] = context_asset
created_instance["task"] = context_task
create_context.save_changes()
@staticmethod
def get_context(instance):
"""Return folderPath, task from publishing context data"""
context = instance.context
return context.data["folderPath"], context.data["task"]