Skip to content

collect_kitsu_family

Requires

none

Provides

instance -> families ([])

CollectKitsuFamily

Bases: KitsuPublishInstancePlugin

Adds explicitly 'kitsu' to families to upload instance to FTrack.

Uses selection by combination of hosts/families/tasks names via profiles resolution.

Triggered everywhere, checks instance against configured.

Checks advanced filtering which works on 'families' not on main 'family', as some variants dynamically resolves addition of kitsu based on 'families' (editorial drives it by presence of 'review')

Source code in client/ayon_kitsu/plugins/publish/collect_kitsu_family.py
 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
 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
class CollectKitsuFamily(plugin.KitsuPublishInstancePlugin):
    """Adds explicitly 'kitsu' to families to upload instance to FTrack.

    Uses selection by combination of hosts/families/tasks names via
    profiles resolution.

    Triggered everywhere, checks instance against configured.

    Checks advanced filtering which works on 'families' not on main
    'family', as some variants dynamically resolves addition of kitsu
    based on 'families' (editorial drives it by presence of 'review')
    """

    label = "Collect Kitsu Family"
    order = pyblish.api.CollectorOrder + 0.4990

    profiles = None

    def process(self, instance):
        if not self.profiles:
            self.log.warning("No profiles present for adding Kitsu family")
            return

        host_name = instance.context.data["hostName"]
        product_type = instance.data["productType"]
        task_name = instance.data.get("task")

        filtering_criteria = {
            "host_names": host_name,
            "product_types": product_type,
            "task_names": task_name
        }
        profile = filter_profiles(
            self.profiles,
            filtering_criteria,
            logger=self.log
        )

        add_kitsu_family = False
        families = instance.data.setdefault("families", [])

        if profile:
            add_kitsu_family = profile["add_kitsu_family"]
            additional_filters = profile.get("advanced_filtering")
            if additional_filters:
                families_set = set(families) | {product_type}
                self.log.info(
                    "'{}' families used for additional filtering".format(
                        families_set))
                add_kitsu_family = self._get_add_kitsu_f_from_addit_filters(
                    additional_filters,
                    families_set,
                    add_kitsu_family
                )

        result_str = "Not adding"
        if add_kitsu_family:
            result_str = "Adding"
            if "kitsu" not in families:
                families.append("kitsu")

        self.log.debug("{} 'kitsu' family for instance with '{}'".format(
            result_str, product_type
        ))

    def _get_add_kitsu_f_from_addit_filters(
        self, additional_filters, families, add_kitsu_family
    ):
        """Compares additional filters - working on instance's families.

        Triggered for more detailed filtering when main family matches,
        but content of 'families' actually matter.
        (For example 'review' in 'families' should result in adding to
        Kitsu)

        Args:
            additional_filters (dict) - from Setting
            families (set[str]) - subfamilies
            add_kitsu_family (bool) - add kitsu to families if True
        """

        override_filter = None
        override_filter_value = -1
        for additional_filter in additional_filters:
            filter_families = set(additional_filter["families"])
            valid = filter_families <= set(families)  # issubset
            if not valid:
                continue

            value = len(filter_families)
            if value > override_filter_value:
                override_filter = additional_filter
                override_filter_value = value

        if override_filter:
            add_kitsu_family = override_filter["add_kitsu_family"]

        return add_kitsu_family