Skip to content

create_workfile

CreateWorkfile

Bases: AutoCreator

Workfile auto-creator.

Source code in client/ayon_silhouette/plugins/create/create_workfile.py
  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
125
126
127
128
129
class CreateWorkfile(AutoCreator):
    """Workfile auto-creator."""
    identifier = "io.ayon.creators.silhouette.workfile"
    label = "Workfile"
    product_base_type = "workfile"
    product_type = product_base_type
    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=project_name,
                project_entity=project_entity,
                folder_entity=folder_entity,
                task_entity=task_entity,
                variant=variant,
                host_name=host_name,
            )
            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(
                product_base_type=self.product_base_type,
                product_type=self.product_base_type,
                product_name=product_name,
                data=data,
                creator=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=project_name,
                project_entity=project_entity,
                folder_entity=folder_entity,
                task_entity=task_entity,
                variant=variant,
                host_name=host_name,
                instance=workfile_instance,
            )

            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)

create()

Create workfile instances.

Source code in client/ayon_silhouette/plugins/create/create_workfile.py
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
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=project_name,
            project_entity=project_entity,
            folder_entity=folder_entity,
            task_entity=task_entity,
            variant=variant,
            host_name=host_name,
        )
        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(
            product_base_type=self.product_base_type,
            product_type=self.product_base_type,
            product_name=product_name,
            data=data,
            creator=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=project_name,
            project_entity=project_entity,
            folder_entity=folder_entity,
            task_entity=task_entity,
            variant=variant,
            host_name=host_name,
            instance=workfile_instance,
        )

        workfile_instance["folderPath"] = folder_path
        workfile_instance["task"] = task_name
        workfile_instance["productName"] = product_name

    workfile_instance.transient_data["project"] = fx.activeProject()