Merge branch 'develop' into feature/PYPE-71-event_server

This commit is contained in:
Jakub Trllo 2018-12-07 09:57:01 +01:00
commit 1ff834e971
3 changed files with 21 additions and 230 deletions

View file

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

View file

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

View file

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