Skip to content

validate_instance_in_context

Validate if instance asset is the same as context asset.

ValidateInstanceInContextHoudini

Bases: HoudiniInstancePlugin, 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.

Source code in client/ayon_houdini/plugins/publish/validate_instance_in_context.py
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class ValidateInstanceInContextHoudini(plugin.HoudiniInstancePlugin,
                                       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
    actions = [SelectROPAction, RepairAction]

    def process(self, instance):
        if not self.is_active(instance.data):
            return

        attr_values = self.get_attr_values_from_data(instance.data)
        if not attr_values and not instance.data.get("instance_node"):
            # Skip instances that do not have the attr values because that
            # hints these are runtime-instances, like e.g. USD layer
            # contributions. We will confirm that by checking these do not
            # have an instance node. We do not need to check these because they
            # 'spawn off' from an original instance that has the check itself.
            return

        folder_path = instance.data.get("folderPath")
        task = instance.data.get("task")
        context = self.get_context(instance)
        if (folder_path, task) != context:
            context_label = "{} > {}".format(*context)
            instance_label = "{} > {}".format(folder_path, 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_folder, context_task = cls.get_context(instance)

        create_context = instance.context.data["create_context"]
        instance_id = instance.data["instance_id"]
        created_instance = create_context.get_instance_by_id(
            instance_id
        )
        created_instance["folderPath"] = context_folder
        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"]

get_context(instance) staticmethod

Return folderPath, task from publishing context data

Source code in client/ayon_houdini/plugins/publish/validate_instance_in_context.py
80
81
82
83
84
@staticmethod
def get_context(instance):
    """Return folderPath, task from publishing context data"""
    context = instance.context
    return context.data["folderPath"], context.data["task"]