From b0e9e3b3eef8cf0f1183c5d2aa8dcccddb3e8e84 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:35:56 +0200 Subject: [PATCH 01/27] added admin_submenu to ITrayAction --- openpype/modules/base.py | 13 +++++++++++++ openpype/tools/tray/pype_tray.py | 9 ++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 441a9731b7..9721c0a5d5 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -184,6 +184,8 @@ class ITrayAction(ITrayModule): necessary. """ + _admin_submenu = None + @property @abstractmethod def label(self): @@ -207,6 +209,16 @@ class ITrayAction(ITrayModule): def tray_exit(self): return + @staticmethod + def admin_submenu(tray_menu): + if ITrayAction._admin_submenu is None: + from Qt import QtWidgets + + admin_submenu = QtWidgets.QMenu("Admin", tray_menu) + admin_submenu.menuAction().setVisible(False) + ITrayAction._admin_submenu = admin_submenu + return ITrayAction._admin_submenu + class ITrayService(ITrayModule): # Module's property @@ -233,6 +245,7 @@ class ITrayService(ITrayModule): def services_submenu(tray_menu): if ITrayService._services_submenu is None: from Qt import QtWidgets + services_submenu = QtWidgets.QMenu("Services", tray_menu) services_submenu.menuAction().setVisible(False) ITrayService._services_submenu = services_submenu diff --git a/openpype/tools/tray/pype_tray.py b/openpype/tools/tray/pype_tray.py index 2c739e3e39..0272ba869b 100644 --- a/openpype/tools/tray/pype_tray.py +++ b/openpype/tools/tray/pype_tray.py @@ -15,7 +15,11 @@ from openpype.api import ( get_system_settings ) from openpype.lib import get_pype_execute_args -from openpype.modules import TrayModulesManager, ITrayService +from openpype.modules import ( + TrayModulesManager, + ITrayAction, + ITrayService +) from openpype import style from .pype_info_widget import PypeInfoWidget @@ -67,6 +71,9 @@ class TrayManager: self.modules_manager.initialize(self, self.tray_widget.menu) + admin_submenu = ITrayAction.admin_submenu(self.tray_widget.menu) + self.tray_widget.menu.addMenu(admin_submenu) + # Add services if they are services_submenu = ITrayService.services_submenu(self.tray_widget.menu) self.tray_widget.menu.addMenu(services_submenu) From a33388d24cc404e0b05842c5255cf78b3ddeb93e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:36:45 +0200 Subject: [PATCH 02/27] added admin_action attribute defyin if action is added to admin submenu or not --- openpype/modules/base.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 9721c0a5d5..44368d77a7 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -184,6 +184,7 @@ class ITrayAction(ITrayModule): necessary. """ + admin_action = False _admin_submenu = None @property @@ -199,9 +200,19 @@ class ITrayAction(ITrayModule): def tray_menu(self, tray_menu): from Qt import QtWidgets - action = QtWidgets.QAction(self.label, tray_menu) + + if self.admin_action: + menu = self.admin_submenu(tray_menu) + action = QtWidgets.QAction(self.label, menu) + menu.addAction(action) + if not menu.menuAction().isVisible(): + menu.menuAction().setVisible(True) + + else: + action = QtWidgets.QAction(self.label, tray_menu) + tray_menu.addAction(action) + action.triggered.connect(self.on_action_trigger) - tray_menu.addAction(action) def tray_start(self): return From b159fe0718444c8383d50f24b7d2ea13e70dfc1a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:37:09 +0200 Subject: [PATCH 03/27] settings action is marked as admin action --- openpype/modules/settings_action.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/modules/settings_action.py b/openpype/modules/settings_action.py index 8a3ee4792a..5844710ff7 100644 --- a/openpype/modules/settings_action.py +++ b/openpype/modules/settings_action.py @@ -38,6 +38,7 @@ class SettingsAction(PypeModule, ITrayAction): """Action to show Setttings tool.""" name = "settings" label = "Settings" + admin_action = True def initialize(self, _modules_settings): # This action is always enabled From dbc3f81a66e8ebaabf0cb52e36de6300812537d6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:38:17 +0200 Subject: [PATCH 04/27] implemented base of project manager action --- openpype/modules/project_manager_action.py | 55 ++++++++++++++++++++++ openpype/modules/settings_action.py | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 openpype/modules/project_manager_action.py diff --git a/openpype/modules/project_manager_action.py b/openpype/modules/project_manager_action.py new file mode 100644 index 0000000000..465c3cc74a --- /dev/null +++ b/openpype/modules/project_manager_action.py @@ -0,0 +1,55 @@ +from . import PypeModule, ITrayAction + + +class ProjectManagerAction(PypeModule, ITrayAction): + label = "Project Manager" + name = "project_manager" + admin_action = True + + def initialize(self, _modules_settings): + # This action is always enabled + self.enabled = True + + # Tray attributes + self.project_manager_window = None + + def tray_init(self): + """Initialization in tray implementation of ITrayAction.""" + self.create_project_manager_window() + + def on_action_trigger(self): + """Implementation for action trigger of ITrayAction.""" + self.show_project_manager_window() + + def create_project_manager_window(self): + """Initializa Settings Qt window.""" + if self.project_manager_window: + return + + def show_project_manager_window(self): + """Show project manager tool window. + + Raises: + AssertionError: Window must be already created. Call + `create_project_manager_window` before calling this method. + """ + if not self.project_manager_window: + raise AssertionError("Window is not initialized.") + + # Store if was visible + was_visible = self.project_manager_window.isVisible() + was_minimized = self.project_manager_window.isMinimized() + + # Show settings gui + self.project_manager_window.show() + + if was_minimized: + self.project_manager_window.showNormal() + + # Pull window to the front. + self.project_manager_window.raise_() + self.project_manager_window.activateWindow() + + # Reset content if was not visible + if not was_visible and not was_minimized: + self.project_manager_window.reset() diff --git a/openpype/modules/settings_action.py b/openpype/modules/settings_action.py index 5844710ff7..d0f8c4f541 100644 --- a/openpype/modules/settings_action.py +++ b/openpype/modules/settings_action.py @@ -79,7 +79,7 @@ class SettingsAction(PypeModule, ITrayAction): Raises: AssertionError: Window must be already created. Call - `create_settings_window` before callint this method. + `create_settings_window` before calling this method. """ if not self.settings_window: raise AssertionError("Window is not initialized.") From c64559abe81cdedeb51ae841b9ba3e7bb37db6cb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:39:23 +0200 Subject: [PATCH 05/27] project manager won't refresh projects on init but on first show --- .../tools/project_manager/project_manager/window.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index 83184f9981..a6a1564a2e 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -20,6 +20,8 @@ class ProjectManagerWindow(QtWidgets.QWidget): def __init__(self, parent=None): super(ProjectManagerWindow, self).__init__(parent) + self._initial_reset = False + self.setWindowTitle("OpenPype Project Manager") self.setWindowIcon(QtGui.QIcon(resources.pype_icon_filepath())) @@ -135,13 +137,15 @@ class ProjectManagerWindow(QtWidgets.QWidget): self.resize(1200, 600) self.setStyleSheet(load_stylesheet()) - self.refresh_projects() - def _set_project(self, project_name=None): self.hierarchy_view.set_project(project_name) def showEvent(self, event): super(ProjectManagerWindow, self).showEvent(event) + + if not self._initial_reset: + self.refresh_projects() + font_size = self._refresh_projects_btn.fontMetrics().height() icon_size = QtCore.QSize(font_size, font_size) self._refresh_projects_btn.setIconSize(icon_size) @@ -149,6 +153,10 @@ class ProjectManagerWindow(QtWidgets.QWidget): self._add_task_btn.setIconSize(icon_size) def refresh_projects(self, project_name=None): + # Mark as project were reset + if not self._initial_reset: + self._initial_reset = True + if project_name is None: if self._project_combobox.count() > 0: project_name = self._project_combobox.currentText() From 701a5841ed54ffee8a1ea4af0e43342443456a2d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:42:42 +0200 Subject: [PATCH 06/27] create project manager window in action --- openpype/modules/project_manager_action.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/openpype/modules/project_manager_action.py b/openpype/modules/project_manager_action.py index 465c3cc74a..d87e905f6c 100644 --- a/openpype/modules/project_manager_action.py +++ b/openpype/modules/project_manager_action.py @@ -25,6 +25,9 @@ class ProjectManagerAction(PypeModule, ITrayAction): """Initializa Settings Qt window.""" if self.project_manager_window: return + from openpype.tools.project_manager import ProjectManagerWindow + + self.project_manager_window = ProjectManagerWindow() def show_project_manager_window(self): """Show project manager tool window. @@ -37,7 +40,6 @@ class ProjectManagerAction(PypeModule, ITrayAction): raise AssertionError("Window is not initialized.") # Store if was visible - was_visible = self.project_manager_window.isVisible() was_minimized = self.project_manager_window.isMinimized() # Show settings gui @@ -49,7 +51,3 @@ class ProjectManagerAction(PypeModule, ITrayAction): # Pull window to the front. self.project_manager_window.raise_() self.project_manager_window.activateWindow() - - # Reset content if was not visible - if not was_visible and not was_minimized: - self.project_manager_window.reset() From c73dada568c714d9a3cbcb7efe81ae2ce0d65062 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:42:50 +0200 Subject: [PATCH 07/27] implemented connect_with_modules --- openpype/modules/project_manager_action.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/modules/project_manager_action.py b/openpype/modules/project_manager_action.py index d87e905f6c..b70fe7800b 100644 --- a/openpype/modules/project_manager_action.py +++ b/openpype/modules/project_manager_action.py @@ -13,6 +13,9 @@ class ProjectManagerAction(PypeModule, ITrayAction): # Tray attributes self.project_manager_window = None + def connect_with_modules(self, *_a, **_kw): + return + def tray_init(self): """Initialization in tray implementation of ITrayAction.""" self.create_project_manager_window() From 3821a000294b276bdeb8e9491ab02aacc10bf067 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:56:36 +0200 Subject: [PATCH 08/27] import project manager so is usable --- openpype/modules/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/modules/__init__.py b/openpype/modules/__init__.py index bae48c540b..debeeed6bf 100644 --- a/openpype/modules/__init__.py +++ b/openpype/modules/__init__.py @@ -36,6 +36,7 @@ from .clockify import ClockifyModule from .log_viewer import LogViewModule from .muster import MusterModule from .deadline import DeadlineModule +from .project_manager_action import ProjectManagerAction from .standalonepublish_action import StandAlonePublishAction from .sync_server import SyncServerModule @@ -73,6 +74,7 @@ __all__ = ( "LogViewModule", "MusterModule", "DeadlineModule", + "ProjectManagerAction", "StandAlonePublishAction", "SyncServerModule" From 305c0d7a6bf8effc5fa20bc3aca53d9b391b30de Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:57:31 +0200 Subject: [PATCH 09/27] project combobox adjust to content --- openpype/tools/project_manager/project_manager/window.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index a6a1564a2e..7489c97147 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -35,6 +35,9 @@ class ProjectManagerWindow(QtWidgets.QWidget): project_model = ProjectModel(dbcon) project_combobox = QtWidgets.QComboBox(project_widget) + project_combobox.setSizeAdjustPolicy( + QtWidgets.QComboBox.AdjustToContents + ) project_combobox.setModel(project_model) project_combobox.setRootModelIndex(QtCore.QModelIndex()) style_delegate = QtWidgets.QStyledItemDelegate() From c119eddbfbe3cd555f805979d457f4db1116a9bd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 11:58:42 +0200 Subject: [PATCH 10/27] added password check to project manager tool --- .../project_manager/project_manager/window.py | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index 7489c97147..d04d1dd2d1 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -11,6 +11,10 @@ from . import ( ) from openpype.style import load_stylesheet from .style import ResourceCache +from openpype.tools.settings import ( + is_password_required, + PasswordDialog +) from openpype import resources from avalon.api import AvalonMongoDB @@ -21,6 +25,8 @@ class ProjectManagerWindow(QtWidgets.QWidget): super(ProjectManagerWindow, self).__init__(parent) self._initial_reset = False + self._password_dialog = None + self._user_passed = False self.setWindowTitle("OpenPype Project Manager") self.setWindowIcon(QtGui.QIcon(resources.pype_icon_filepath())) @@ -147,7 +153,7 @@ class ProjectManagerWindow(QtWidgets.QWidget): super(ProjectManagerWindow, self).showEvent(event) if not self._initial_reset: - self.refresh_projects() + self.reset() font_size = self._refresh_projects_btn.fontMetrics().height() icon_size = QtCore.QSize(font_size, font_size) @@ -156,10 +162,6 @@ class ProjectManagerWindow(QtWidgets.QWidget): self._add_task_btn.setIconSize(icon_size) def refresh_projects(self, project_name=None): - # Mark as project were reset - if not self._initial_reset: - self._initial_reset = True - if project_name is None: if self._project_combobox.count() > 0: project_name = self._project_combobox.currentText() @@ -204,3 +206,45 @@ class ProjectManagerWindow(QtWidgets.QWidget): project_name = dialog.project_name self.show_message("Created project \"{}\"".format(project_name)) self.refresh_projects(project_name) + + def _show_password_dialog(self): + if self._password_dialog: + self._password_dialog.open() + + def _on_password_dialog_close(self, password_passed): + # Store result for future settings reset + self._user_passed = password_passed + # Remove reference to password dialog + self._password_dialog = None + if password_passed: + self.reset() + else: + self.close() + + def reset(self): + if self._password_dialog: + return + + if not self._user_passed: + self._user_passed = not is_password_required() + + if not self._user_passed: + self.setEnabled(False) + # Avoid doubled dialog + dialog = PasswordDialog(self) + dialog.setModal(True) + dialog.finished.connect(self._on_password_dialog_close) + + self._password_dialog = dialog + + QtCore.QTimer.singleShot(100, self._show_password_dialog) + + return + + self.setEnabled(True) + + # Mark as was reset + if not self._initial_reset: + self._initial_reset = True + + self.refresh_projects() From 70929e30690faf9801e0f88c13f81af015319867 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:04:06 +0200 Subject: [PATCH 11/27] moved password dialog styles to openpype style --- openpype/style/style.css | 15 +++++++++++++++ openpype/tools/settings/widgets.py | 8 ++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/openpype/style/style.css b/openpype/style/style.css index 7db3558c14..aa71105320 100644 --- a/openpype/style/style.css +++ b/openpype/style/style.css @@ -504,6 +504,21 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { #IconBtn {} +/* Password dialog*/ +#PasswordBtn { + border: none; + padding:0.1em; + background: transparent; +} + +#PasswordBtn:hover { + background: {color:bg-buttons}; +} + +#RememberCheckbox { + spacing: 0.5em; +} + /* Project Manager stylesheets */ #HierarchyView::item { padding-top: 3px; diff --git a/openpype/tools/settings/widgets.py b/openpype/tools/settings/widgets.py index e2662f350f..5b975edadd 100644 --- a/openpype/tools/settings/widgets.py +++ b/openpype/tools/settings/widgets.py @@ -65,10 +65,8 @@ class PasswordDialog(QtWidgets.QDialog): show_password_icon_path = get_resource("images", "eye.png") show_password_icon = QtGui.QIcon(show_password_icon_path) show_password_btn = PressHoverButton(password_widget) + show_password_btn.setObjectName("PasswordBtn") show_password_btn.setIcon(show_password_icon) - show_password_btn.setStyleSheet(( - "border: none;padding:0.1em;" - )) show_password_btn.setFocusPolicy(QtCore.Qt.ClickFocus) password_layout = QtWidgets.QHBoxLayout(password_widget) @@ -83,10 +81,8 @@ class PasswordDialog(QtWidgets.QDialog): buttons_widget = QtWidgets.QWidget(self) remember_checkbox = QtWidgets.QCheckBox("Remember", buttons_widget) + remember_checkbox.setObjectName("RememberCheckbox") remember_checkbox.setVisible(allow_remember) - remember_checkbox.setStyleSheet(( - "spacing: 0.5em;" - )) ok_btn = QtWidgets.QPushButton("Ok", buttons_widget) cancel_btn = QtWidgets.QPushButton("Cancel", buttons_widget) From e53fe06d6ac95694686be58f8785ca8b83daba47 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:04:28 +0200 Subject: [PATCH 12/27] changed labels of local settings nad library loader --- openpype/modules/avalon_apps/avalon_app.py | 2 +- openpype/modules/settings_action.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/modules/avalon_apps/avalon_app.py b/openpype/modules/avalon_apps/avalon_app.py index 243c4f928a..4e95f6e72b 100644 --- a/openpype/modules/avalon_apps/avalon_app.py +++ b/openpype/modules/avalon_apps/avalon_app.py @@ -86,7 +86,7 @@ class AvalonModule(PypeModule, ITrayModule, IWebServerRoutes): from Qt import QtWidgets # Actions action_library_loader = QtWidgets.QAction( - "Library loader", tray_menu + "Loader", tray_menu ) action_library_loader.triggered.connect(self.show_library_loader) diff --git a/openpype/modules/settings_action.py b/openpype/modules/settings_action.py index d0f8c4f541..1c55709f47 100644 --- a/openpype/modules/settings_action.py +++ b/openpype/modules/settings_action.py @@ -106,7 +106,7 @@ class SettingsAction(PypeModule, ITrayAction): class LocalSettingsAction(PypeModule, ITrayAction): """Action to show Setttings tool.""" name = "local_settings" - label = "Local Settings" + label = "Settings" def initialize(self, _modules_settings): # This action is always enabled From ac8d9865f5902f01ea9d6750b09b82a2995d54dc Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:16:39 +0200 Subject: [PATCH 13/27] moved password dialog to openpype widgets --- .../resources/images => resources/icons}/eye.png | Bin .../tools/project_manager/project_manager/window.py | 6 ++---- openpype/tools/settings/__init__.py | 2 -- .../tools/settings/local_settings/general_widget.py | 6 ++---- openpype/tools/settings/settings/window.py | 6 ++---- openpype/widgets/__init__.py | 6 ++++++ .../widgets.py => widgets/password_dialog.py} | 4 ++-- 7 files changed, 14 insertions(+), 16 deletions(-) rename openpype/{tools/settings/resources/images => resources/icons}/eye.png (100%) rename openpype/{tools/settings/widgets.py => widgets/password_dialog.py} (98%) diff --git a/openpype/tools/settings/resources/images/eye.png b/openpype/resources/icons/eye.png similarity index 100% rename from openpype/tools/settings/resources/images/eye.png rename to openpype/resources/icons/eye.png diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index d04d1dd2d1..15da7a37b8 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -11,10 +11,8 @@ from . import ( ) from openpype.style import load_stylesheet from .style import ResourceCache -from openpype.tools.settings import ( - is_password_required, - PasswordDialog -) +from openpype.tools.settings import is_password_required +from openpype.widgets import PasswordDialog from openpype import resources from avalon.api import AvalonMongoDB diff --git a/openpype/tools/settings/__init__.py b/openpype/tools/settings/__init__.py index 1a4752fe54..d94c5497b8 100644 --- a/openpype/tools/settings/__init__.py +++ b/openpype/tools/settings/__init__.py @@ -5,7 +5,6 @@ from .lib import ( BTN_FIXED_SIZE, CHILD_OFFSET ) -from .widgets import PasswordDialog from .local_settings import LocalSettingsWindow from .settings import ( style, @@ -41,7 +40,6 @@ __all__ = ( "style", - "PasswordDialog", "MainWidget", "ProjectListWidget", "LocalSettingsWindow", diff --git a/openpype/tools/settings/local_settings/general_widget.py b/openpype/tools/settings/local_settings/general_widget.py index d01c16ff82..c69824802e 100644 --- a/openpype/tools/settings/local_settings/general_widget.py +++ b/openpype/tools/settings/local_settings/general_widget.py @@ -1,10 +1,8 @@ import getpass from Qt import QtWidgets, QtCore -from openpype.tools.settings import ( - is_password_required, - PasswordDialog -) +from openpype.tools.settings import is_password_required +from openpype.widgets import PasswordDialog class LocalGeneralWidgets(QtWidgets.QWidget): diff --git a/openpype/tools/settings/settings/window.py b/openpype/tools/settings/settings/window.py index bddac7e98b..6c45b60620 100644 --- a/openpype/tools/settings/settings/window.py +++ b/openpype/tools/settings/settings/window.py @@ -7,10 +7,8 @@ from .categories import ( from .widgets import ShadowWidget, RestartDialog from . import style -from openpype.tools.settings import ( - is_password_required, - PasswordDialog -) +from openpype.tools.settings import is_password_required +from openpype.widgets import PasswordDialog class MainWidget(QtWidgets.QWidget): diff --git a/openpype/widgets/__init__.py b/openpype/widgets/__init__.py index e69de29bb2..b0552c7a0d 100644 --- a/openpype/widgets/__init__.py +++ b/openpype/widgets/__init__.py @@ -0,0 +1,6 @@ +from .password_dialog import PasswordDialog + + +__all__ = ( + "PasswordDialog", +) diff --git a/openpype/tools/settings/widgets.py b/openpype/widgets/password_dialog.py similarity index 98% rename from openpype/tools/settings/widgets.py rename to openpype/widgets/password_dialog.py index 5b975edadd..eca925ec5f 100644 --- a/openpype/tools/settings/widgets.py +++ b/openpype/widgets/password_dialog.py @@ -1,6 +1,6 @@ from Qt import QtWidgets, QtCore, QtGui -from .resources import get_resource +from openpype.resources import get_resource from openpype.api import get_system_settings from openpype.settings.lib import ( @@ -62,7 +62,7 @@ class PasswordDialog(QtWidgets.QDialog): password_input = QtWidgets.QLineEdit(password_widget) password_input.setEchoMode(QtWidgets.QLineEdit.Password) - show_password_icon_path = get_resource("images", "eye.png") + show_password_icon_path = get_resource("icons", "eye.png") show_password_icon = QtGui.QIcon(show_password_icon_path) show_password_btn = PressHoverButton(password_widget) show_password_btn.setObjectName("PasswordBtn") From 5803d903a47fcecc6977b461da07c2aee3c42e7b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:17:07 +0200 Subject: [PATCH 14/27] force to use openpype stylesheet in password dialog --- openpype/widgets/password_dialog.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/widgets/password_dialog.py b/openpype/widgets/password_dialog.py index eca925ec5f..b2b1c80701 100644 --- a/openpype/widgets/password_dialog.py +++ b/openpype/widgets/password_dialog.py @@ -1,5 +1,6 @@ from Qt import QtWidgets, QtCore, QtGui +from openpype import style from openpype.resources import get_resource from openpype.api import get_system_settings @@ -110,6 +111,8 @@ class PasswordDialog(QtWidgets.QDialog): self.remember_checkbox = remember_checkbox self.message_label = message_label + self.setStyleSheet(style.load_stylesheet()) + def remember_password(self): if not self._allow_remember: return False From afc1bcee4a43d857af0d577e021856f946eab625 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:22:00 +0200 Subject: [PATCH 15/27] moved is_password_required to openpype lib --- openpype/lib/__init__.py | 4 +++- openpype/lib/local_settings.py | 18 +++++++++++++++++- .../project_manager/project_manager/window.py | 4 ++-- openpype/tools/settings/__init__.py | 2 -- openpype/tools/settings/lib.py | 18 ------------------ .../settings/local_settings/general_widget.py | 4 ++-- openpype/tools/settings/settings/window.py | 4 ++-- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index 02ae9635c1..12c04a4236 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -97,7 +97,8 @@ from .local_settings import ( OpenPypeSettingsRegistry, get_local_site_id, change_openpype_mongo_url, - get_openpype_username + get_openpype_username, + is_admin_password_required ) from .applications import ( @@ -209,6 +210,7 @@ __all__ = [ "get_local_site_id", "change_openpype_mongo_url", "get_openpype_username", + "is_admin_password_required", "ApplicationLaunchFailed", "ApplictionExecutableNotFound", diff --git a/openpype/lib/local_settings.py b/openpype/lib/local_settings.py index 67845c77cf..66dad279de 100644 --- a/openpype/lib/local_settings.py +++ b/openpype/lib/local_settings.py @@ -29,7 +29,10 @@ except ImportError: import six import appdirs -from openpype.settings import get_local_settings +from openpype.settings import ( + get_local_settings, + get_system_settings +) from .import validate_mongo_connection @@ -562,3 +565,16 @@ def get_openpype_username(): if not username: username = getpass.getuser() return username + + +def is_admin_password_required(): + system_settings = get_system_settings() + password = system_settings["general"].get("admin_password") + if not password: + return False + + local_settings = get_local_settings() + is_admin = local_settings.get("general", {}).get("is_admin", False) + if is_admin: + return False + return True diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index 15da7a37b8..37092bc4a9 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -11,7 +11,7 @@ from . import ( ) from openpype.style import load_stylesheet from .style import ResourceCache -from openpype.tools.settings import is_password_required +from openpype.lib import is_admin_password_required from openpype.widgets import PasswordDialog from openpype import resources @@ -224,7 +224,7 @@ class ProjectManagerWindow(QtWidgets.QWidget): return if not self._user_passed: - self._user_passed = not is_password_required() + self._user_passed = not is_admin_password_required() if not self._user_passed: self.setEnabled(False) diff --git a/openpype/tools/settings/__init__.py b/openpype/tools/settings/__init__.py index d94c5497b8..a156228dc1 100644 --- a/openpype/tools/settings/__init__.py +++ b/openpype/tools/settings/__init__.py @@ -1,7 +1,6 @@ import sys from Qt import QtWidgets, QtGui from .lib import ( - is_password_required, BTN_FIXED_SIZE, CHILD_OFFSET ) @@ -34,7 +33,6 @@ def main(user_role=None): __all__ = ( - "is_password_required", "BTN_FIXED_SIZE", "CHILD_OFFSET", diff --git a/openpype/tools/settings/lib.py b/openpype/tools/settings/lib.py index 4b48746a18..9520e268dd 100644 --- a/openpype/tools/settings/lib.py +++ b/openpype/tools/settings/lib.py @@ -1,20 +1,2 @@ CHILD_OFFSET = 15 BTN_FIXED_SIZE = 20 - - -def is_password_required(): - from openpype.settings import ( - get_system_settings, - get_local_settings - ) - - system_settings = get_system_settings() - password = system_settings["general"].get("admin_password") - if not password: - return False - - local_settings = get_local_settings() - is_admin = local_settings.get("general", {}).get("is_admin", False) - if is_admin: - return False - return True diff --git a/openpype/tools/settings/local_settings/general_widget.py b/openpype/tools/settings/local_settings/general_widget.py index c69824802e..5bb2bcf378 100644 --- a/openpype/tools/settings/local_settings/general_widget.py +++ b/openpype/tools/settings/local_settings/general_widget.py @@ -1,7 +1,7 @@ import getpass from Qt import QtWidgets, QtCore -from openpype.tools.settings import is_password_required +from openpype.lib import is_admin_password_required from openpype.widgets import PasswordDialog @@ -55,7 +55,7 @@ class LocalGeneralWidgets(QtWidgets.QWidget): if not self.is_admin_input.isChecked(): return - if not is_password_required(): + if not is_admin_password_required(): return dialog = PasswordDialog(self, False) diff --git a/openpype/tools/settings/settings/window.py b/openpype/tools/settings/settings/window.py index 6c45b60620..a60a2a1d88 100644 --- a/openpype/tools/settings/settings/window.py +++ b/openpype/tools/settings/settings/window.py @@ -7,7 +7,7 @@ from .categories import ( from .widgets import ShadowWidget, RestartDialog from . import style -from openpype.tools.settings import is_password_required +from openpype.lib import is_admin_password_required from openpype.widgets import PasswordDialog @@ -115,7 +115,7 @@ class MainWidget(QtWidgets.QWidget): return if not self._user_passed: - self._user_passed = not is_password_required() + self._user_passed = not is_admin_password_required() self._on_state_change() From fd64a396db3fcf7726cd30ba443feabb455138a8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:34:20 +0200 Subject: [PATCH 16/27] added project manager to modules settings with beta suffix --- openpype/modules/project_manager_action.py | 11 +++++++---- .../settings/defaults/system_settings/modules.json | 3 +++ .../schemas/system_schema/schema_modules.json | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/openpype/modules/project_manager_action.py b/openpype/modules/project_manager_action.py index b70fe7800b..1387aa258c 100644 --- a/openpype/modules/project_manager_action.py +++ b/openpype/modules/project_manager_action.py @@ -2,13 +2,16 @@ from . import PypeModule, ITrayAction class ProjectManagerAction(PypeModule, ITrayAction): - label = "Project Manager" + label = "Project Manager (beta)" name = "project_manager" admin_action = True - def initialize(self, _modules_settings): - # This action is always enabled - self.enabled = True + def initialize(self, modules_settings): + enabled = False + module_settings = modules_settings.get(self.name) + if module_settings: + enabled = module_settings.get("enabled", enabled) + self.enabled = enabled # Tray attributes self.project_manager_window = None diff --git a/openpype/settings/defaults/system_settings/modules.json b/openpype/settings/defaults/system_settings/modules.json index 5c4aa6c485..31da9e9e7b 100644 --- a/openpype/settings/defaults/system_settings/modules.json +++ b/openpype/settings/defaults/system_settings/modules.json @@ -164,5 +164,8 @@ }, "standalonepublish_tool": { "enabled": true + }, + "project_manager": { + "enabled": true } } \ No newline at end of file diff --git a/openpype/settings/entities/schemas/system_schema/schema_modules.json b/openpype/settings/entities/schemas/system_schema/schema_modules.json index 16251b5f27..d6527f368d 100644 --- a/openpype/settings/entities/schemas/system_schema/schema_modules.json +++ b/openpype/settings/entities/schemas/system_schema/schema_modules.json @@ -192,6 +192,20 @@ "label": "Enabled" } ] + }, + { + "type": "dict", + "key": "project_manager", + "label": "Project Manager (beta)", + "collapsible": true, + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + } + ] } ] } From a1fb8d089dc23117c7a4a8f393bc83d4d47216e9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:34:34 +0200 Subject: [PATCH 17/27] password dialog title is Admin Password --- openpype/widgets/password_dialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/widgets/password_dialog.py b/openpype/widgets/password_dialog.py index b2b1c80701..9990642ca1 100644 --- a/openpype/widgets/password_dialog.py +++ b/openpype/widgets/password_dialog.py @@ -44,7 +44,7 @@ class PasswordDialog(QtWidgets.QDialog): def __init__(self, parent=None, allow_remember=True): super(PasswordDialog, self).__init__(parent) - self.setWindowTitle("Settings Password") + self.setWindowTitle("Admin Password") self.resize(300, 120) system_settings = get_system_settings() From 99241346a3e606abada07ca0bf11641d65b8cff2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 12:52:55 +0200 Subject: [PATCH 18/27] changed label from "Settings" to "Studio Settings" --- openpype/modules/settings_action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/modules/settings_action.py b/openpype/modules/settings_action.py index 1c55709f47..1035dc0dcd 100644 --- a/openpype/modules/settings_action.py +++ b/openpype/modules/settings_action.py @@ -37,7 +37,7 @@ class ISettingsChangeListener: class SettingsAction(PypeModule, ITrayAction): """Action to show Setttings tool.""" name = "settings" - label = "Settings" + label = "Studio Settings" admin_action = True def initialize(self, _modules_settings): From 0bf9624c79f37ae9adff72eda3135ded6f419f14 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 14:59:32 +0200 Subject: [PATCH 19/27] modules can add doubleclick callbacks for tray --- openpype/modules/base.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/openpype/modules/base.py b/openpype/modules/base.py index 441a9731b7..21f7a0c76a 100644 --- a/openpype/modules/base.py +++ b/openpype/modules/base.py @@ -172,6 +172,10 @@ class ITrayModule: if self._tray_manager: self._tray_manager.show_tray_message(title, message, icon, msecs) + def add_doubleclick_callback(self, callback): + if hasattr(self.manager, "add_doubleclick_callback"): + self.manager.add_doubleclick_callback(self, callback) + class ITrayAction(ITrayModule): """Implementation of Tray action. @@ -184,6 +188,9 @@ class ITrayAction(ITrayModule): necessary. """ + admin_action = False + _admin_submenu = None + @property @abstractmethod def label(self): @@ -677,7 +684,7 @@ class TrayModulesManager(ModulesManager): ) def __init__(self): - self.log = PypeLogger().get_logger(self.__class__.__name__) + self.log = PypeLogger.get_logger(self.__class__.__name__) self.modules = [] self.modules_by_id = {} @@ -685,6 +692,28 @@ class TrayModulesManager(ModulesManager): self._report = {} self.tray_manager = None + self.doubleclick_callbacks = {} + self.doubleclick_callback = None + + def add_doubleclick_callback(self, module, callback): + """Register doubleclick callbacks on tray icon. + + Currently there is no way how to determine which is launched. Name of + callback can be defined with `doubleclick_callback` attribute. + + Missing feature how to define default callback. + """ + callback_name = "_".join([module.name, callback.__name__]) + if callback_name not in self.doubleclick_callbacks: + self.doubleclick_callbacks[callback_name] = callback + if self.doubleclick_callback is None: + self.doubleclick_callback = callback_name + return + + self.log.warning(( + "Callback with name \"{}\" is already registered." + ).format(callback_name)) + def initialize(self, tray_manager, tray_menu): self.tray_manager = tray_manager self.initialize_modules() From bd46be2b0e0aa8f588957c14744fce4f3eecce5d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 14:59:41 +0200 Subject: [PATCH 20/27] launcher add doubleclick callback --- openpype/modules/launcher_action.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/modules/launcher_action.py b/openpype/modules/launcher_action.py index 5ed8585b6a..0059ff021b 100644 --- a/openpype/modules/launcher_action.py +++ b/openpype/modules/launcher_action.py @@ -15,6 +15,8 @@ class LauncherAction(PypeModule, ITrayAction): def tray_init(self): self.create_window() + self.add_doubleclick_callback(self.show_launcher) + def tray_start(self): return From c319365042a66f03fbcf42880aaed60aa838c5f3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 15:00:11 +0200 Subject: [PATCH 21/27] TrayManager have ability to access and trigger doublick callback --- openpype/tools/tray/pype_tray.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openpype/tools/tray/pype_tray.py b/openpype/tools/tray/pype_tray.py index 2c739e3e39..7b1b7ab0b8 100644 --- a/openpype/tools/tray/pype_tray.py +++ b/openpype/tools/tray/pype_tray.py @@ -44,6 +44,18 @@ class TrayManager: self._main_thread_callbacks = collections.deque() self._execution_in_progress = None + @property + def doubleclick_callback(self): + """Doubleclick callback for Tray icon.""" + callback_name = self.modules_manager.doubleclick_callback + return self.modules_manager.doubleclick_callbacks.get(callback_name) + + def execute_doubleclick(self): + """Execute double click callback in main thread.""" + callback = self.doubleclick_callback + if callback: + self.execute_in_main_thread(callback) + def execute_in_main_thread(self, callback): self._main_thread_callbacks.append(callback) From dd0f9f11d9e327c0708103c415077d5b2b964ac5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 15:00:37 +0200 Subject: [PATCH 22/27] TrayIcon can catch doubleclick on windows and linux --- openpype/tools/tray/pype_tray.py | 44 +++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/openpype/tools/tray/pype_tray.py b/openpype/tools/tray/pype_tray.py index 7b1b7ab0b8..b78897a48c 100644 --- a/openpype/tools/tray/pype_tray.py +++ b/openpype/tools/tray/pype_tray.py @@ -190,6 +190,8 @@ class SystemTrayIcon(QtWidgets.QSystemTrayIcon): :type parent: QtWidgets.QMainWindow """ + doubleclick_time_ms = 100 + def __init__(self, parent): icon = QtGui.QIcon(resources.pype_icon_filepath()) @@ -208,20 +210,50 @@ class SystemTrayIcon(QtWidgets.QSystemTrayIcon): self.tray_man = TrayManager(self, self.parent) self.tray_man.initialize_modules() - # Catch activate event for left click if not on MacOS - # - MacOS has this ability by design so menu would be doubled - if platform.system().lower() != "darwin": - self.activated.connect(self.on_systray_activated) # Add menu to Context of SystemTrayIcon self.setContextMenu(self.menu) atexit.register(self.exit) + # Catch activate event for left click if not on MacOS + # - MacOS has this ability by design and is harder to modify this + # behavior + if platform.system().lower() == "darwin": + return + + self.activated.connect(self.on_systray_activated) + + click_timer = QtCore.QTimer() + click_timer.setInterval(self.doubleclick_time_ms) + click_timer.timeout.connect(self._click_timer_timeout) + + self._click_timer = click_timer + self._doubleclick = False + + def _click_timer_timeout(self): + self._click_timer.stop() + doubleclick = self._doubleclick + # Reset bool value + self._doubleclick = False + if doubleclick: + self.tray_man.execute_doubleclick() + else: + self._show_context_menu() + + def _show_context_menu(self): + pos = QtGui.QCursor().pos() + self.contextMenu().popup(pos) + def on_systray_activated(self, reason): # show contextMenu if left click if reason == QtWidgets.QSystemTrayIcon.Trigger: - position = QtGui.QCursor().pos() - self.contextMenu().popup(position) + if self.tray_man.doubleclick_callback: + self._click_timer.start() + else: + self._show_context_menu() + + elif reason == QtWidgets.QSystemTrayIcon.DoubleClick: + self._doubleclick = True def exit(self): """ Exit whole application. From 630722a52403c151e3ba4383c92b9c8b5eb5336d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 3 Jun 2021 16:02:59 +0200 Subject: [PATCH 23/27] use poetry to build openpype wheel --- pyproject.toml | 18 ++++++++++++++++++ setup.py | 4 +++- tools/build_dependencies.py | 16 ++++++++++++---- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7ba869e50e..db805e989b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,23 @@ documentation = "https://openpype.io/docs/artist_getting_started" repository = "https://github.com/pypeclub/openpype" readme = "README.md" keywords = ["Pipeline", "Avalon", "VFX", "animation", "automation", "tracking", "asset management"] +packages = [ + {include = "igniter"}, + {include = "repos"}, + {include = "tools"}, + {include = "tests"}, + {include = "docs"}, + {include = "openpype"}, + {include = "start.py"}, + {include = "LICENSE"}, + {include = "README.md"}, + {include = "setup.py"}, + {include = "pyproject.toml"}, + {include = "poetry.lock"} +] + +[tool.poetry.scripts] +openpype = 'start:boot' [tool.poetry.dependencies] python = "3.7.*" @@ -66,6 +83,7 @@ sphinx-qt-documentation = "*" recommonmark = "*" wheel = "*" enlighten = "*" # cool terminal progress bars +aenum = "^3.1.0" # cross-python compatible Enum, used in representations [tool.poetry.urls] "Bug Tracker" = "https://github.com/pypeclub/openpype/issues" diff --git a/setup.py b/setup.py index 5fb0b33f2a..927dd28afd 100644 --- a/setup.py +++ b/setup.py @@ -50,7 +50,9 @@ install_requires = [ ] includes = [] -excludes = [] +excludes = [ + "openpype" +] bin_includes = [] include_files = [ "igniter", diff --git a/tools/build_dependencies.py b/tools/build_dependencies.py index de3b6da021..3898450471 100644 --- a/tools/build_dependencies.py +++ b/tools/build_dependencies.py @@ -120,7 +120,7 @@ _print("Copying dependencies ...") total_files = count_folders(site_pkg) progress_bar = enlighten.Counter( total=total_files, desc="Processing Dependencies", - units="%", color="green") + units="%", color=(53, 178, 202)) def _progress(_base, _names): @@ -140,7 +140,8 @@ to_delete = [] deps_items = list(deps_dir.iterdir()) item_count = len(list(libs_dir.iterdir())) find_progress_bar = enlighten.Counter( - total=item_count, desc="Finding duplicates", units="%", color="yellow") + total=item_count, desc="Finding duplicates", units="%", + color=(56, 211, 159)) for d in libs_dir.iterdir(): if (deps_dir / d.name) in deps_items: @@ -152,16 +153,23 @@ find_progress_bar.close() # add openpype and igniter in libs too to_delete.append(libs_dir / "openpype") to_delete.append(libs_dir / "igniter") +to_delete.append(libs_dir / "openpype.pth") +to_delete.append(deps_dir / "openpype.pth") # delete duplicates # _print(f"Deleting {len(to_delete)} duplicates ...") delete_progress_bar = enlighten.Counter( - total=len(to_delete), desc="Deleting duplicates", units="%", color="red") + total=len(to_delete), desc="Deleting duplicates", units="%", + color=(251, 192, 32)) for d in to_delete: if d.is_dir(): shutil.rmtree(d) else: - d.unlink() + try: + d.unlink() + except FileNotFoundError: + # skip non-existent silently + pass delete_progress_bar.update() delete_progress_bar.close() From 46cd08b03333958be272ce67d598bfe52ae2ea0d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Thu, 3 Jun 2021 16:05:10 +0200 Subject: [PATCH 24/27] add /dist/ to ignores --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 26bf7cf65f..754e3698e2 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ Temporary Items # CX_Freeze ########### /build +/dist/ /vendor/bin/* /.venv From 3aecbcf209ad9cebff182bce55145ea6fa141961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= <33513211+antirotor@users.noreply.github.com> Date: Thu, 3 Jun 2021 16:21:51 +0200 Subject: [PATCH 25/27] remove invalid dependency --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index db805e989b..b0e31bfc3f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,6 @@ sphinx-qt-documentation = "*" recommonmark = "*" wheel = "*" enlighten = "*" # cool terminal progress bars -aenum = "^3.1.0" # cross-python compatible Enum, used in representations [tool.poetry.urls] "Bug Tracker" = "https://github.com/pypeclub/openpype/issues" From 3e515e167c31b3eb766327021d5a7b7fdb34fdd3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 3 Jun 2021 16:58:19 +0200 Subject: [PATCH 26/27] removed duplicated line in collect ftrack api --- openpype/modules/ftrack/plugins/publish/collect_ftrack_api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/modules/ftrack/plugins/publish/collect_ftrack_api.py b/openpype/modules/ftrack/plugins/publish/collect_ftrack_api.py index 9ae1338f9d..a348617cfc 100644 --- a/openpype/modules/ftrack/plugins/publish/collect_ftrack_api.py +++ b/openpype/modules/ftrack/plugins/publish/collect_ftrack_api.py @@ -20,7 +20,6 @@ class CollectFtrackApi(pyblish.api.ContextPlugin): # NOTE Import python module here to know if import was successful import ftrack_api - session = ftrack_api.Session(auto_connect_event_hub=False) session = ftrack_api.Session(auto_connect_event_hub=False) self.log.debug("Ftrack user: \"{0}\"".format(session.api_user)) From 36d36652cb36fda21c2169a0f368c9c43ec5c6ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 15:02:45 +0000 Subject: [PATCH 27/27] Bump ws from 6.2.1 to 6.2.2 in /website Bumps [ws](https://github.com/websockets/ws) from 6.2.1 to 6.2.2. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/commits) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index e23e29c0e5..f1527f5b76 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -8754,9 +8754,9 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0"