8
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
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
115
116
117
118
119
120
121
122
123
124 | class CreateWorkfile(AutoCreator):
"""Workfile auto-creator."""
identifier = "io.ayon.creators.silhouette.workfile"
label = "Workfile"
product_type = "workfile"
icon = "fa5.file"
project_property_name = "AYON_workfile"
default_variant = "Main"
def create(self):
"""Create workfile instances."""
if not fx.activeProject():
return
workfile_instance = next(
(
instance for instance in self.create_context.instances
if instance.creator_identifier == self.identifier
),
None,
)
project_entity = self.create_context.get_current_project_entity()
project_name = project_entity["name"]
folder_entity = self.create_context.get_current_folder_entity()
folder_path = folder_entity["path"]
task_entity = self.create_context.get_current_task_entity()
task_name = task_entity["name"]
host_name = self.create_context.host_name
variant = self.default_variant
if not workfile_instance:
product_name = self.get_product_name(
project_name,
folder_entity,
task_entity,
variant,
host_name,
project_entity=project_entity
)
data = {
"folderPath": folder_path,
"task": task_name,
"variant": variant,
}
data.update(
self.get_dynamic_data(
project_name,
folder_entity,
task_entity,
variant,
host_name,
workfile_instance,
)
)
self.log.info("Auto-creating workfile instance...")
workfile_instance = CreatedInstance(
self.product_type, product_name, data, self
)
self._add_instance_to_context(workfile_instance)
elif (
workfile_instance["folderPath"] != folder_path
or workfile_instance["task"] != task_name
):
# Update instance context if it's different
product_name = self.get_product_name(
project_name,
folder_entity,
task_entity,
variant,
host_name,
instance=workfile_instance,
project_entity=project_entity
)
workfile_instance["folderPath"] = folder_path
workfile_instance["task"] = task_name
workfile_instance["productName"] = product_name
workfile_instance.transient_data["project"] = fx.activeProject()
def collect_instances(self):
project = fx.activeProject()
if not project:
return
data = lib.read(project, key=self.project_property_name)
if not data:
return
data["instance_id"] = project.id + "_workfile"
# Add instance
created_instance = CreatedInstance.from_existing(data, self)
# Collect transient data
created_instance.transient_data["project"] = project
# Add instance to create context
self._add_instance_to_context(created_instance)
def update_instances(self, update_list):
for created_inst, _changes in update_list:
project = created_inst.transient_data["project"]
new_data = created_inst.data_to_store()
new_data.pop("instance_id", None)
lib.imprint(project, new_data, key=self.project_property_name)
def remove_instances(self, instances):
for instance in instances:
project = instance.transient_data["project"]
lib.imprint(project, data=None, key=self.project_property_name)
self._remove_instance_from_context(instance)
|