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
|