Skip to content

validate_unique_subsets

ValidateUniqueSubsets

Bases: ContextPlugin

Ensure all instances have a unique product name

Source code in client/ayon_fusion/plugins/publish/validate_unique_subsets.py
 9
10
11
12
13
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
class ValidateUniqueSubsets(pyblish.api.ContextPlugin):
    """Ensure all instances have a unique product name"""

    order = pyblish.api.ValidatorOrder
    label = "Validate Unique Products"
    families = ["render", "image"]
    hosts = ["fusion"]
    actions = [SelectInvalidAction]

    @classmethod
    def get_invalid(cls, context):

        # Collect instances per product per folder
        instances_per_product_folder = defaultdict(lambda: defaultdict(list))
        for instance in context:
            folder_path = instance.data["folderPath"]
            product_name = instance.data["productName"]
            instances_per_product_folder[folder_path][product_name].append(
                instance
            )

        # Find which folder + subset combination has more than one instance
        # Those are considered invalid because they'd integrate to the same
        # destination.
        invalid = []
        for folder_path, instances_per_product in (
            instances_per_product_folder.items()
        ):
            for product_name, instances in instances_per_product.items():
                if len(instances) > 1:
                    cls.log.warning(
                        (
                            "{folder_path} > {product_name} used by more than "
                            "one instance: {instances}"
                        ).format(
                            folder_path=folder_path,
                            product_name=product_name,
                            instances=instances
                        )
                    )
                    invalid.extend(instances)

        # Return tools for the invalid instances so they can be selected
        invalid = [instance.data["tool"] for instance in invalid]

        return invalid

    def process(self, context):
        invalid = self.get_invalid(context)
        if invalid:
            raise PublishValidationError(
                "Multiple instances are set to the same folder > product.",
                title=self.label
            )