diff --git a/pype/ftrack/actions/action_Apps.py b/pype/ftrack/actions/action_Apps.py index 3d1bf093de..ecc3062d83 100644 --- a/pype/ftrack/actions/action_Apps.py +++ b/pype/ftrack/actions/action_Apps.py @@ -9,7 +9,7 @@ from app.api import Logger log = Logger.getLogger(__name__) def registerApp(app, session): - name = app['name'].split("_")[0] + name = app['name'] variant = "" try: variant = app['name'].split("_")[1] @@ -31,11 +31,19 @@ def registerApp(app, session): label = apptoml['ftrack_label'] icon = None + ftrack_resources = "" # Path to resources here + if 'icon' in apptoml: icon = apptoml['icon'] + if '{ftrack_resources}' in icon: + icon = icon.format(ftrack_resources) + + description = None + if 'description' in apptoml: + description = apptoml['description'] # register action - AppAction(session, label, name, executable, variant, icon).register() + AppAction(session, label, name, executable, variant, icon, description).register() def register(session): @@ -59,6 +67,7 @@ def register(session): appNames.append(app['name']) apps.append(app) + apps = sorted(apps, key=lambda x: x['name']) for app in apps: try: registerApp(app, session) diff --git a/pype/ftrack/actions/ftrack_action_handler.py b/pype/ftrack/actions/ftrack_action_handler.py index 15c57dbb1c..de8b7b2845 100644 --- a/pype/ftrack/actions/ftrack_action_handler.py +++ b/pype/ftrack/actions/ftrack_action_handler.py @@ -14,9 +14,6 @@ import acre from pype import api as pype -log = pype.Logger.getLogger(__name__, "ftrack") - -log.debug("pype.Anatomy: {}".format(pype.Anatomy)) class AppAction(object): @@ -72,9 +69,7 @@ class AppAction(object): ), self._launch ) - self.log.info("Application '{}' - Registered successfully".format(self.label)) - - self.log.info("Application '{}' - Registered successfully".format(self.label)) + self.log.info("Application '{} {}' - Registered successfully".format(self.label,self.variant)) def _discover(self, event): args = self._translate_event( @@ -137,7 +132,7 @@ class AppAction(object): else: apps = [] for app in project['config']['apps']: - apps.append(app['name'].split("_")[0]) + apps.append(app['name']) if self.identifier not in apps: return False @@ -231,17 +226,13 @@ class AppAction(object): entity, id = entities[0] entity = session.get(entity, id) - silo = "Film" - if entity.entity_type == "AssetBuild": - silo = "Asset" - # set environments for Avalon os.environ["AVALON_PROJECT"] = entity['project']['full_name'] - os.environ["AVALON_SILO"] = silo + os.environ["AVALON_SILO"] = entity['ancestors'][0]['name'] os.environ["AVALON_ASSET"] = entity['parent']['name'] os.environ["AVALON_TASK"] = entity['name'] - os.environ["AVALON_APP"] = self.identifier - os.environ["AVALON_APP_NAME"] = self.identifier + "_" + self.variant + os.environ["AVALON_APP"] = self.identifier.split("_")[0] + os.environ["AVALON_APP_NAME"] = self.identifier os.environ["FTRACK_TASKID"] = id @@ -262,7 +253,7 @@ class AppAction(object): try: anatomy = anatomy.format(data) except Exception as e: - log.error("{0} Error in anatomy.format: {1}".format(__name__, e)) + self.log.error("{0} Error in anatomy.format: {1}".format(__name__, e)) os.environ["AVALON_WORKDIR"] = os.path.join(anatomy.work.root, anatomy.work.folder) # TODO Add paths to avalon setup from tomls @@ -282,7 +273,7 @@ class AppAction(object): parents.append(session.get(item['type'], item['id'])) # collect all the 'environment' attributes from parents - tools_attr = [os.environ["AVALON_APP_NAME"]] + tools_attr = [os.environ["AVALON_APP"], os.environ["AVALON_APP_NAME"]] for parent in reversed(parents): # check if the attribute is empty, if not use it if parent['custom_attributes']['tools_env']: @@ -328,7 +319,7 @@ class AppAction(object): try: fp = open(execfile) except PermissionError as p: - log.error('Access denied on {0} - {1}'. + self.log.error('Access denied on {0} - {1}'. format(execfile, p)) return { 'success': False, @@ -338,7 +329,7 @@ class AppAction(object): fp.close() # check executable permission if not os.access(execfile, os.X_OK): - log.error('No executable permission on {}'. + self.log.error('No executable permission on {}'. format(execfile)) return { 'success': False, @@ -347,7 +338,7 @@ class AppAction(object): } pass else: - log.error('Launcher doesn\'t exist - {}'. + self.log.error('Launcher doesn\'t exist - {}'. format(execfile)) return { 'success': False, diff --git a/pype/ftrack/ftrackRun.py b/pype/ftrack/ftrackRun.py deleted file mode 100644 index 7fddf171da..0000000000 --- a/pype/ftrack/ftrackRun.py +++ /dev/null @@ -1,209 +0,0 @@ -import sys -import os -import argparse -import subprocess -import threading -import time -from app import style -from app.vendor.Qt import QtCore, QtGui, QtWidgets -from pype.ftrack import credentials, login_dialog as login_dialog - -from FtrackServer import FtrackServer - -from pype import api as pype - - -# load data from templates -pype.load_data_from_templates() - -log = pype.Logger.getLogger(__name__, "ftrack") -# Validation if alredy logged into Ftrack - - -class FtrackRunner: - def __init__(self, main_parent=None, parent=None): - - self.parent = parent - self.loginWidget = login_dialog.Login_Dialog_ui(self) - self.actionThread = None - self.actionServer = FtrackServer('action') - self.eventThread = None - self.eventServer = FtrackServer('event') - - self.boolLogged = False - self.boolActionServer = False - self.boolEventServer = False - - def showLoginWidget(self): - self.loginWidget.show() - - def validate(self): - validation = False - cred = credentials._get_credentials() - try: - if 'username' in cred and 'apiKey' in cred: - validation = credentials._check_credentials( - cred['username'], - cred['apiKey'] - ) - if validation is False: - self.showLoginWidget() - else: - self.showLoginWidget() - - except Exception as e: - log.error("We are unable to connect to Ftrack: {0}".format(e)) - - validation = credentials._check_credentials() - if validation is True: - log.info("Connected to Ftrack successfully") - self.loginChange() - else: - log.warning("Please sign in to Ftrack") - self.boolLogged = False - self.setMenuVisibility() - - return validation - - # Necessary - login_dialog works with this method after logging in - def loginChange(self): - self.boolLogged = True - self.setMenuVisibility() - self.runActionServer() - - def logout(self): - credentials._clear_credentials() - self.stopActionServer() - self.stopEventServer() - - log.info("Logged out of Ftrack") - self.boolLogged = False - self.setMenuVisibility() - - # Actions part - def runActionServer(self): - if self.actionThread is None: - self.actionThread = threading.Thread(target=self.setActionServer) - self.actionThread.daemon = True - self.actionThread.start() - - log.info("Ftrack action server launched") - self.boolActionServer = True - self.setMenuVisibility() - - def setActionServer(self): - self.actionServer.run_server() - - def resetActionServer(self): - self.stopActionServer() - self.runActionServer() - - def stopActionServer(self): - try: - self.actionServer.stop_session() - if self.actionThread is not None: - self.actionThread.join() - self.actionThread = None - - log.info("Ftrack action server stopped") - self.boolActionServer = False - self.setMenuVisibility() - except Exception as e: - log.error("During Killing action server: {0}".format(e)) - - # Events part - def runEventServer(self): - if self.eventThread is None: - self.eventThread = threading.Thread(target=self.setEventServer) - self.eventThread.daemon = True - self.eventThread.start() - - log.info("Ftrack event server launched") - self.boolEventServer = True - self.setMenuVisibility() - - def setEventServer(self): - self.eventServer.run_server() - - def resetEventServer(self): - self.stopEventServer() - self.runEventServer() - - def stopEventServer(self): - try: - self.eventServer.stop_session() - if self.eventThread is not None: - self.eventThread.join() - self.eventThread = None - - log.info("Ftrack event server stopped") - self.boolEventServer = False - self.setMenuVisibility() - except Exception as e: - log.error("During Killing Event server: {0}".format(e)) - - # Definition of Tray menu - def trayMenu(self, parent): - # Menu for Tray App - self.menu = QtWidgets.QMenu('Ftrack', parent) - self.menu.setProperty('submenu', 'on') - self.menu.setStyleSheet(style.load_stylesheet()) - - # Actions - server - self.smActionS = self.menu.addMenu("Action server") - self.aRunActionS = QtWidgets.QAction("Run action server", self.smActionS) - self.aRunActionS.triggered.connect(self.runActionServer) - self.aResetActionS = QtWidgets.QAction("Reset action server", self.smActionS) - self.aResetActionS.triggered.connect(self.resetActionServer) - self.aStopActionS = QtWidgets.QAction("Stop action server", self.smActionS) - self.aStopActionS.triggered.connect(self.stopActionServer) - - self.smActionS.addAction(self.aRunActionS) - self.smActionS.addAction(self.aResetActionS) - self.smActionS.addAction(self.aStopActionS) - - # Actions - server - self.smEventS = self.menu.addMenu("Event server") - self.aRunEventS = QtWidgets.QAction("Run event server", self.smEventS) - self.aRunEventS.triggered.connect(self.runEventServer) - self.aResetEventS = QtWidgets.QAction("Reset event server", self.smEventS) - self.aResetEventS.triggered.connect(self.resetEventServer) - self.aStopEventS = QtWidgets.QAction("Stop event server", self.smEventS) - self.aStopEventS.triggered.connect(self.stopEventServer) - - self.smEventS.addAction(self.aRunEventS) - self.smEventS.addAction(self.aResetEventS) - self.smEventS.addAction(self.aStopEventS) - - # Actions - basic - self.aLogin = QtWidgets.QAction("Login", self.menu) - self.aLogin.triggered.connect(self.validate) - self.aLogout = QtWidgets.QAction("Logout", self.menu) - self.aLogout.triggered.connect(self.logout) - - self.menu.addAction(self.aLogin) - self.menu.addAction(self.aLogout) - - self.boolLogged = False - self.setMenuVisibility() - - return self.menu - - # Definition of visibility of each menu actions - def setMenuVisibility(self): - - self.smActionS.menuAction().setVisible(self.boolLogged) - self.smEventS.menuAction().setVisible(self.boolLogged) - self.aLogin.setVisible(not self.boolLogged) - self.aLogout.setVisible(self.boolLogged) - - if self.boolLogged is False: - return - - self.aRunActionS.setVisible(not self.boolActionServer) - self.aResetActionS.setVisible(self.boolActionServer) - self.aStopActionS.setVisible(self.boolActionServer) - - self.aRunEventS.setVisible(not self.boolEventServer) - self.aResetEventS.setVisible(self.boolEventServer) - self.aStopEventS.setVisible(self.boolEventServer)