Merge branch 'develop' into enhancement/OP-8198_RoyalRender-use-AYON-settings

# Conflicts:
#	client/ayon_core/settings/ayon_settings.py
This commit is contained in:
Jakub Trllo 2024-02-16 16:05:03 +01:00
commit 1d1d6da1bd
5 changed files with 152 additions and 45 deletions

View file

@ -4,7 +4,7 @@ import six
import sys
from ayon_core.lib import requests_get, Logger
from ayon_core.modules import OpenPypeModule, IPluginPaths
from ayon_core.modules import AYONAddon, IPluginPaths
class DeadlineWebserviceError(Exception):
@ -13,28 +13,28 @@ class DeadlineWebserviceError(Exception):
"""
class DeadlineModule(OpenPypeModule, IPluginPaths):
class DeadlineModule(AYONAddon, IPluginPaths):
name = "deadline"
def __init__(self, manager, settings):
self.deadline_urls = {}
super(DeadlineModule, self).__init__(manager, settings)
def initialize(self, modules_settings):
def initialize(self, studio_settings):
# This module is always enabled
deadline_settings = modules_settings[self.name]
self.enabled = deadline_settings["enabled"]
deadline_url = deadline_settings.get("DEADLINE_REST_URL")
if deadline_url:
self.deadline_urls = {"default": deadline_url}
else:
self.deadline_urls = deadline_settings.get("deadline_urls") # noqa: E501
deadline_urls = {}
enabled = self.name in studio_settings
if enabled:
deadline_settings = studio_settings[self.name]
deadline_urls = {
url_item["name"]: url_item["value"]
for url_item in deadline_settings["deadline_urls"]
}
if not self.deadline_urls:
self.enabled = False
self.log.warning(("default Deadline Webservice URL "
"not specified. Disabling module."))
return
if enabled and not deadline_urls:
enabled = False
self.log.warning((
"Deadline Webservice URLs are not specified. Disabling addon."
))
self.enabled = enabled
self.deadline_urls = deadline_urls
def get_plugin_paths(self):
"""Deadline plugin paths."""

View file

@ -47,11 +47,11 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
deadline_settings = (
render_instance.context.data
["system_settings"]
["modules"]
["deadline"]
)
default_server = render_instance.context.data["defaultDeadline"]
# QUESTION How and where is this is set? Should be removed?
instance_server = render_instance.data.get("deadlineServers")
if not instance_server:
self.log.debug("Using default server.")
@ -64,7 +64,10 @@ class CollectDeadlineServerFromInstance(pyblish.api.InstancePlugin):
asString=True
)
default_servers = deadline_settings["deadline_urls"]
default_servers = {
url_item["name"]: url_item["value"]
for url_item in deadline_settings["deadline_urls"]
}
project_servers = (
render_instance.context.data
["project_settings"]

View file

@ -62,36 +62,14 @@ def _convert_general(ayon_settings, output, default_settings):
}
def _convert_deadline_system_settings(
ayon_settings, output, addon_versions, default_settings
):
enabled = addon_versions.get("deadline") is not None
deadline_settings = default_settings["modules"]["deadline"]
deadline_settings["enabled"] = enabled
if enabled:
ayon_deadline = ayon_settings["deadline"]
deadline_settings["deadline_urls"] = {
item["name"]: item["value"]
for item in ayon_deadline["deadline_urls"]
}
output["modules"]["deadline"] = deadline_settings
def _convert_modules_system(
ayon_settings, output, addon_versions, default_settings
):
# TODO add all modules
# TODO add 'enabled' values
for func in (
_convert_deadline_system_settings,
):
func(ayon_settings, output, addon_versions, default_settings)
for key in {
"timers_manager",
"clockify",
"royalrender",
"deadline",
}:
if addon_versions.get(key):
output[key] = ayon_settings

View file

@ -9,6 +9,7 @@ from .folders_widget import (
FoldersWidget,
FoldersQtModel,
FOLDERS_MODEL_SENDER_NAME,
SimpleFoldersWidget,
)
from .tasks_widget import (
@ -31,6 +32,7 @@ __all__ = (
"FoldersWidget",
"FoldersQtModel",
"FOLDERS_MODEL_SENDER_NAME",
"SimpleFoldersWidget",
"TasksWidget",
"TasksQtModel",

View file

@ -2,6 +2,11 @@ import collections
from qtpy import QtWidgets, QtGui, QtCore
from ayon_core.lib.events import QueuedEventSystem
from ayon_core.tools.ayon_utils.models import (
HierarchyModel,
HierarchyExpectedSelection,
)
from ayon_core.tools.utils import (
RecursiveSortFilterProxyModel,
TreeView,
@ -390,6 +395,15 @@ class FoldersWidget(QtWidgets.QWidget):
return self._get_selected_item_id()
def get_selected_folder_path(self):
"""Get selected folder id.
Returns:
Union[str, None]: Folder path which is selected.
"""
return self._get_selected_item_value(FOLDER_PATH_ROLE)
def get_selected_folder_label(self):
"""Selected folder label.
@ -473,9 +487,12 @@ class FoldersWidget(QtWidgets.QWidget):
self.refreshed.emit()
def _get_selected_item_id(self):
return self._get_selected_item_value(FOLDER_ID_ROLE)
def _get_selected_item_value(self, role):
selection_model = self._folders_view.selectionModel()
for index in selection_model.selectedIndexes():
item_id = index.data(FOLDER_ID_ROLE)
item_id = index.data(role)
if item_id is not None:
return item_id
return None
@ -514,3 +531,110 @@ class FoldersWidget(QtWidgets.QWidget):
if folder_id is not None:
self.set_selected_folder(folder_id)
self._controller.expected_folder_selected(folder_id)
class SimpleSelectionModel(object):
"""Model handling selection changes.
Triggering events:
- "selection.project.changed"
- "selection.folder.changed"
"""
event_source = "selection.model"
def __init__(self, controller):
self._controller = controller
self._project_name = None
self._folder_id = None
self._task_id = None
self._task_name = None
def get_selected_project_name(self):
return self._project_name
def set_selected_project(self, project_name):
self._project_name = project_name
self._controller.emit_event(
"selection.project.changed",
{"project_name": project_name},
self.event_source
)
def get_selected_folder_id(self):
return self._folder_id
def set_selected_folder(self, folder_id):
if folder_id == self._folder_id:
return
self._folder_id = folder_id
self._controller.emit_event(
"selection.folder.changed",
{
"project_name": self._project_name,
"folder_id": folder_id,
},
self.event_source
)
class SimpleFoldersController(object):
def __init__(self):
self._event_system = self._create_event_system()
self._hierarchy_model = HierarchyModel(self)
self._selection_model = SimpleSelectionModel(self)
self._expected_selection = HierarchyExpectedSelection(
self, handle_project=False, handle_folder=True, handle_task=False
)
def emit_event(self, topic, data=None, source=None):
"""Use implemented event system to trigger event."""
if data is None:
data = {}
self._event_system.emit(topic, data, source)
def register_event_callback(self, topic, callback):
self._event_system.add_callback(topic, callback)
# Model functions
def get_folder_items(self, project_name, sender=None):
return self._hierarchy_model.get_folder_items(project_name, sender)
def set_selected_project(self, project_name):
self._selection_model.set_selected_project(project_name)
def set_selected_folder(self, folder_id):
self._selection_model.set_selected_folder(folder_id)
def get_expected_selection_data(self):
self._expected_selection.get_expected_selection_data()
def expected_folder_selected(self, folder_id):
self._expected_selection.expected_folder_selected(folder_id)
def _create_event_system(self):
return QueuedEventSystem()
class SimpleFoldersWidget(FoldersWidget):
def __init__(self, controller=None, *args, **kwargs):
if controller is None:
controller = SimpleFoldersController()
super(SimpleFoldersWidget, self).__init__(controller, *args, **kwargs)
def set_project_name(self, project_name):
self._controller.set_selected_project(project_name)
super(SimpleFoldersWidget, self).set_project_name(project_name)
def _on_project_selection_change(self, event):
"""Ignore project selection change from controller.
Only who can trigger project change is this widget with
'set_project_name' which already cares about project change.
Args:
event (Event): Triggered event.
"""
pass