From 2f98c006b2c80ab798b39cf5593cc9f27bc80b5d Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Fri, 10 May 2024 16:45:05 +0100 Subject: [PATCH 1/6] Implemented deadline file dependencies for Blender --- .../publish/collect_file_dependencies.py | 36 +++++++++++++++++++ .../publish/submit_blender_deadline.py | 13 ++++++- server_addon/deadline/package.py | 2 +- .../server/settings/publish_plugins.py | 2 ++ 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 client/ayon_core/hosts/blender/plugins/publish/collect_file_dependencies.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_file_dependencies.py b/client/ayon_core/hosts/blender/plugins/publish/collect_file_dependencies.py new file mode 100644 index 0000000000..ea36ab459c --- /dev/null +++ b/client/ayon_core/hosts/blender/plugins/publish/collect_file_dependencies.py @@ -0,0 +1,36 @@ +from pathlib import Path + +import pyblish.api + +import bpy + + +class CollectFileDependencies(pyblish.api.ContextPlugin): + """Gather all files referenced in this scene.""" + + label = "Collect File Dependencies" + order = pyblish.api.CollectorOrder - 0.49 + hosts = ["blender"] + families = ["render"] + + @classmethod + def apply_settings(cls, project_settings): + # Disable plug-in if not used for deadline submission anyway + settings = project_settings["deadline"]["publish"]["BlenderSubmitDeadline"] # noqa + cls.enabled = settings.get("asset_dependencies", True) + + def process(self, context): + dependencies = set() + + # Add alembic files as dependencies + for cache in bpy.data.cache_files: + dependencies.add( + Path(bpy.path.abspath(cache.filepath)).resolve().as_posix()) + + # Add image files as dependencies + for image in bpy.data.images: + if image.filepath: + dependencies.add(Path( + bpy.path.abspath(image.filepath)).resolve().as_posix()) + + context.data["fileDependencies"] = list(dependencies) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py index f5805beb5c..94fc8ed96d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py @@ -40,6 +40,17 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, group = None job_delay = "00:00:00:00" + @classmethod + def apply_settings(cls, project_settings): + settings = project_settings["deadline"]["publish"]["BlenderSubmitDeadline"] # noqa + + # Take some defaults from settings + cls.asset_dependencies = settings.get("asset_dependencies", + cls.asset_dependencies) + cls.use_published = settings.get("use_published", cls.use_published) + cls.priority = settings.get("priority", cls.priority) + cls.group = settings.get("group", cls.group) + def get_job_info(self): job_info = DeadlineJobInfo(Plugin="Blender") @@ -161,7 +172,7 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, return plugin_payload - def process_submission(self): + def process_submission(self, auth=None): instance = self._instance expected_files = instance.data["expectedFiles"] diff --git a/server_addon/deadline/package.py b/server_addon/deadline/package.py index 25ba1c1166..e26734c813 100644 --- a/server_addon/deadline/package.py +++ b/server_addon/deadline/package.py @@ -1,3 +1,3 @@ name = "deadline" title = "Deadline" -version = "0.1.11" +version = "0.1.12" diff --git a/server_addon/deadline/server/settings/publish_plugins.py b/server_addon/deadline/server/settings/publish_plugins.py index 784ad2560b..85a93d49cd 100644 --- a/server_addon/deadline/server/settings/publish_plugins.py +++ b/server_addon/deadline/server/settings/publish_plugins.py @@ -270,6 +270,7 @@ class BlenderSubmitDeadlineModel(BaseSettingsModel): optional: bool = SettingsField(title="Optional") active: bool = SettingsField(title="Active") use_published: bool = SettingsField(title="Use Published scene") + asset_dependencies: bool = SettingsField(title="Use Asset dependencies") priority: int = SettingsField(title="Priority") chunk_size: int = SettingsField(title="Frame per Task") group: str = SettingsField("", title="Group Name") @@ -413,6 +414,7 @@ DEFAULT_DEADLINE_PLUGINS_SETTINGS = { "optional": False, "active": True, "use_published": True, + "asset_dependencies": True, "priority": 50, "chunk_size": 10, "group": "none", From ce44538c2e608049f316aec0b9f475bc9accf800 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Tue, 18 Jun 2024 10:40:54 +0100 Subject: [PATCH 2/6] Removed unused function --- .../plugins/publish/submit_blender_deadline.py | 11 ----------- server_addon/deadline/client/ayon_deadline/version.py | 2 +- server_addon/deadline/package.py | 2 +- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_blender_deadline.py b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_blender_deadline.py index f12e6a0760..479dffdcc4 100644 --- a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_blender_deadline.py +++ b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_blender_deadline.py @@ -41,17 +41,6 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, group = None job_delay = "00:00:00:00" - @classmethod - def apply_settings(cls, project_settings): - settings = project_settings["deadline"]["publish"]["BlenderSubmitDeadline"] # noqa - - # Take some defaults from settings - cls.asset_dependencies = settings.get("asset_dependencies", - cls.asset_dependencies) - cls.use_published = settings.get("use_published", cls.use_published) - cls.priority = settings.get("priority", cls.priority) - cls.group = settings.get("group", cls.group) - def get_job_info(self): job_info = DeadlineJobInfo(Plugin="Blender") diff --git a/server_addon/deadline/client/ayon_deadline/version.py b/server_addon/deadline/client/ayon_deadline/version.py index 5baf5122fb..da619d2a42 100644 --- a/server_addon/deadline/client/ayon_deadline/version.py +++ b/server_addon/deadline/client/ayon_deadline/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'deadline' version.""" -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/server_addon/deadline/package.py b/server_addon/deadline/package.py index 7e7bae8bd6..5696c60dc6 100644 --- a/server_addon/deadline/package.py +++ b/server_addon/deadline/package.py @@ -1,6 +1,6 @@ name = "deadline" title = "Deadline" -version = "0.2.0" +version = "0.2.1" client_dir = "ayon_deadline" From 7dc954fa8313439152b9fd83e913709d44d51219 Mon Sep 17 00:00:00 2001 From: Simone Barbieri Date: Tue, 18 Jun 2024 10:51:43 +0100 Subject: [PATCH 3/6] Bumped blender version --- server_addon/blender/client/ayon_blender/version.py | 2 +- server_addon/blender/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/version.py b/server_addon/blender/client/ayon_blender/version.py index 365c44e71b..c21b06a8de 100644 --- a/server_addon/blender/client/ayon_blender/version.py +++ b/server_addon/blender/client/ayon_blender/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'blender' version.""" -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/server_addon/blender/package.py b/server_addon/blender/package.py index 4e0ac112e1..1b595e22da 100644 --- a/server_addon/blender/package.py +++ b/server_addon/blender/package.py @@ -1,6 +1,6 @@ name = "blender" title = "Blender" -version = "0.2.0" +version = "0.2.1" client_dir = "ayon_blender" From 2322d0f2ad1a88e00ae3febf4e16ba8d1ea6d90c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:01:51 +0200 Subject: [PATCH 4/6] safe access to shortName on folder type --- client/ayon_core/tools/common_models/projects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index 90b75e15c1..4e8925388d 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -89,7 +89,7 @@ class FolderTypeItem: def from_project_item(cls, folder_type_data): return cls( name=folder_type_data["name"], - short=folder_type_data["shortName"], + short=folder_type_data.get("shortName", ""), icon=folder_type_data["icon"], ) From 59e49182be07bc5758349165cc07d18ae87c10f4 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:02:22 +0200 Subject: [PATCH 5/6] capture errors and add basic handle of the crash --- .../ayon_core/tools/utils/folders_widget.py | 6 ++++- client/ayon_core/tools/utils/lib.py | 22 ++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/utils/folders_widget.py b/client/ayon_core/tools/utils/folders_widget.py index 3b53266c9f..bb75f3b6e5 100644 --- a/client/ayon_core/tools/utils/folders_widget.py +++ b/client/ayon_core/tools/utils/folders_widget.py @@ -192,7 +192,11 @@ class FoldersQtModel(QtGui.QStandardItemModel): or thread_id != self._current_refresh_thread.id ): return - folder_items, folder_type_items = thread.get_result() + if thread.failed: + # TODO visualize that refresh failed + folder_items, folder_type_items = {}, {} + else: + folder_items, folder_type_items = thread.get_result() self._fill_items(folder_items, folder_type_items) self._current_refresh_thread = None diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index e0626ec1db..5a7feb05eb 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -2,7 +2,10 @@ import os import sys import contextlib import collections +import traceback from functools import partial +from typing import Union, Any + from qtpy import QtWidgets, QtCore, QtGui import qtawesome @@ -425,26 +428,39 @@ class RefreshThread(QtCore.QThread): self._id = thread_id self._callback = partial(func, *args, **kwargs) self._exception = None + self._traceback = None self._result = None self.finished.connect(self._on_finish_callback) @property - def id(self): + def id(self) -> str: return self._id @property - def failed(self): + def failed(self) -> bool: return self._exception is not None def run(self): try: self._result = self._callback() except Exception as exc: + exc_type, exc_value, exc_traceback = sys.exc_info() + err_traceback = "".join(traceback.format_exception( + exc_type, exc_value, exc_traceback + )) + print(err_traceback) + self._traceback = err_traceback self._exception = exc - def get_result(self): + def get_result(self) -> Any: return self._result + def get_exception(self) -> Union[BaseException, None]: + return self._exception + + def get_traceback(self) -> Union[str, None]: + return self._traceback + def _on_finish_callback(self): """Trigger custom signal with thread id. From 9d8a8a98918ac125d583cf789ce50340e938e371 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 18 Jun 2024 12:12:03 +0200 Subject: [PATCH 6/6] remove unnecessary line --- client/ayon_core/tools/utils/lib.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index 5a7feb05eb..f31bb82e59 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -6,7 +6,6 @@ import traceback from functools import partial from typing import Union, Any - from qtpy import QtWidgets, QtCore, QtGui import qtawesome import qtmaterialsymbols