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"], ) 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..f31bb82e59 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -2,7 +2,9 @@ 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 +427,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. diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_file_dependencies.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_file_dependencies.py new file mode 100644 index 0000000000..ea36ab459c --- /dev/null +++ b/server_addon/blender/client/ayon_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/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" 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 28bcc1e080..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 @@ -162,7 +162,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/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" 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",