Skip to content

validate_asset_context

Validate if instance folder is the same as context folder.

ValidateCorrectAssetContext

Bases: InstancePlugin, OptionalPyblishPluginMixin

Validator to check if instance folder context match context folder.

When working in per-shot style you always publish data in context of current folder (shot). This validator checks if this is so. It is optional so it can be disabled when needed.

Checking folderPath and task keys.

Source code in client/ayon_nuke/plugins/publish/validate_asset_context.py
 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
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
class ValidateCorrectAssetContext(
    pyblish.api.InstancePlugin,
    OptionalPyblishPluginMixin
):
    """Validator to check if instance folder context match context folder.

    When working in per-shot style you always publish data in context of
    current folder (shot). This validator checks if this is so. It is optional
    so it can be disabled when needed.

    Checking `folderPath` and `task` keys.
    """
    order = ValidateContentsOrder
    label = "Validate Folder context"
    hosts = ["nuke"]
    actions = [
        RepairAction,
        SelectInstanceNodeAction
    ]
    optional = True

    settings_category = "nuke"

    @classmethod
    def apply_settings(cls, project_settings):
        """Apply deprecated settings from project settings.
        """
        nuke_publish = project_settings["nuke"]["publish"]
        if "ValidateCorrectAssetName" in nuke_publish:
            settings = nuke_publish["ValidateCorrectAssetName"]
        else:
            settings = nuke_publish["ValidateCorrectAssetContext"]

        cls.enabled = settings["enabled"]
        cls.optional = settings["optional"]
        cls.active = settings["active"]

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

        invalid_keys = self.get_invalid(instance)

        if not invalid_keys:
            return

        message_values = {
            "node_name": instance.data["transientData"]["node"].name(),
            "correct_values": ", ".join([
                "{} > {}".format(_key, instance.context.data[_key])
                for _key in invalid_keys
            ]),
            "wrong_values": ", ".join([
                "{} > {}".format(_key, instance.data.get(_key))
                for _key in invalid_keys
            ])
        }

        msg = (
            "Instance `{node_name}` has wrong context keys:\n"
            "Correct: `{correct_values}` | Wrong: `{wrong_values}`").format(
                **message_values)

        self.log.debug(msg)

        raise PublishXmlValidationError(
            self, msg, formatting_data=message_values
        )

    @classmethod
    def get_invalid(cls, instance):
        """Get invalid keys from instance data and context data."""

        invalid_keys = []
        testing_keys = ["folderPath", "task"]
        for _key in testing_keys:
            if _key not in instance.data:
                invalid_keys.append(_key)
                continue
            if instance.data[_key] != instance.context.data[_key]:
                invalid_keys.append(_key)

        return invalid_keys

    @classmethod
    def repair(cls, instance):
        """Repair instance data with context data."""
        invalid_keys = cls.get_invalid(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
        )
        for _key in invalid_keys:
            created_instance[_key] = instance.context.data[_key]

        create_context.save_changes()

apply_settings(project_settings) classmethod

Apply deprecated settings from project settings.

Source code in client/ayon_nuke/plugins/publish/validate_asset_context.py
39
40
41
42
43
44
45
46
47
48
49
50
51
@classmethod
def apply_settings(cls, project_settings):
    """Apply deprecated settings from project settings.
    """
    nuke_publish = project_settings["nuke"]["publish"]
    if "ValidateCorrectAssetName" in nuke_publish:
        settings = nuke_publish["ValidateCorrectAssetName"]
    else:
        settings = nuke_publish["ValidateCorrectAssetContext"]

    cls.enabled = settings["enabled"]
    cls.optional = settings["optional"]
    cls.active = settings["active"]

get_invalid(instance) classmethod

Get invalid keys from instance data and context data.

Source code in client/ayon_nuke/plugins/publish/validate_asset_context.py
85
86
87
88
89
90
91
92
93
94
95
96
97
98
@classmethod
def get_invalid(cls, instance):
    """Get invalid keys from instance data and context data."""

    invalid_keys = []
    testing_keys = ["folderPath", "task"]
    for _key in testing_keys:
        if _key not in instance.data:
            invalid_keys.append(_key)
            continue
        if instance.data[_key] != instance.context.data[_key]:
            invalid_keys.append(_key)

    return invalid_keys

repair(instance) classmethod

Repair instance data with context data.

Source code in client/ayon_nuke/plugins/publish/validate_asset_context.py
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
@classmethod
def repair(cls, instance):
    """Repair instance data with context data."""
    invalid_keys = cls.get_invalid(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
    )
    for _key in invalid_keys:
        created_instance[_key] = instance.context.data[_key]

    create_context.save_changes()