From 8166e4b8236676307951cd754c49c25b1792e321 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:15:28 +0200 Subject: [PATCH 01/12] pass in sender --- client/ayon_core/tools/utils/tasks_widget.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/utils/tasks_widget.py b/client/ayon_core/tools/utils/tasks_widget.py index 314521b6b0..bba7b93925 100644 --- a/client/ayon_core/tools/utils/tasks_widget.py +++ b/client/ayon_core/tools/utils/tasks_widget.py @@ -191,12 +191,12 @@ class TasksQtModel(QtGui.QStandardItemModel): def _thread_getter(self, project_name, folder_id): task_items = self._controller.get_task_items( - project_name, folder_id + project_name, folder_id, sender=TASKS_MODEL_SENDER_NAME ) task_type_items = {} if hasattr(self._controller, "get_task_type_items"): task_type_items = self._controller.get_task_type_items( - project_name + project_name, sender=TASKS_MODEL_SENDER_NAME ) return task_items, task_type_items @@ -580,6 +580,7 @@ class TasksWidget(QtWidgets.QWidget): return if expected_data is None: expected_data = self._controller.get_expected_selection_data() + folder_data = expected_data.get("folder") task_data = expected_data.get("task") if ( From 50b4779ad35ec7cc2f793b467c4d5f2eedd0bcf3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:15:41 +0200 Subject: [PATCH 02/12] wait for refresh to finish --- client/ayon_core/tools/common_models/hierarchy.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/common_models/hierarchy.py b/client/ayon_core/tools/common_models/hierarchy.py index a90e06a63b..f92563db20 100644 --- a/client/ayon_core/tools/common_models/hierarchy.py +++ b/client/ayon_core/tools/common_models/hierarchy.py @@ -1,3 +1,4 @@ +import time import collections import contextlib from abc import ABCMeta, abstractmethod @@ -535,13 +536,15 @@ class HierarchyModel(object): def _refresh_tasks_cache(self, project_name, folder_id, sender=None): if folder_id in self._tasks_refreshing: + while folder_id in self._tasks_refreshing: + time.sleep(0.01) return + cache = self._task_items[project_name][folder_id] with self._task_refresh_event_manager( project_name, folder_id, sender ): - task_items = self._query_tasks(project_name, folder_id) - self._task_items[project_name][folder_id] = task_items + cache.update_data(self._query_tasks(project_name, folder_id)) def _query_tasks(self, project_name, folder_id): tasks = list(ayon_api.get_tasks( From e6192095d4b47b41797a72402598d178cf1ff9ad Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 17 Jun 2024 17:32:08 +0200 Subject: [PATCH 03/12] AY-5750 - put order after collect_review This plugin depends on review in families logic which got put there only after this plugin (because of previous move order to accommodate deadline collection data). This plugin must run after collect_review BUT before collect DL credentials! --- .../plugins/publish/collect_render.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py index 3508512cba..9615154185 100644 --- a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py +++ b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py @@ -23,8 +23,16 @@ class AERenderInstance(RenderInstance): class CollectAERender(publish.AbstractCollectRender): + """Prepares RenderInstance. - order = pyblish.api.CollectorOrder + 0.100 + RenderInstance is meant to replace simple dictionaries to provide code + assist and typing. (Currently used only in AE, Harmony though.) + + This must run after `collect_review`, but before Deadline plugins (which + should be run only on renderable instances.) + """ + + order = pyblish.api.CollectorOrder + 0.125 label = "Collect After Effects Render Layers" hosts = ["aftereffects"] From fa747699c21018ed021d7930ad98ef46cec7febb Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 17 Jun 2024 17:32:38 +0200 Subject: [PATCH 04/12] AY-5750 - fix superfluous space --- .../client/ayon_aftereffects/plugins/create/create_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/aftereffects/client/ayon_aftereffects/plugins/create/create_render.py b/server_addon/aftereffects/client/ayon_aftereffects/plugins/create/create_render.py index eafe845247..8e44b51a1c 100644 --- a/server_addon/aftereffects/client/ayon_aftereffects/plugins/create/create_render.py +++ b/server_addon/aftereffects/client/ayon_aftereffects/plugins/create/create_render.py @@ -94,7 +94,7 @@ class RenderCreator(Creator): new_instance.creator_attributes["farm"] = use_farm review = pre_create_data["mark_for_review"] - new_instance. creator_attributes["mark_for_review"] = review + new_instance.creator_attributes["mark_for_review"] = review api.get_stub().imprint(new_instance.id, new_instance.data_to_store()) From f7e9e413fbd69fdc83b34b26d4fded69abcec2fe Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 17 Jun 2024 18:22:18 +0200 Subject: [PATCH 05/12] AY-5750 - fix single frame render Without it will render frame 0 which might result in black image instead of correct frame (1001). --- .../plugins/publish/submit_aftereffects_deadline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py index 9ca077d162..c61e6cd35b 100644 --- a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py +++ b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py @@ -57,7 +57,7 @@ class AfterEffectsSubmitDeadline( dln_job_info.Plugin = "AfterEffects" dln_job_info.UserName = context.data.get( "deadlineUser", getpass.getuser()) - if self._instance.data["frameEnd"] > self._instance.data["frameStart"]: + if self._instance.data["frameEnd"] >= self._instance.data["frameStart"]: # noqa # Deadline requires integers in frame range frame_range = "{}-{}".format( int(round(self._instance.data["frameStart"])), From 50f39e4f5e4f006c046d8b7176c2313a7c5c45c7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Mon, 17 Jun 2024 18:24:48 +0200 Subject: [PATCH 06/12] AY-5750 - removed folderPath from expected_files Folder path messed up os.path.join, resulting in wrong file path pointing to c:/file_name.png. Folder path is actually not needed here, it is already included in base_dir. --- .../plugins/publish/collect_render.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py index 9615154185..e0cf1b10d6 100644 --- a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py +++ b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py @@ -181,24 +181,25 @@ class CollectAERender(publish.AbstractCollectRender): _, ext = os.path.splitext(os.path.basename(file_name)) ext = ext.replace('.', '') version_str = "v{:03d}".format(render_instance.version) - if "#" not in file_name: # single frame (mov)W - path = os.path.join(base_dir, "{}_{}_{}.{}".format( - render_instance.folderPath, + if "#" not in file_name: # single frame (mov) + file_name = "{}_{}.{}".format( render_instance.productName, version_str, ext - )) - expected_files.append(path) + ) + file_path = os.path.join(base_dir, file_name) + expected_files.append(file_path) else: for frame in range(start, end + 1): - path = os.path.join(base_dir, "{}_{}_{}.{}.{}".format( - render_instance.folderPath, + file_name = "{}_{}.{}.{}".format( render_instance.productName, version_str, str(frame).zfill(self.padding_width), ext - )) - expected_files.append(path) + ) + + file_path = os.path.join(base_dir, file_name) + expected_files.append(file_path) return expected_files def _get_output_dir(self, render_instance): From b62d40ffd9da18a66873c78b2fd1280c15eed365 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 18 Jun 2024 11:11:48 +0200 Subject: [PATCH 07/12] AY-5750 - fix wrong looping --- .../ayon_aftereffects/plugins/publish/collect_render.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py index e0cf1b10d6..e550e73709 100644 --- a/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py +++ b/server_addon/aftereffects/client/ayon_aftereffects/plugins/publish/collect_render.py @@ -198,8 +198,8 @@ class CollectAERender(publish.AbstractCollectRender): ext ) - file_path = os.path.join(base_dir, file_name) - expected_files.append(file_path) + file_path = os.path.join(base_dir, file_name) + expected_files.append(file_path) return expected_files def _get_output_dir(self, render_instance): From 5872d2b3ee786eaabfbd0d66c1d66860b18e713a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 18 Jun 2024 11:14:47 +0200 Subject: [PATCH 08/12] AY-5750 - remove unnecessary condition --- .../plugins/publish/submit_aftereffects_deadline.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py index c61e6cd35b..a7be38bf3b 100644 --- a/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py +++ b/server_addon/deadline/client/ayon_deadline/plugins/publish/submit_aftereffects_deadline.py @@ -57,12 +57,11 @@ class AfterEffectsSubmitDeadline( dln_job_info.Plugin = "AfterEffects" dln_job_info.UserName = context.data.get( "deadlineUser", getpass.getuser()) - if self._instance.data["frameEnd"] >= self._instance.data["frameStart"]: # noqa - # Deadline requires integers in frame range - frame_range = "{}-{}".format( - int(round(self._instance.data["frameStart"])), - int(round(self._instance.data["frameEnd"]))) - dln_job_info.Frames = frame_range + # Deadline requires integers in frame range + frame_range = "{}-{}".format( + int(round(self._instance.data["frameStart"])), + int(round(self._instance.data["frameEnd"]))) + dln_job_info.Frames = frame_range dln_job_info.Priority = self.priority dln_job_info.Pool = self._instance.data.get("primaryPool") 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 09/12] 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 10/12] 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 11/12] 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 From 0fab2e5edbdf29b1856468ea31c5b8c779a2caff Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:44:07 +0200 Subject: [PATCH 12/12] bump versions --- server_addon/aftereffects/client/ayon_aftereffects/version.py | 2 +- server_addon/aftereffects/package.py | 2 +- server_addon/deadline/client/ayon_deadline/version.py | 2 +- server_addon/deadline/package.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server_addon/aftereffects/client/ayon_aftereffects/version.py b/server_addon/aftereffects/client/ayon_aftereffects/version.py index 2faa06ba3a..4e371a2467 100644 --- a/server_addon/aftereffects/client/ayon_aftereffects/version.py +++ b/server_addon/aftereffects/client/ayon_aftereffects/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'aftereffects' version.""" -__version__ = "0.2.1" +__version__ = "0.2.2" diff --git a/server_addon/aftereffects/package.py b/server_addon/aftereffects/package.py index 37a54b4212..eabba27df1 100644 --- a/server_addon/aftereffects/package.py +++ b/server_addon/aftereffects/package.py @@ -1,6 +1,6 @@ name = "aftereffects" title = "AfterEffects" -version = "0.2.1" +version = "0.2.2" client_dir = "ayon_aftereffects" 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"