mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Merge branch 'develop' into feature/PYPE-71-event_server
This commit is contained in:
commit
1ff834e971
3 changed files with 21 additions and 230 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue