Skip to content

collect_ftrack_family

Requires

none

Provides

instance -> families ([])

CollectFtrackFamily

Bases: FtrackPublishInstancePlugin

Adds explicitly 'ftrack' 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 ftrack based on 'families' (editorial drives it by presence of 'review')

Source code in client/ayon_ftrack/plugins/publish/collect_ftrack_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 CollectFtrackFamily(plugin.FtrackPublishInstancePlugin):
    """Adds explicitly 'ftrack' 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 ftrack
    based on 'families' (editorial drives it by presence of 'review')
    """

    label = "Collect ftrack 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 ftrack 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_ftrack_family = False
        families = instance.data.setdefault("families", [])

        if profile:
            add_ftrack_family = profile["add_ftrack_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_ftrack_family = self._get_add_ftrack_f_from_addit_filters(
                    additional_filters,
                    families_set,
                    add_ftrack_family
                )

        result_str = "Not adding"
        if add_ftrack_family:
            result_str = "Adding"
            if "ftrack" not in families:
                families.append("ftrack")

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

    def _get_add_ftrack_f_from_addit_filters(
        self, additional_filters, families, add_ftrack_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
        ftrack)

        Args:
            additional_filters (dict) - from Setting
            families (set[str]) - subfamilies
            add_ftrack_family (bool) - add ftrack 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_ftrack_family = override_filter["add_ftrack_family"]

        return add_ftrack_family