mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
Merge pull request #577 from pypeclub/feature/ftrack_module_without_qt
Ftrack module without Qt
This commit is contained in:
commit
2094d4ff7d
9 changed files with 88 additions and 75 deletions
|
|
@ -1,2 +1,12 @@
|
|||
from .lib import *
|
||||
from . import ftrack_server
|
||||
from .ftrack_server import FtrackServer, check_ftrack_url
|
||||
from .lib import BaseHandler, BaseEvent, BaseAction
|
||||
|
||||
__all__ = (
|
||||
"ftrack_server",
|
||||
"FtrackServer",
|
||||
"check_ftrack_url",
|
||||
"BaseHandler",
|
||||
"BaseEvent",
|
||||
"BaseAction"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,2 +1,8 @@
|
|||
from .ftrack_server import FtrackServer
|
||||
from .lib import check_ftrack_url
|
||||
|
||||
|
||||
__all__ = (
|
||||
"FtrackServer",
|
||||
"check_ftrack_url"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@ import pymongo
|
|||
from pype.api import decompose_url
|
||||
|
||||
|
||||
class NotActiveTable(Exception):
|
||||
class NotActiveCollection(Exception):
|
||||
def __init__(self, *args, **kwargs):
|
||||
msg = "Active table is not set. (This is bug)"
|
||||
msg = "Active collection is not set. (This is bug)"
|
||||
if not (args or kwargs):
|
||||
args = [msg]
|
||||
super().__init__(*args, **kwargs)
|
||||
|
|
@ -40,12 +40,12 @@ def auto_reconnect(func):
|
|||
return decorated
|
||||
|
||||
|
||||
def check_active_table(func):
|
||||
def check_active_collection(func):
|
||||
"""Check if CustomDbConnector has active collection."""
|
||||
@functools.wraps(func)
|
||||
def decorated(obj, *args, **kwargs):
|
||||
if not obj.active_table:
|
||||
raise NotActiveTable()
|
||||
if not obj.active_collection:
|
||||
raise NotActiveCollection()
|
||||
return func(obj, *args, **kwargs)
|
||||
return decorated
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ class CustomDbConnector:
|
|||
timeout = int(os.environ["AVALON_TIMEOUT"])
|
||||
|
||||
def __init__(
|
||||
self, uri, database_name, port=None, table_name=None
|
||||
self, uri, database_name, port=None, collection_name=None
|
||||
):
|
||||
self._mongo_client = None
|
||||
self._sentry_client = None
|
||||
|
|
@ -76,10 +76,10 @@ class CustomDbConnector:
|
|||
self._port = port
|
||||
self._database_name = database_name
|
||||
|
||||
self.active_table = table_name
|
||||
self.active_collection = collection_name
|
||||
|
||||
def __getitem__(self, key):
|
||||
# gives direct access to collection withou setting `active_table`
|
||||
# gives direct access to collection withou setting `active_collection`
|
||||
return self._database[key]
|
||||
|
||||
def __getattribute__(self, attr):
|
||||
|
|
@ -88,9 +88,11 @@ class CustomDbConnector:
|
|||
try:
|
||||
return super(CustomDbConnector, self).__getattribute__(attr)
|
||||
except AttributeError:
|
||||
if self.active_table is None:
|
||||
raise NotActiveTable()
|
||||
return self._database[self.active_table].__getattribute__(attr)
|
||||
if self.active_collection is None:
|
||||
raise NotActiveCollection()
|
||||
return self._database[self.active_collection].__getattribute__(
|
||||
attr
|
||||
)
|
||||
|
||||
def install(self):
|
||||
"""Establish a persistent connection to the database"""
|
||||
|
|
@ -146,46 +148,30 @@ class CustomDbConnector:
|
|||
self._is_installed = False
|
||||
atexit.unregister(self.uninstall)
|
||||
|
||||
def create_table(self, name, **options):
|
||||
if self.exist_table(name):
|
||||
def collection_exists(self, collection_name):
|
||||
return collection_name in self.collections()
|
||||
|
||||
def create_collection(self, name, **options):
|
||||
if self.collection_exists(name):
|
||||
return
|
||||
|
||||
return self._database.create_collection(name, **options)
|
||||
|
||||
def exist_table(self, table_name):
|
||||
return table_name in self.tables()
|
||||
|
||||
def create_table(self, name, **options):
|
||||
if self.exist_table(name):
|
||||
return
|
||||
|
||||
return self._database.create_collection(name, **options)
|
||||
|
||||
def exist_table(self, table_name):
|
||||
return table_name in self.tables()
|
||||
|
||||
def tables(self):
|
||||
"""List available tables
|
||||
Returns:
|
||||
list of table names
|
||||
"""
|
||||
collection_names = self.collections()
|
||||
for table_name in collection_names:
|
||||
if table_name in ("system.indexes",):
|
||||
continue
|
||||
yield table_name
|
||||
|
||||
@auto_reconnect
|
||||
def collections(self):
|
||||
return self._database.collection_names()
|
||||
for col_name in self._database.collection_names():
|
||||
if col_name not in ("system.indexes",):
|
||||
yield col_name
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def insert_one(self, item, **options):
|
||||
assert isinstance(item, dict), "item must be of type <dict>"
|
||||
return self._database[self.active_table].insert_one(item, **options)
|
||||
return self._database[self.active_collection].insert_one(
|
||||
item, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def insert_many(self, items, ordered=True, **options):
|
||||
# check if all items are valid
|
||||
|
|
@ -194,72 +180,74 @@ class CustomDbConnector:
|
|||
assert isinstance(item, dict), "`item` must be of type <dict>"
|
||||
|
||||
options["ordered"] = ordered
|
||||
return self._database[self.active_table].insert_many(items, **options)
|
||||
return self._database[self.active_collection].insert_many(
|
||||
items, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def find(self, filter, projection=None, sort=None, **options):
|
||||
options["sort"] = sort
|
||||
return self._database[self.active_table].find(
|
||||
return self._database[self.active_collection].find(
|
||||
filter, projection, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def find_one(self, filter, projection=None, sort=None, **options):
|
||||
assert isinstance(filter, dict), "filter must be <dict>"
|
||||
options["sort"] = sort
|
||||
return self._database[self.active_table].find_one(
|
||||
return self._database[self.active_collection].find_one(
|
||||
filter,
|
||||
projection,
|
||||
**options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def replace_one(self, filter, replacement, **options):
|
||||
return self._database[self.active_table].replace_one(
|
||||
return self._database[self.active_collection].replace_one(
|
||||
filter, replacement, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def update_one(self, filter, update, **options):
|
||||
return self._database[self.active_table].update_one(
|
||||
return self._database[self.active_collection].update_one(
|
||||
filter, update, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def update_many(self, filter, update, **options):
|
||||
return self._database[self.active_table].update_many(
|
||||
return self._database[self.active_collection].update_many(
|
||||
filter, update, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def distinct(self, **options):
|
||||
return self._database[self.active_table].distinct(**options)
|
||||
return self._database[self.active_collection].distinct(**options)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def drop_collection(self, name_or_collection, **options):
|
||||
return self._database[self.active_table].drop(
|
||||
return self._database[self.active_collection].drop(
|
||||
name_or_collection, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def delete_one(self, filter, collation=None, **options):
|
||||
options["collation"] = collation
|
||||
return self._database[self.active_table].delete_one(
|
||||
return self._database[self.active_collection].delete_one(
|
||||
filter, **options
|
||||
)
|
||||
|
||||
@check_active_table
|
||||
@check_active_collection
|
||||
@auto_reconnect
|
||||
def delete_many(self, filter, collation=None, **options):
|
||||
options["collation"] = collation
|
||||
return self._database[self.active_table].delete_many(
|
||||
return self._database[self.active_collection].delete_many(
|
||||
filter, **options
|
||||
)
|
||||
|
|
@ -26,7 +26,7 @@ from pype.api import (
|
|||
compose_url
|
||||
)
|
||||
|
||||
from pype.modules.ftrack.lib.custom_db_connector import CustomDbConnector
|
||||
from .custom_db_connector import CustomDbConnector
|
||||
|
||||
|
||||
TOPIC_STATUS_SERVER = "pype.event.server.status"
|
||||
|
|
@ -153,9 +153,9 @@ class StorerEventHub(SocketBaseEventHub):
|
|||
class ProcessEventHub(SocketBaseEventHub):
|
||||
|
||||
hearbeat_msg = b"processor"
|
||||
uri, port, database, table_name = get_ftrack_event_mongo_info()
|
||||
uri, port, database, collection_name = get_ftrack_event_mongo_info()
|
||||
|
||||
is_table_created = False
|
||||
is_collection_created = False
|
||||
pypelog = Logger().get_logger("Session Processor")
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
|
@ -163,7 +163,7 @@ class ProcessEventHub(SocketBaseEventHub):
|
|||
self.uri,
|
||||
self.database,
|
||||
self.port,
|
||||
self.table_name
|
||||
self.collection_name
|
||||
)
|
||||
super(ProcessEventHub, self).__init__(*args, **kwargs)
|
||||
|
||||
|
|
@ -184,7 +184,7 @@ class ProcessEventHub(SocketBaseEventHub):
|
|||
"Error with Mongo access, probably permissions."
|
||||
"Check if exist database with name \"{}\""
|
||||
" and collection \"{}\" inside."
|
||||
).format(self.database, self.table_name))
|
||||
).format(self.database, self.collection_name))
|
||||
self.sock.sendall(b"MongoError")
|
||||
sys.exit(0)
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,9 @@ from pype.modules.ftrack.ftrack_server.lib import (
|
|||
get_ftrack_event_mongo_info,
|
||||
TOPIC_STATUS_SERVER, TOPIC_STATUS_SERVER_RESULT
|
||||
)
|
||||
from pype.modules.ftrack.lib.custom_db_connector import CustomDbConnector
|
||||
from pype.modules.ftrack.ftrack_server.custom_db_connector import (
|
||||
CustomDbConnector
|
||||
)
|
||||
from pype.api import Logger
|
||||
|
||||
log = Logger().get_logger("Event storer")
|
||||
|
|
@ -23,8 +25,8 @@ class SessionFactory:
|
|||
session = None
|
||||
|
||||
|
||||
uri, port, database, table_name = get_ftrack_event_mongo_info()
|
||||
dbcon = CustomDbConnector(uri, database, port, table_name)
|
||||
uri, port, database, collection_name = get_ftrack_event_mongo_info()
|
||||
dbcon = CustomDbConnector(uri, database, port, collection_name)
|
||||
|
||||
# ignore_topics = ["ftrack.meta.connected"]
|
||||
ignore_topics = []
|
||||
|
|
@ -200,7 +202,7 @@ def main(args):
|
|||
"Error with Mongo access, probably permissions."
|
||||
"Check if exist database with name \"{}\""
|
||||
" and collection \"{}\" inside."
|
||||
).format(database, table_name))
|
||||
).format(database, collection_name))
|
||||
sock.sendall(b"MongoError")
|
||||
|
||||
finally:
|
||||
|
|
|
|||
|
|
@ -1022,7 +1022,7 @@ class SyncEntitiesFactory:
|
|||
continue
|
||||
|
||||
ent_path_items = [ent["name"] for ent in entity["link"]]
|
||||
parents = ent_path_items[1:len(ent_path_items)-1:]
|
||||
parents = ent_path_items[1:len(ent_path_items) - 1:]
|
||||
hierarchy = ""
|
||||
if len(parents) > 0:
|
||||
hierarchy = os.path.sep.join(parents)
|
||||
|
|
@ -1141,7 +1141,7 @@ class SyncEntitiesFactory:
|
|||
if not is_right and not else_match_better:
|
||||
entity = entity_dict["entity"]
|
||||
ent_path_items = [ent["name"] for ent in entity["link"]]
|
||||
parents = ent_path_items[1:len(ent_path_items)-1:]
|
||||
parents = ent_path_items[1:len(ent_path_items) - 1:]
|
||||
av_parents = av_ent_by_mongo_id["data"]["parents"]
|
||||
if av_parents == parents:
|
||||
is_right = True
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ import functools
|
|||
import time
|
||||
from pype.api import Logger
|
||||
import ftrack_api
|
||||
from pype.modules.ftrack.ftrack_server.lib import SocketSession
|
||||
from pype.modules.ftrack import ftrack_server
|
||||
|
||||
|
||||
class MissingPermision(Exception):
|
||||
|
|
@ -41,7 +41,7 @@ class BaseHandler(object):
|
|||
self.log = Logger().get_logger(self.__class__.__name__)
|
||||
if not(
|
||||
isinstance(session, ftrack_api.session.Session) or
|
||||
isinstance(session, SocketSession)
|
||||
isinstance(session, ftrack_server.lib.SocketSession)
|
||||
):
|
||||
raise Exception((
|
||||
"Session object entered with args is instance of \"{}\""
|
||||
|
|
@ -49,7 +49,7 @@ class BaseHandler(object):
|
|||
).format(
|
||||
str(type(session)),
|
||||
str(ftrack_api.session.Session),
|
||||
str(SocketSession)
|
||||
str(ftrack_server.lib.SocketSession)
|
||||
))
|
||||
|
||||
self._session = session
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import os
|
||||
import requests
|
||||
from avalon import style
|
||||
from pype.modules.ftrack import credentials
|
||||
from pype.modules.ftrack.lib import credentials
|
||||
from . import login_tools
|
||||
from pype.api import resources
|
||||
from Qt import QtCore, QtGui, QtWidgets
|
||||
|
|
@ -238,6 +238,8 @@ class CredentialsDialog(QtWidgets.QDialog):
|
|||
|
||||
# If there is an existing server thread running we need to stop it.
|
||||
if self._login_server_thread:
|
||||
if self._login_server_thread.isAlive():
|
||||
self._login_server_thread.stop()
|
||||
self._login_server_thread.join()
|
||||
self._login_server_thread = None
|
||||
|
||||
|
|
|
|||
|
|
@ -61,12 +61,17 @@ class LoginServerThread(threading.Thread):
|
|||
def __init__(self, url, callback):
|
||||
self.url = url
|
||||
self.callback = callback
|
||||
self._server = None
|
||||
super(LoginServerThread, self).__init__()
|
||||
|
||||
def _handle_login(self, api_user, api_key):
|
||||
'''Login to server with *api_user* and *api_key*.'''
|
||||
self.callback(api_user, api_key)
|
||||
|
||||
def stop(self):
|
||||
if self._server:
|
||||
self._server.server_close()
|
||||
|
||||
def run(self):
|
||||
'''Listen for events.'''
|
||||
self._server = HTTPServer(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue