Merge branch 'develop' into bugfix/AY-5750_AE-review-not-displayed-in-Ftrack

This commit is contained in:
Jakub Trllo 2024-06-18 13:45:36 +02:00 committed by GitHub
commit 95c72a135e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 73 additions and 12 deletions

View file

@ -1,3 +1,4 @@
import time
import collections import collections
import contextlib import contextlib
from abc import ABCMeta, abstractmethod from abc import ABCMeta, abstractmethod
@ -535,13 +536,15 @@ class HierarchyModel(object):
def _refresh_tasks_cache(self, project_name, folder_id, sender=None): def _refresh_tasks_cache(self, project_name, folder_id, sender=None):
if folder_id in self._tasks_refreshing: if folder_id in self._tasks_refreshing:
while folder_id in self._tasks_refreshing:
time.sleep(0.01)
return return
cache = self._task_items[project_name][folder_id]
with self._task_refresh_event_manager( with self._task_refresh_event_manager(
project_name, folder_id, sender project_name, folder_id, sender
): ):
task_items = self._query_tasks(project_name, folder_id) cache.update_data(self._query_tasks(project_name, folder_id))
self._task_items[project_name][folder_id] = task_items
def _query_tasks(self, project_name, folder_id): def _query_tasks(self, project_name, folder_id):
tasks = list(ayon_api.get_tasks( tasks = list(ayon_api.get_tasks(

View file

@ -89,7 +89,7 @@ class FolderTypeItem:
def from_project_item(cls, folder_type_data): def from_project_item(cls, folder_type_data):
return cls( return cls(
name=folder_type_data["name"], name=folder_type_data["name"],
short=folder_type_data["shortName"], short=folder_type_data.get("shortName", ""),
icon=folder_type_data["icon"], icon=folder_type_data["icon"],
) )

View file

@ -192,7 +192,11 @@ class FoldersQtModel(QtGui.QStandardItemModel):
or thread_id != self._current_refresh_thread.id or thread_id != self._current_refresh_thread.id
): ):
return 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._fill_items(folder_items, folder_type_items)
self._current_refresh_thread = None self._current_refresh_thread = None

View file

@ -2,7 +2,9 @@ import os
import sys import sys
import contextlib import contextlib
import collections import collections
import traceback
from functools import partial from functools import partial
from typing import Union, Any
from qtpy import QtWidgets, QtCore, QtGui from qtpy import QtWidgets, QtCore, QtGui
import qtawesome import qtawesome
@ -425,26 +427,39 @@ class RefreshThread(QtCore.QThread):
self._id = thread_id self._id = thread_id
self._callback = partial(func, *args, **kwargs) self._callback = partial(func, *args, **kwargs)
self._exception = None self._exception = None
self._traceback = None
self._result = None self._result = None
self.finished.connect(self._on_finish_callback) self.finished.connect(self._on_finish_callback)
@property @property
def id(self): def id(self) -> str:
return self._id return self._id
@property @property
def failed(self): def failed(self) -> bool:
return self._exception is not None return self._exception is not None
def run(self): def run(self):
try: try:
self._result = self._callback() self._result = self._callback()
except Exception as exc: 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 self._exception = exc
def get_result(self): def get_result(self) -> Any:
return self._result 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): def _on_finish_callback(self):
"""Trigger custom signal with thread id. """Trigger custom signal with thread id.

View file

@ -191,12 +191,12 @@ class TasksQtModel(QtGui.QStandardItemModel):
def _thread_getter(self, project_name, folder_id): def _thread_getter(self, project_name, folder_id):
task_items = self._controller.get_task_items( task_items = self._controller.get_task_items(
project_name, folder_id project_name, folder_id, sender=TASKS_MODEL_SENDER_NAME
) )
task_type_items = {} task_type_items = {}
if hasattr(self._controller, "get_task_type_items"): if hasattr(self._controller, "get_task_type_items"):
task_type_items = 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 return task_items, task_type_items
@ -580,6 +580,7 @@ class TasksWidget(QtWidgets.QWidget):
return return
if expected_data is None: if expected_data is None:
expected_data = self._controller.get_expected_selection_data() expected_data = self._controller.get_expected_selection_data()
folder_data = expected_data.get("folder") folder_data = expected_data.get("folder")
task_data = expected_data.get("task") task_data = expected_data.get("task")
if ( if (

View file

@ -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)

View file

@ -1,3 +1,3 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Package declaring AYON addon 'blender' version.""" """Package declaring AYON addon 'blender' version."""
__version__ = "0.2.0" __version__ = "0.2.1"

View file

@ -1,6 +1,6 @@
name = "blender" name = "blender"
title = "Blender" title = "Blender"
version = "0.2.0" version = "0.2.1"
client_dir = "ayon_blender" client_dir = "ayon_blender"

View file

@ -162,7 +162,7 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline,
return plugin_payload return plugin_payload
def process_submission(self): def process_submission(self, auth=None):
instance = self._instance instance = self._instance
expected_files = instance.data["expectedFiles"] expected_files = instance.data["expectedFiles"]

View file

@ -270,6 +270,7 @@ class BlenderSubmitDeadlineModel(BaseSettingsModel):
optional: bool = SettingsField(title="Optional") optional: bool = SettingsField(title="Optional")
active: bool = SettingsField(title="Active") active: bool = SettingsField(title="Active")
use_published: bool = SettingsField(title="Use Published scene") use_published: bool = SettingsField(title="Use Published scene")
asset_dependencies: bool = SettingsField(title="Use Asset dependencies")
priority: int = SettingsField(title="Priority") priority: int = SettingsField(title="Priority")
chunk_size: int = SettingsField(title="Frame per Task") chunk_size: int = SettingsField(title="Frame per Task")
group: str = SettingsField("", title="Group Name") group: str = SettingsField("", title="Group Name")
@ -413,6 +414,7 @@ DEFAULT_DEADLINE_PLUGINS_SETTINGS = {
"optional": False, "optional": False,
"active": True, "active": True,
"use_published": True, "use_published": True,
"asset_dependencies": True,
"priority": 50, "priority": 50,
"chunk_size": 10, "chunk_size": 10,
"group": "none", "group": "none",