From f66c08c05ef5d8dddcd90d5396f033e44f9e7f83 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:38:28 +0100 Subject: [PATCH 01/18] modified imports in actions and events --- .../actions/action_store_thumbnails_to_avalon.py | 2 +- .../ftrack/events/action_sync_to_avalon.py | 2 +- .../ftrack/events/event_first_version_status.py | 2 +- .../ftrack/events/event_next_task_update.py | 2 +- .../events/event_push_frame_values_to_task.py | 2 +- .../ftrack/events/event_sync_to_avalon.py | 16 ++++++++++------ .../ftrack/events/event_task_to_parent_status.py | 2 +- .../events/event_task_to_version_status.py | 2 +- .../ftrack/events/event_thumbnail_updates.py | 2 +- .../ftrack/events/event_user_assigment.py | 2 +- .../events/event_version_to_task_statuses.py | 2 +- 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py b/pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py index 84f857e37a1..4fbea6b8a5b 100644 --- a/pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py +++ b/pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py @@ -1,7 +1,7 @@ import os -import requests import errno import json +import requests from bson.objectid import ObjectId from pype.modules.ftrack.lib import BaseAction, statics_icon diff --git a/pype/modules/ftrack/events/action_sync_to_avalon.py b/pype/modules/ftrack/events/action_sync_to_avalon.py index 486b977f04d..6bec1fb259c 100644 --- a/pype/modules/ftrack/events/action_sync_to_avalon.py +++ b/pype/modules/ftrack/events/action_sync_to_avalon.py @@ -1,7 +1,7 @@ import time import traceback -from pype.modules.ftrack import ServerAction +from pype.modules.ftrack.lib import ServerAction from pype.modules.ftrack.lib.avalon_sync import SyncEntitiesFactory diff --git a/pype/modules/ftrack/events/event_first_version_status.py b/pype/modules/ftrack/events/event_first_version_status.py index cfca047c097..440b455edf4 100644 --- a/pype/modules/ftrack/events/event_first_version_status.py +++ b/pype/modules/ftrack/events/event_first_version_status.py @@ -1,4 +1,4 @@ -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class FirstVersionStatus(BaseEvent): diff --git a/pype/modules/ftrack/events/event_next_task_update.py b/pype/modules/ftrack/events/event_next_task_update.py index 284cff886bd..e546f00c777 100644 --- a/pype/modules/ftrack/events/event_next_task_update.py +++ b/pype/modules/ftrack/events/event_next_task_update.py @@ -1,5 +1,5 @@ import collections -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class NextTaskUpdate(BaseEvent): diff --git a/pype/modules/ftrack/events/event_push_frame_values_to_task.py b/pype/modules/ftrack/events/event_push_frame_values_to_task.py index 8e277679bd8..f41466d664d 100644 --- a/pype/modules/ftrack/events/event_push_frame_values_to_task.py +++ b/pype/modules/ftrack/events/event_push_frame_values_to_task.py @@ -2,7 +2,7 @@ import datetime import ftrack_api -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class PushFrameValuesToTaskEvent(BaseEvent): diff --git a/pype/modules/ftrack/events/event_sync_to_avalon.py b/pype/modules/ftrack/events/event_sync_to_avalon.py index 527f3996e1e..7c9c4d196fe 100644 --- a/pype/modules/ftrack/events/event_sync_to_avalon.py +++ b/pype/modules/ftrack/events/event_sync_to_avalon.py @@ -10,16 +10,20 @@ from bson.objectid import ObjectId from pymongo import UpdateOne +import ftrack_api + from avalon import schema +from avalon.api import AvalonMongoDB -from pype.modules.ftrack.lib import avalon_sync +from pype.modules.ftrack.lib import ( + avalon_sync, + BaseEvent +) from pype.modules.ftrack.lib.avalon_sync import ( - CUST_ATTR_ID_KEY, CUST_ATTR_AUTO_SYNC, EntitySchemas + CUST_ATTR_ID_KEY, + CUST_ATTR_AUTO_SYNC, + EntitySchemas ) -import ftrack_api -from pype.modules.ftrack import BaseEvent - -from avalon.api import AvalonMongoDB class SyncToAvalonEvent(BaseEvent): diff --git a/pype/modules/ftrack/events/event_task_to_parent_status.py b/pype/modules/ftrack/events/event_task_to_parent_status.py index 9b1f61911e2..72b66754040 100644 --- a/pype/modules/ftrack/events/event_task_to_parent_status.py +++ b/pype/modules/ftrack/events/event_task_to_parent_status.py @@ -1,5 +1,5 @@ import collections -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class TaskStatusToParent(BaseEvent): diff --git a/pype/modules/ftrack/events/event_task_to_version_status.py b/pype/modules/ftrack/events/event_task_to_version_status.py index d27a7f9e98f..14f456831f5 100644 --- a/pype/modules/ftrack/events/event_task_to_version_status.py +++ b/pype/modules/ftrack/events/event_task_to_version_status.py @@ -1,5 +1,5 @@ import collections -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class TaskToVersionStatus(BaseEvent): diff --git a/pype/modules/ftrack/events/event_thumbnail_updates.py b/pype/modules/ftrack/events/event_thumbnail_updates.py index b71322c894c..de189463d06 100644 --- a/pype/modules/ftrack/events/event_thumbnail_updates.py +++ b/pype/modules/ftrack/events/event_thumbnail_updates.py @@ -1,5 +1,5 @@ import collections -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class ThumbnailEvents(BaseEvent): diff --git a/pype/modules/ftrack/events/event_user_assigment.py b/pype/modules/ftrack/events/event_user_assigment.py index 59880fabe52..85cf6db12b5 100644 --- a/pype/modules/ftrack/events/event_user_assigment.py +++ b/pype/modules/ftrack/events/event_user_assigment.py @@ -2,7 +2,7 @@ import re import subprocess -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent from pype.modules.ftrack.lib.avalon_sync import CUST_ATTR_ID_KEY from avalon.api import AvalonMongoDB diff --git a/pype/modules/ftrack/events/event_version_to_task_statuses.py b/pype/modules/ftrack/events/event_version_to_task_statuses.py index 4a42e273361..58caf7db514 100644 --- a/pype/modules/ftrack/events/event_version_to_task_statuses.py +++ b/pype/modules/ftrack/events/event_version_to_task_statuses.py @@ -1,4 +1,4 @@ -from pype.modules.ftrack import BaseEvent +from pype.modules.ftrack.lib import BaseEvent class VersionToTaskStatus(BaseEvent): From 6862284b3c01ad3aa762aaf10979a6892bd7639a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:39:42 +0100 Subject: [PATCH 02/18] FtrackServer does not care about server type --- pype/modules/ftrack/ftrack_server/ftrack_server.py | 6 ++---- pype/modules/ftrack/ftrack_server/sub_event_processor.py | 3 +-- pype/modules/ftrack/ftrack_server/sub_event_status.py | 2 +- pype/modules/ftrack/ftrack_server/sub_event_storer.py | 2 +- pype/modules/ftrack/ftrack_server/sub_user_server.py | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/pype/modules/ftrack/ftrack_server/ftrack_server.py b/pype/modules/ftrack/ftrack_server/ftrack_server.py index 3e0c7525961..e093636dfa1 100644 --- a/pype/modules/ftrack/ftrack_server/ftrack_server.py +++ b/pype/modules/ftrack/ftrack_server/ftrack_server.py @@ -32,14 +32,14 @@ class FtrackServer: - def __init__(self, handler_paths=None, server_type='action'): + def __init__(self, handler_paths=None): """ - 'type' is by default set to 'action' - Runs Action server - enter 'event' for Event server EXAMPLE FOR EVENT SERVER: ... - server = FtrackServer('event') + server = FtrackServer() server.run_server() .. """ @@ -52,8 +52,6 @@ def __init__(self, handler_paths=None, server_type='action'): self.handler_paths = handler_paths or [] - self.server_type = server_type - def stop_session(self): self.stopped = True if self.session.event_hub.connected is True: diff --git a/pype/modules/ftrack/ftrack_server/sub_event_processor.py b/pype/modules/ftrack/ftrack_server/sub_event_processor.py index f48b2141e63..51d796cea6e 100644 --- a/pype/modules/ftrack/ftrack_server/sub_event_processor.py +++ b/pype/modules/ftrack/ftrack_server/sub_event_processor.py @@ -83,8 +83,7 @@ def main(args): manager = ModulesManager() ftrack_module = manager.modules_by_name["ftrack"] server = FtrackServer( - ftrack_module.server_event_handlers_paths, - "event" + ftrack_module.server_event_handlers_paths ) log.debug("Launched Ftrack Event processor") server.run_server(session) diff --git a/pype/modules/ftrack/ftrack_server/sub_event_status.py b/pype/modules/ftrack/ftrack_server/sub_event_status.py index 07b233282f4..bb72d9ac159 100644 --- a/pype/modules/ftrack/ftrack_server/sub_event_status.py +++ b/pype/modules/ftrack/ftrack_server/sub_event_status.py @@ -370,7 +370,7 @@ def main(args): ObjectFactory.session = session session.event_hub.heartbeat_callbacks.append(heartbeat) register(session) - server = FtrackServer(server_type="event") + server = FtrackServer() log.debug("Launched Ftrack Event statuser") server.run_server(session, load_files=False) diff --git a/pype/modules/ftrack/ftrack_server/sub_event_storer.py b/pype/modules/ftrack/ftrack_server/sub_event_storer.py index 2fdd3b07f76..2032c122ccb 100644 --- a/pype/modules/ftrack/ftrack_server/sub_event_storer.py +++ b/pype/modules/ftrack/ftrack_server/sub_event_storer.py @@ -195,7 +195,7 @@ def main(args): ) SessionFactory.session = session register(session) - server = FtrackServer(server_type="event") + server = FtrackServer() log.debug("Launched Ftrack Event storer") server.run_server(session, load_files=False) diff --git a/pype/modules/ftrack/ftrack_server/sub_user_server.py b/pype/modules/ftrack/ftrack_server/sub_user_server.py index b968714faf3..79cd90a0d7a 100644 --- a/pype/modules/ftrack/ftrack_server/sub_user_server.py +++ b/pype/modules/ftrack/ftrack_server/sub_user_server.py @@ -36,7 +36,7 @@ def main(args): ftrack_module = manager.modules_by_name["ftrack"] ftrack_module.user_event_handlers_paths server = FtrackServer( - ftrack_module.user_event_handlers_paths, "action" + ftrack_module.user_event_handlers_paths ) log.debug("Launching User Ftrack Server") server.run_server(session=session) From 20909b50cd69ceec24856a3e58e1e9db5621702a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:43:37 +0100 Subject: [PATCH 03/18] modules_from_path can return crashed modules --- pype/lib/python_module_tools.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pype/lib/python_module_tools.py b/pype/lib/python_module_tools.py index b5400c9981e..559dd04bab5 100644 --- a/pype/lib/python_module_tools.py +++ b/pype/lib/python_module_tools.py @@ -9,15 +9,20 @@ PY3 = sys.version_info[0] == 3 -def modules_from_path(folder_path): +def modules_from_path(folder_path, return_crashed=False): """Get python scripts as modules from a path. Arguments: path (str): Path to folder containing python scripts. + return_crasher (bool): Crashed module paths with exception info + will be returned too. Returns: - List of modules. + list, tuple: List of modules when `return_crashed` is False else tuple + with list of modules at first place and tuple of path and exception + info at second place. """ + crashed = [] modules = [] # Just skip and return empty list if path is not set if not folder_path: @@ -70,12 +75,15 @@ def modules_from_path(folder_path): modules.append(module) except Exception: + crashed.append((full_path, sys.exc_info())) log.warning( "Failed to load path: \"{0}\"".format(full_path), exc_info=True ) continue + if return_crashed: + return modules, crashed return modules From 329a39e4440ae7f00fa197cd2136baf8c97b61e2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:44:14 +0100 Subject: [PATCH 04/18] FtrackServer is using `modules_from_path` from pype.lib --- .../ftrack/ftrack_server/ftrack_server.py | 86 ++++++++----------- 1 file changed, 38 insertions(+), 48 deletions(-) diff --git a/pype/modules/ftrack/ftrack_server/ftrack_server.py b/pype/modules/ftrack/ftrack_server/ftrack_server.py index e093636dfa1..9d9d8c4630b 100644 --- a/pype/modules/ftrack/ftrack_server/ftrack_server.py +++ b/pype/modules/ftrack/ftrack_server/ftrack_server.py @@ -1,17 +1,17 @@ import os -import sys import types -import importlib -import time import logging -import inspect +import traceback import ftrack_api -from pype.lib import PypeLogger +from pype.lib import ( + PypeLogger, + modules_from_path +) -log = PypeLogger().get_logger(__name__) +log = PypeLogger.get_logger(__name__) """ # Required - Needed for connection to Ftrack @@ -61,60 +61,50 @@ def stop_session(self): def set_files(self, paths): # Iterate all paths - register_functions_dict = [] + register_functions = [] for path in paths: - # add path to PYTHON PATH - if path not in sys.path: - sys.path.append(path) - # Get all modules with functions - for file in os.listdir(path): - # Get only .py files with action functions - try: - if '.pyc' in file or '.py' not in file: - continue - - mod = importlib.import_module(os.path.splitext(file)[0]) - importlib.reload(mod) - mod_functions = dict( - [ - (name, function) - for name, function in mod.__dict__.items() - if isinstance(function, types.FunctionType) - ] - ) + modules, crashed = modules_from_path(path, return_crashed=True) + for filepath, exc_info in crashed: + log.warning("Filepath load crashed {}.\n{}".format( + filepath, traceback.format_exception(*exc_info) + )) - # separate files by register function - if 'register' not in mod_functions: - msg = ('"{}" - Missing register method').format(file) - log.warning(msg) - continue - - register_functions_dict.append({ - 'name': file, - 'register': mod_functions['register'] - }) - except Exception as e: - msg = 'Loading of file "{}" failed ({})'.format( - file, str(e) + for module in modules: + register_function = None + for name, attr in module.__dict__.items(): + if ( + name == "register" + and isinstance(attr, types.FunctionType) + ): + register_function = attr + break + + filepath = os.path.abspath(module.__file__) + if not register_function: + log.warning( + "\"{}\" - Missing register method".format(filepath) ) - log.warning(msg, exc_info=e) + continue + + register_functions.append( + (filepath, register_function) + ) - if len(register_functions_dict) < 1: + if not register_functions: log.warning(( "There are no events with `register` function" " in registered paths: \"{}\"" ).format("| ".join(paths))) - for function_dict in register_functions_dict: - register = function_dict["register"] + for filepath, register_func in register_functions: try: - register(self.session) - except Exception as exc: - msg = '"{}" - register was not successful ({})'.format( - function_dict['name'], str(exc) + register_func(self.session) + except Exception: + log.warning( + "\"{}\" - register was not successful".format(filepath), + exc_info=True ) - log.warning(msg, exc_info=True) def set_handler_paths(self, paths): self.handler_paths = paths From 36eab984dd1ff65da0a472d5bc06521f95ea4a2a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:45:07 +0100 Subject: [PATCH 05/18] ftrack module is python 2 compatible --- .../events/event_push_frame_values_to_task.py | 7 ++--- pype/modules/ftrack/ftrack_module.py | 19 +++++++----- pype/modules/ftrack/lib/avalon_sync.py | 30 +++++++++++-------- 3 files changed, 33 insertions(+), 23 deletions(-) diff --git a/pype/modules/ftrack/events/event_push_frame_values_to_task.py b/pype/modules/ftrack/events/event_push_frame_values_to_task.py index f41466d664d..338866ba5bf 100644 --- a/pype/modules/ftrack/events/event_push_frame_values_to_task.py +++ b/pype/modules/ftrack/events/event_push_frame_values_to_task.py @@ -272,10 +272,9 @@ def finalize( if new_value == old_value: continue - entity_key = collections.OrderedDict({ - "configuration_id": attr_id, - "entity_id": entity_id - }) + entity_key = collections.OrderedDict() + entity_key["configuration_id"] = attr_id + entity_key["entity_id"] = entity_id self._cached_changes.append({ "attr_key": attr_key, "entity_id": entity_id, diff --git a/pype/modules/ftrack/ftrack_module.py b/pype/modules/ftrack/ftrack_module.py index 2cbd79c32e4..fd6d1efb7cb 100644 --- a/pype/modules/ftrack/ftrack_module.py +++ b/pype/modules/ftrack/ftrack_module.py @@ -42,16 +42,21 @@ def initialize(self, settings): self.ftrack_url = ftrack_settings["ftrack_server"] current_dir = os.path.dirname(os.path.abspath(__file__)) - self.server_event_handlers_paths = [ - os.path.join(current_dir, "events"), - *ftrack_settings["ftrack_events_path"] + server_event_handlers_paths = [ + os.path.join(current_dir, "events") ] - self.user_event_handlers_paths = [ - os.path.join(current_dir, "actions"), - *ftrack_settings["ftrack_actions_path"] + server_event_handlers_paths.extend( + ftrack_settings["ftrack_events_path"] + ) + user_event_handlers_paths = [ + os.path.join(current_dir, "actions") ] - + user_event_handlers_paths.extend( + ftrack_settings["ftrack_actions_path"] + ) # Prepare attribute + self.server_event_handlers_paths = server_event_handlers_paths + self.user_event_handlers_paths = user_event_handlers_paths self.tray_module = None def get_global_environments(self): diff --git a/pype/modules/ftrack/lib/avalon_sync.py b/pype/modules/ftrack/lib/avalon_sync.py index e9dc1734c6b..f651c1785d4 100644 --- a/pype/modules/ftrack/lib/avalon_sync.py +++ b/pype/modules/ftrack/lib/avalon_sync.py @@ -1,10 +1,16 @@ import os import re -import queue import json import collections import copy +import six + +if six.PY3: + from queue import Queue +else: + from Queue import Queue + from avalon.api import AvalonMongoDB import avalon @@ -135,7 +141,7 @@ def from_dict_to_set(data, is_project): data.pop("data") result = {"$set": {}} - dict_queue = queue.Queue() + dict_queue = Queue() dict_queue.put((None, data)) while not dict_queue.empty(): @@ -687,7 +693,7 @@ def duplicity_regex_check(self): self.filter_by_duplicate_regex() def filter_by_duplicate_regex(self): - filter_queue = queue.Queue() + filter_queue = Queue() failed_regex_msg = "{} - Entity has invalid symbols in the name" duplicate_msg = "There are multiple entities with the name: \"{}\":" @@ -741,7 +747,7 @@ def filter_by_ignore_sync(self): ) == "_notset_": return - self.filter_queue = queue.Queue() + self.filter_queue = Queue() self.filter_queue.put((self.ft_project_id, False)) while not self.filter_queue.empty(): parent_id, remove = self.filter_queue.get() @@ -778,8 +784,8 @@ def filter_by_selection(self, event): selected_ids.append(entity["entityId"]) sync_ids = [self.ft_project_id] - parents_queue = queue.Queue() - children_queue = queue.Queue() + parents_queue = Queue() + children_queue = Queue() for id in selected_ids: # skip if already filtered with ignore sync custom attribute if id in self.filtered_ids: @@ -1046,7 +1052,7 @@ def set_hierarchical_attribute(self, hier_attrs, sync_ids): if value is not None: project_values[key] = value - hier_down_queue = queue.Queue() + hier_down_queue = Queue() hier_down_queue.put((project_values, top_id)) while not hier_down_queue.empty(): @@ -1225,7 +1231,7 @@ def prepare_avalon_entities(self, ft_project_name): create_ftrack_ids.append(self.ft_project_id) # make it go hierarchically - prepare_queue = queue.Queue() + prepare_queue = Queue() for child_id in self.entities_dict[self.ft_project_id]["children"]: prepare_queue.put(child_id) @@ -1348,7 +1354,7 @@ def filter_with_children(self, ftrack_id): parent_id = ent_dict["parent_id"] self.entities_dict[parent_id]["children"].remove(ftrack_id) - children_queue = queue.Queue() + children_queue = Queue() children_queue.put(ftrack_id) while not children_queue.empty(): _ftrack_id = children_queue.get() @@ -1361,7 +1367,7 @@ def prepare_changes(self): hierarchy_changing_ids = [] ignore_keys = collections.defaultdict(list) - update_queue = queue.Queue() + update_queue = Queue() for ftrack_id in self.update_ftrack_ids: update_queue.put(ftrack_id) @@ -1941,7 +1947,7 @@ def create_avalon_project(self): entity["custom_attributes"][CUST_ATTR_ID_KEY] = str(new_id) def _bubble_changeability(self, unchangeable_ids): - unchangeable_queue = queue.Queue() + unchangeable_queue = Queue() for entity_id in unchangeable_ids: unchangeable_queue.put((entity_id, False)) @@ -2067,7 +2073,7 @@ def update_entities(self): self.dbcon.bulk_write(mongo_changes_bulk) def reload_parents(self, hierarchy_changing_ids): - parents_queue = queue.Queue() + parents_queue = Queue() parents_queue.put((self.ft_project_id, [], False)) while not parents_queue.empty(): ftrack_id, parent_parents, changed = parents_queue.get() From 6e8f477f31e9cb5fc67eada80af36dac87ffb2a8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:45:25 +0100 Subject: [PATCH 06/18] fix legacy server --- pype/modules/ftrack/ftrack_server/sub_legacy_server.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pype/modules/ftrack/ftrack_server/sub_legacy_server.py b/pype/modules/ftrack/ftrack_server/sub_legacy_server.py index e09bcbb699a..2e45b564b39 100644 --- a/pype/modules/ftrack/ftrack_server/sub_legacy_server.py +++ b/pype/modules/ftrack/ftrack_server/sub_legacy_server.py @@ -66,8 +66,7 @@ def main(args): manager = ModulesManager() ftrack_module = manager.modules_by_name["ftrack"] server = FtrackServer( - ftrack_module.server_event_handlers_paths, - "event" + ftrack_module.server_event_handlers_paths ) session = ftrack_api.Session(auto_connect_event_hub=True) From 99ff266760b10a198608ad29d3d80bf028e380f6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:45:44 +0100 Subject: [PATCH 07/18] formatting changes --- pype/modules/ftrack/lib/avalon_sync.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pype/modules/ftrack/lib/avalon_sync.py b/pype/modules/ftrack/lib/avalon_sync.py index f651c1785d4..7373059b68d 100644 --- a/pype/modules/ftrack/lib/avalon_sync.py +++ b/pype/modules/ftrack/lib/avalon_sync.py @@ -22,7 +22,7 @@ import ftrack_api from pype.lib import ApplicationManager -log = Logger().get_logger(__name__) +log = Logger.get_logger(__name__) # Current schemas for avalon types @@ -42,7 +42,8 @@ def default_custom_attributes_definition(): json_file_path = os.path.join( - os.path.dirname(__file__), "custom_attributes.json" + os.path.dirname(os.path.abspath(__file__)), + "custom_attributes.json" ) with open(json_file_path, "r") as json_stream: data = json.load(json_stream) From 06f01f3680422b506b2a01390ca8a2352bb05438 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:46:52 +0100 Subject: [PATCH 08/18] removed event_test.py --- pype/modules/ftrack/events/event_test.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 pype/modules/ftrack/events/event_test.py diff --git a/pype/modules/ftrack/events/event_test.py b/pype/modules/ftrack/events/event_test.py deleted file mode 100644 index c07f8b8d161..00000000000 --- a/pype/modules/ftrack/events/event_test.py +++ /dev/null @@ -1,22 +0,0 @@ -from pype.modules.ftrack import BaseEvent - - -class TestEvent(BaseEvent): - - ignore_me = True - - priority = 10000 - - def launch(self, session, event): - - '''just a testing event''' - - # self.log.info(event) - - return True - - -def register(session): - '''Register plugin. Called when used as an plugin.''' - - TestEvent(session).register() From 4bc0152d604e01a69f9923c25d747f2ea4f9a384 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:48:50 +0100 Subject: [PATCH 09/18] reduced ftrack module init file --- pype/modules/ftrack/__init__.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/pype/modules/ftrack/__init__.py b/pype/modules/ftrack/__init__.py index 4fb427f13a3..c1a557812cc 100644 --- a/pype/modules/ftrack/__init__.py +++ b/pype/modules/ftrack/__init__.py @@ -3,20 +3,9 @@ IFtrackEventHandlerPaths, FTRACK_MODULE_DIR ) -from . import ftrack_server -from .ftrack_server import FtrackServer, check_ftrack_url -from .lib import BaseHandler, BaseEvent, BaseAction, ServerAction __all__ = ( "FtrackModule", "IFtrackEventHandlerPaths", - "FTRACK_MODULE_DIR", - - "ftrack_server", - "FtrackServer", - "check_ftrack_url", - "BaseHandler", - "BaseEvent", - "BaseAction", - "ServerAction" + "FTRACK_MODULE_DIR" ) From e4c5c4eaa209ce48c513d54aa5cf4fe8046e7793 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:49:35 +0100 Subject: [PATCH 10/18] renamed folder `actions` to `event_handlers_user` --- .../{actions => event_handlers_user}/action_applications.py | 0 .../action_batch_task_creation.py | 0 .../action_clean_hierarchical_attributes.py | 0 .../{actions => event_handlers_user}/action_client_review_sort.py | 0 .../{actions => event_handlers_user}/action_component_open.py | 0 .../{actions => event_handlers_user}/action_create_cust_attrs.py | 0 .../{actions => event_handlers_user}/action_create_folders.py | 0 .../action_create_project_structure.py | 0 .../{actions => event_handlers_user}/action_delete_asset.py | 0 .../action_delete_old_versions.py | 0 .../ftrack/{actions => event_handlers_user}/action_delivery.py | 0 .../ftrack/{actions => event_handlers_user}/action_djvview.py | 0 .../ftrack/{actions => event_handlers_user}/action_job_killer.py | 0 .../{actions => event_handlers_user}/action_multiple_notes.py | 0 .../{actions => event_handlers_user}/action_prepare_project.py | 0 pype/modules/ftrack/{actions => event_handlers_user}/action_rv.py | 0 .../ftrack/{actions => event_handlers_user}/action_seed.py | 0 .../action_store_thumbnails_to_avalon.py | 0 .../{actions => event_handlers_user}/action_sync_to_avalon.py | 0 .../ftrack/{actions => event_handlers_user}/action_test.py | 0 .../action_thumbnail_to_childern.py | 0 .../action_thumbnail_to_parent.py | 0 .../{actions => event_handlers_user}/action_where_run_ask.py | 0 .../{actions => event_handlers_user}/action_where_run_show.py | 0 24 files changed, 0 insertions(+), 0 deletions(-) rename pype/modules/ftrack/{actions => event_handlers_user}/action_applications.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_batch_task_creation.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_clean_hierarchical_attributes.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_client_review_sort.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_component_open.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_create_cust_attrs.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_create_folders.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_create_project_structure.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_delete_asset.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_delete_old_versions.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_delivery.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_djvview.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_job_killer.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_multiple_notes.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_prepare_project.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_rv.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_seed.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_store_thumbnails_to_avalon.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_sync_to_avalon.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_test.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_thumbnail_to_childern.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_thumbnail_to_parent.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_where_run_ask.py (100%) rename pype/modules/ftrack/{actions => event_handlers_user}/action_where_run_show.py (100%) diff --git a/pype/modules/ftrack/actions/action_applications.py b/pype/modules/ftrack/event_handlers_user/action_applications.py similarity index 100% rename from pype/modules/ftrack/actions/action_applications.py rename to pype/modules/ftrack/event_handlers_user/action_applications.py diff --git a/pype/modules/ftrack/actions/action_batch_task_creation.py b/pype/modules/ftrack/event_handlers_user/action_batch_task_creation.py similarity index 100% rename from pype/modules/ftrack/actions/action_batch_task_creation.py rename to pype/modules/ftrack/event_handlers_user/action_batch_task_creation.py diff --git a/pype/modules/ftrack/actions/action_clean_hierarchical_attributes.py b/pype/modules/ftrack/event_handlers_user/action_clean_hierarchical_attributes.py similarity index 100% rename from pype/modules/ftrack/actions/action_clean_hierarchical_attributes.py rename to pype/modules/ftrack/event_handlers_user/action_clean_hierarchical_attributes.py diff --git a/pype/modules/ftrack/actions/action_client_review_sort.py b/pype/modules/ftrack/event_handlers_user/action_client_review_sort.py similarity index 100% rename from pype/modules/ftrack/actions/action_client_review_sort.py rename to pype/modules/ftrack/event_handlers_user/action_client_review_sort.py diff --git a/pype/modules/ftrack/actions/action_component_open.py b/pype/modules/ftrack/event_handlers_user/action_component_open.py similarity index 100% rename from pype/modules/ftrack/actions/action_component_open.py rename to pype/modules/ftrack/event_handlers_user/action_component_open.py diff --git a/pype/modules/ftrack/actions/action_create_cust_attrs.py b/pype/modules/ftrack/event_handlers_user/action_create_cust_attrs.py similarity index 100% rename from pype/modules/ftrack/actions/action_create_cust_attrs.py rename to pype/modules/ftrack/event_handlers_user/action_create_cust_attrs.py diff --git a/pype/modules/ftrack/actions/action_create_folders.py b/pype/modules/ftrack/event_handlers_user/action_create_folders.py similarity index 100% rename from pype/modules/ftrack/actions/action_create_folders.py rename to pype/modules/ftrack/event_handlers_user/action_create_folders.py diff --git a/pype/modules/ftrack/actions/action_create_project_structure.py b/pype/modules/ftrack/event_handlers_user/action_create_project_structure.py similarity index 100% rename from pype/modules/ftrack/actions/action_create_project_structure.py rename to pype/modules/ftrack/event_handlers_user/action_create_project_structure.py diff --git a/pype/modules/ftrack/actions/action_delete_asset.py b/pype/modules/ftrack/event_handlers_user/action_delete_asset.py similarity index 100% rename from pype/modules/ftrack/actions/action_delete_asset.py rename to pype/modules/ftrack/event_handlers_user/action_delete_asset.py diff --git a/pype/modules/ftrack/actions/action_delete_old_versions.py b/pype/modules/ftrack/event_handlers_user/action_delete_old_versions.py similarity index 100% rename from pype/modules/ftrack/actions/action_delete_old_versions.py rename to pype/modules/ftrack/event_handlers_user/action_delete_old_versions.py diff --git a/pype/modules/ftrack/actions/action_delivery.py b/pype/modules/ftrack/event_handlers_user/action_delivery.py similarity index 100% rename from pype/modules/ftrack/actions/action_delivery.py rename to pype/modules/ftrack/event_handlers_user/action_delivery.py diff --git a/pype/modules/ftrack/actions/action_djvview.py b/pype/modules/ftrack/event_handlers_user/action_djvview.py similarity index 100% rename from pype/modules/ftrack/actions/action_djvview.py rename to pype/modules/ftrack/event_handlers_user/action_djvview.py diff --git a/pype/modules/ftrack/actions/action_job_killer.py b/pype/modules/ftrack/event_handlers_user/action_job_killer.py similarity index 100% rename from pype/modules/ftrack/actions/action_job_killer.py rename to pype/modules/ftrack/event_handlers_user/action_job_killer.py diff --git a/pype/modules/ftrack/actions/action_multiple_notes.py b/pype/modules/ftrack/event_handlers_user/action_multiple_notes.py similarity index 100% rename from pype/modules/ftrack/actions/action_multiple_notes.py rename to pype/modules/ftrack/event_handlers_user/action_multiple_notes.py diff --git a/pype/modules/ftrack/actions/action_prepare_project.py b/pype/modules/ftrack/event_handlers_user/action_prepare_project.py similarity index 100% rename from pype/modules/ftrack/actions/action_prepare_project.py rename to pype/modules/ftrack/event_handlers_user/action_prepare_project.py diff --git a/pype/modules/ftrack/actions/action_rv.py b/pype/modules/ftrack/event_handlers_user/action_rv.py similarity index 100% rename from pype/modules/ftrack/actions/action_rv.py rename to pype/modules/ftrack/event_handlers_user/action_rv.py diff --git a/pype/modules/ftrack/actions/action_seed.py b/pype/modules/ftrack/event_handlers_user/action_seed.py similarity index 100% rename from pype/modules/ftrack/actions/action_seed.py rename to pype/modules/ftrack/event_handlers_user/action_seed.py diff --git a/pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py b/pype/modules/ftrack/event_handlers_user/action_store_thumbnails_to_avalon.py similarity index 100% rename from pype/modules/ftrack/actions/action_store_thumbnails_to_avalon.py rename to pype/modules/ftrack/event_handlers_user/action_store_thumbnails_to_avalon.py diff --git a/pype/modules/ftrack/actions/action_sync_to_avalon.py b/pype/modules/ftrack/event_handlers_user/action_sync_to_avalon.py similarity index 100% rename from pype/modules/ftrack/actions/action_sync_to_avalon.py rename to pype/modules/ftrack/event_handlers_user/action_sync_to_avalon.py diff --git a/pype/modules/ftrack/actions/action_test.py b/pype/modules/ftrack/event_handlers_user/action_test.py similarity index 100% rename from pype/modules/ftrack/actions/action_test.py rename to pype/modules/ftrack/event_handlers_user/action_test.py diff --git a/pype/modules/ftrack/actions/action_thumbnail_to_childern.py b/pype/modules/ftrack/event_handlers_user/action_thumbnail_to_childern.py similarity index 100% rename from pype/modules/ftrack/actions/action_thumbnail_to_childern.py rename to pype/modules/ftrack/event_handlers_user/action_thumbnail_to_childern.py diff --git a/pype/modules/ftrack/actions/action_thumbnail_to_parent.py b/pype/modules/ftrack/event_handlers_user/action_thumbnail_to_parent.py similarity index 100% rename from pype/modules/ftrack/actions/action_thumbnail_to_parent.py rename to pype/modules/ftrack/event_handlers_user/action_thumbnail_to_parent.py diff --git a/pype/modules/ftrack/actions/action_where_run_ask.py b/pype/modules/ftrack/event_handlers_user/action_where_run_ask.py similarity index 100% rename from pype/modules/ftrack/actions/action_where_run_ask.py rename to pype/modules/ftrack/event_handlers_user/action_where_run_ask.py diff --git a/pype/modules/ftrack/actions/action_where_run_show.py b/pype/modules/ftrack/event_handlers_user/action_where_run_show.py similarity index 100% rename from pype/modules/ftrack/actions/action_where_run_show.py rename to pype/modules/ftrack/event_handlers_user/action_where_run_show.py From ba692441804e6ec77c87f2ff43943ff82b050c7e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:50:01 +0100 Subject: [PATCH 11/18] renamed folder `events` to `event_handlers_server` --- .../action_clone_review_session.py | 0 .../action_push_frame_values_to_task.py | 0 .../{events => event_handlers_server}/action_sync_to_avalon.py | 0 .../event_del_avalon_id_from_new.py | 0 .../event_first_version_status.py | 0 .../{events => event_handlers_server}/event_next_task_update.py | 0 .../event_push_frame_values_to_task.py | 0 .../{events => event_handlers_server}/event_radio_buttons.py | 0 .../{events => event_handlers_server}/event_sync_to_avalon.py | 0 .../event_task_to_parent_status.py | 0 .../event_task_to_version_status.py | 0 .../{events => event_handlers_server}/event_thumbnail_updates.py | 0 .../{events => event_handlers_server}/event_user_assigment.py | 0 .../event_version_to_task_statuses.py | 0 14 files changed, 0 insertions(+), 0 deletions(-) rename pype/modules/ftrack/{events => event_handlers_server}/action_clone_review_session.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/action_push_frame_values_to_task.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/action_sync_to_avalon.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_del_avalon_id_from_new.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_first_version_status.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_next_task_update.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_push_frame_values_to_task.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_radio_buttons.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_sync_to_avalon.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_task_to_parent_status.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_task_to_version_status.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_thumbnail_updates.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_user_assigment.py (100%) rename pype/modules/ftrack/{events => event_handlers_server}/event_version_to_task_statuses.py (100%) diff --git a/pype/modules/ftrack/events/action_clone_review_session.py b/pype/modules/ftrack/event_handlers_server/action_clone_review_session.py similarity index 100% rename from pype/modules/ftrack/events/action_clone_review_session.py rename to pype/modules/ftrack/event_handlers_server/action_clone_review_session.py diff --git a/pype/modules/ftrack/events/action_push_frame_values_to_task.py b/pype/modules/ftrack/event_handlers_server/action_push_frame_values_to_task.py similarity index 100% rename from pype/modules/ftrack/events/action_push_frame_values_to_task.py rename to pype/modules/ftrack/event_handlers_server/action_push_frame_values_to_task.py diff --git a/pype/modules/ftrack/events/action_sync_to_avalon.py b/pype/modules/ftrack/event_handlers_server/action_sync_to_avalon.py similarity index 100% rename from pype/modules/ftrack/events/action_sync_to_avalon.py rename to pype/modules/ftrack/event_handlers_server/action_sync_to_avalon.py diff --git a/pype/modules/ftrack/events/event_del_avalon_id_from_new.py b/pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py similarity index 100% rename from pype/modules/ftrack/events/event_del_avalon_id_from_new.py rename to pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py diff --git a/pype/modules/ftrack/events/event_first_version_status.py b/pype/modules/ftrack/event_handlers_server/event_first_version_status.py similarity index 100% rename from pype/modules/ftrack/events/event_first_version_status.py rename to pype/modules/ftrack/event_handlers_server/event_first_version_status.py diff --git a/pype/modules/ftrack/events/event_next_task_update.py b/pype/modules/ftrack/event_handlers_server/event_next_task_update.py similarity index 100% rename from pype/modules/ftrack/events/event_next_task_update.py rename to pype/modules/ftrack/event_handlers_server/event_next_task_update.py diff --git a/pype/modules/ftrack/events/event_push_frame_values_to_task.py b/pype/modules/ftrack/event_handlers_server/event_push_frame_values_to_task.py similarity index 100% rename from pype/modules/ftrack/events/event_push_frame_values_to_task.py rename to pype/modules/ftrack/event_handlers_server/event_push_frame_values_to_task.py diff --git a/pype/modules/ftrack/events/event_radio_buttons.py b/pype/modules/ftrack/event_handlers_server/event_radio_buttons.py similarity index 100% rename from pype/modules/ftrack/events/event_radio_buttons.py rename to pype/modules/ftrack/event_handlers_server/event_radio_buttons.py diff --git a/pype/modules/ftrack/events/event_sync_to_avalon.py b/pype/modules/ftrack/event_handlers_server/event_sync_to_avalon.py similarity index 100% rename from pype/modules/ftrack/events/event_sync_to_avalon.py rename to pype/modules/ftrack/event_handlers_server/event_sync_to_avalon.py diff --git a/pype/modules/ftrack/events/event_task_to_parent_status.py b/pype/modules/ftrack/event_handlers_server/event_task_to_parent_status.py similarity index 100% rename from pype/modules/ftrack/events/event_task_to_parent_status.py rename to pype/modules/ftrack/event_handlers_server/event_task_to_parent_status.py diff --git a/pype/modules/ftrack/events/event_task_to_version_status.py b/pype/modules/ftrack/event_handlers_server/event_task_to_version_status.py similarity index 100% rename from pype/modules/ftrack/events/event_task_to_version_status.py rename to pype/modules/ftrack/event_handlers_server/event_task_to_version_status.py diff --git a/pype/modules/ftrack/events/event_thumbnail_updates.py b/pype/modules/ftrack/event_handlers_server/event_thumbnail_updates.py similarity index 100% rename from pype/modules/ftrack/events/event_thumbnail_updates.py rename to pype/modules/ftrack/event_handlers_server/event_thumbnail_updates.py diff --git a/pype/modules/ftrack/events/event_user_assigment.py b/pype/modules/ftrack/event_handlers_server/event_user_assigment.py similarity index 100% rename from pype/modules/ftrack/events/event_user_assigment.py rename to pype/modules/ftrack/event_handlers_server/event_user_assigment.py diff --git a/pype/modules/ftrack/events/event_version_to_task_statuses.py b/pype/modules/ftrack/event_handlers_server/event_version_to_task_statuses.py similarity index 100% rename from pype/modules/ftrack/events/event_version_to_task_statuses.py rename to pype/modules/ftrack/event_handlers_server/event_version_to_task_statuses.py From 0b5acc75e9a74bed4aa477c22bbca5e193f4aef6 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 09:50:17 +0100 Subject: [PATCH 12/18] changed paths of default event handlers in module --- pype/modules/ftrack/ftrack_module.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/modules/ftrack/ftrack_module.py b/pype/modules/ftrack/ftrack_module.py index fd6d1efb7cb..a257ede8454 100644 --- a/pype/modules/ftrack/ftrack_module.py +++ b/pype/modules/ftrack/ftrack_module.py @@ -43,13 +43,13 @@ def initialize(self, settings): current_dir = os.path.dirname(os.path.abspath(__file__)) server_event_handlers_paths = [ - os.path.join(current_dir, "events") + os.path.join(current_dir, "event_handlers_server") ] server_event_handlers_paths.extend( ftrack_settings["ftrack_events_path"] ) user_event_handlers_paths = [ - os.path.join(current_dir, "actions") + os.path.join(current_dir, "event_handlers_user") ] user_event_handlers_paths.extend( ftrack_settings["ftrack_actions_path"] From f2ecff26888ce0906f3a3224a1b4db6e05cd36be Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 10:16:50 +0100 Subject: [PATCH 13/18] modules_from_path always return all information with filepaths --- pype/lib/applications.py | 8 ++++---- pype/lib/python_module_tools.py | 8 +++----- pype/modules/ftrack/ftrack_server/ftrack_server.py | 5 ++--- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/pype/lib/applications.py b/pype/lib/applications.py index d20b01c3d20..f7d029e2ea4 100644 --- a/pype/lib/applications.py +++ b/pype/lib/applications.py @@ -618,13 +618,13 @@ def discover_launch_hooks(self, force=False): ) continue - modules = modules_from_path(path) - for _module in modules: + modules, _crashed = modules_from_path(path) + for _filepath, module in modules: all_classes["pre"].extend( - classes_from_module(PreLaunchHook, _module) + classes_from_module(PreLaunchHook, module) ) all_classes["post"].extend( - classes_from_module(PostLaunchHook, _module) + classes_from_module(PostLaunchHook, module) ) for launch_type, classes in all_classes.items(): diff --git a/pype/lib/python_module_tools.py b/pype/lib/python_module_tools.py index 559dd04bab5..44a10078891 100644 --- a/pype/lib/python_module_tools.py +++ b/pype/lib/python_module_tools.py @@ -9,7 +9,7 @@ PY3 = sys.version_info[0] == 3 -def modules_from_path(folder_path, return_crashed=False): +def modules_from_path(folder_path): """Get python scripts as modules from a path. Arguments: @@ -72,7 +72,7 @@ def modules_from_path(folder_path, return_crashed=False): module.__file__ = full_path - modules.append(module) + modules.append((full_path, module)) except Exception: crashed.append((full_path, sys.exc_info())) @@ -82,9 +82,7 @@ def modules_from_path(folder_path, return_crashed=False): ) continue - if return_crashed: - return modules, crashed - return modules + return modules, crashed def recursive_bases_from_class(klass): diff --git a/pype/modules/ftrack/ftrack_server/ftrack_server.py b/pype/modules/ftrack/ftrack_server/ftrack_server.py index 9d9d8c4630b..1612a2f4742 100644 --- a/pype/modules/ftrack/ftrack_server/ftrack_server.py +++ b/pype/modules/ftrack/ftrack_server/ftrack_server.py @@ -64,13 +64,13 @@ def set_files(self, paths): register_functions = [] for path in paths: # Get all modules with functions - modules, crashed = modules_from_path(path, return_crashed=True) + modules, crashed = modules_from_path(path) for filepath, exc_info in crashed: log.warning("Filepath load crashed {}.\n{}".format( filepath, traceback.format_exception(*exc_info) )) - for module in modules: + for filepath, module in modules: register_function = None for name, attr in module.__dict__.items(): if ( @@ -80,7 +80,6 @@ def set_files(self, paths): register_function = attr break - filepath = os.path.abspath(module.__file__) if not register_function: log.warning( "\"{}\" - Missing register method".format(filepath) From 355872938b693f328ccb41f51676aa312a416b4f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 10:18:16 +0100 Subject: [PATCH 14/18] default mongo url is accessible with method --- pype/lib/mongo.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pype/lib/mongo.py b/pype/lib/mongo.py index 04798d88ff7..3ee43bb9347 100644 --- a/pype/lib/mongo.py +++ b/pype/lib/mongo.py @@ -137,10 +137,14 @@ class PypeMongoConnection: mongo_clients = {} log = logging.getLogger("PypeMongoConnection") + @staticmethod + def get_default_mongo_url(): + return os.environ["PYPE_MONGO"] + @classmethod def get_mongo_client(cls, mongo_url=None): if mongo_url is None: - mongo_url = os.environ["PYPE_MONGO"] + mongo_url = cls.get_default_mongo_url() connection = cls.mongo_clients.get(mongo_url) if connection: From 017a2df3959ee2bed2ef57c40f656e7429168836 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 10:35:49 +0100 Subject: [PATCH 15/18] modified mongo validation in ftrack --- .../ftrack/ftrack_server/event_server_cli.py | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pype/modules/ftrack/ftrack_server/event_server_cli.py b/pype/modules/ftrack/ftrack_server/event_server_cli.py index 27b25bd8cfe..5e885e47f3a 100644 --- a/pype/modules/ftrack/ftrack_server/event_server_cli.py +++ b/pype/modules/ftrack/ftrack_server/event_server_cli.py @@ -14,7 +14,10 @@ import ftrack_api import pymongo -from pype.lib import get_pype_execute_args +from pype.lib import ( + get_pype_execute_args, + PypeMongoConnection +) from pype.modules.ftrack.lib import ( credentials, get_ftrack_url_from_settings @@ -35,17 +38,18 @@ def __init__(self, message=None): super().__init__(message) -def check_mongo_url(host, port, log_error=False): +def check_mongo_url(mongo_uri, log_error=False): """Checks if mongo server is responding""" try: - client = pymongo.MongoClient(host=host, port=port) + client = pymongo.MongoClient(mongo_uri) # Force connection on a request as the connect=True parameter of # MongoClient seems to be useless here client.server_info() + client.close() except pymongo.errors.ServerSelectionTimeoutError as err: if log_error: - print("Can't connect to MongoDB at {}:{} because: {}".format( - host, port, err + print("Can't connect to MongoDB at {} because: {}".format( + mongo_uri, err )) return False @@ -175,11 +179,8 @@ def main_loop(ftrack_url): """ os.environ["FTRACK_EVENT_SUB_ID"] = str(uuid.uuid1()) - # Get mongo hostname and port for testing mongo connection - mongo_uri, mongo_port, database_name, collection_name = ( - get_ftrack_event_mongo_info() - ) + mongo_uri = PypeMongoConnection.get_default_mongo_url() # Current file file_path = os.path.dirname(os.path.realpath(__file__)) @@ -257,7 +258,7 @@ def on_exit(processor_thread, storer_thread, statuser_thread): ftrack_accessible = check_ftrack_url(ftrack_url) if not mongo_accessible: - mongo_accessible = check_mongo_url(mongo_uri, mongo_port) + mongo_accessible = check_mongo_url(mongo_uri) # Run threads only if Ftrack is accessible if not ftrack_accessible or not mongo_accessible: From 0f5d7df35dc527abb41e067d3d5ec47a13086a21 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 10:37:13 +0100 Subject: [PATCH 16/18] replaced CustomDbConnector with PypeMongoConnection --- .../event_del_avalon_id_from_new.py | 4 +- .../ftrack_server/custom_db_connector.py | 253 ------------------ pype/modules/ftrack/ftrack_server/lib.py | 29 +- .../ftrack/ftrack_server/sub_event_storer.py | 19 +- pype/modules/ftrack/lib/settings.py | 23 +- 5 files changed, 26 insertions(+), 302 deletions(-) delete mode 100644 pype/modules/ftrack/ftrack_server/custom_db_connector.py diff --git a/pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py b/pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py index 21e581e76a0..b30d21e05a9 100644 --- a/pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py +++ b/pype/modules/ftrack/event_handlers_server/event_del_avalon_id_from_new.py @@ -1,6 +1,8 @@ from pype.modules.ftrack.lib import BaseEvent from pype.modules.ftrack.lib.avalon_sync import CUST_ATTR_ID_KEY -from pype.modules.ftrack.events.event_sync_to_avalon import SyncToAvalonEvent +from pype.modules.ftrack.event_handlers_server.event_sync_to_avalon import ( + SyncToAvalonEvent +) class DelAvalonIdFromNew(BaseEvent): diff --git a/pype/modules/ftrack/ftrack_server/custom_db_connector.py b/pype/modules/ftrack/ftrack_server/custom_db_connector.py deleted file mode 100644 index f435086e8a7..00000000000 --- a/pype/modules/ftrack/ftrack_server/custom_db_connector.py +++ /dev/null @@ -1,253 +0,0 @@ -""" -Wrapper around interactions with the database - -Copy of io module in avalon-core. - - In this case not working as singleton with api.Session! -""" - -import time -import logging -import functools -import atexit -import os - -# Third-party dependencies -import pymongo -from pype.api import decompose_url - - -class NotActiveCollection(Exception): - def __init__(self, *args, **kwargs): - msg = "Active collection is not set. (This is bug)" - if not (args or kwargs): - args = [msg] - super().__init__(*args, **kwargs) - - -def auto_reconnect(func): - """Handling auto reconnect in 3 retry times""" - @functools.wraps(func) - def decorated(*args, **kwargs): - object = args[0] - for retry in range(3): - try: - return func(*args, **kwargs) - except pymongo.errors.AutoReconnect: - object.log.error("Reconnecting..") - time.sleep(0.1) - else: - raise - return decorated - - -def check_active_collection(func): - """Check if CustomDbConnector has active collection.""" - @functools.wraps(func) - def decorated(obj, *args, **kwargs): - if not obj.active_collection: - raise NotActiveCollection() - return func(obj, *args, **kwargs) - return decorated - - -class CustomDbConnector: - log = logging.getLogger(__name__) - - def __init__( - self, uri, database_name, port=None, collection_name=None - ): - self.timeout = int(os.environ["AVALON_TIMEOUT"]) - self._mongo_client = None - self._sentry_client = None - self._sentry_logging_handler = None - self._database = None - self._is_installed = False - - self._uri = uri - components = decompose_url(uri) - if port is None: - port = components.get("port") - - if database_name is None: - raise ValueError( - "Database is not defined for connection. {}".format(uri) - ) - - self._port = port - self._database_name = database_name - - self.active_collection = collection_name - - def __getitem__(self, key): - # gives direct access to collection withou setting `active_collection` - return self._database[key] - - def __getattribute__(self, attr): - # not all methods of PyMongo database are implemented with this it is - # possible to use them too - try: - return super(CustomDbConnector, self).__getattribute__(attr) - except AttributeError: - 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""" - if self._is_installed: - return - atexit.register(self.uninstall) - logging.basicConfig() - - kwargs = { - "host": self._uri, - "serverSelectionTimeoutMS": self.timeout - } - if self._port is not None: - kwargs["port"] = self._port - - self._mongo_client = pymongo.MongoClient(**kwargs) - if self._port is None: - self._port = self._mongo_client.PORT - - for retry in range(3): - try: - t1 = time.time() - self._mongo_client.server_info() - except Exception: - self.log.error("Retrying..") - time.sleep(1) - else: - break - - else: - raise IOError( - "ERROR: Couldn't connect to %s in " - "less than %.3f ms" % (self._uri, self.timeout) - ) - - self.log.info("Connected to %s, delay %.3f s" % ( - self._uri, time.time() - t1 - )) - - self._database = self._mongo_client[self._database_name] - self._is_installed = True - - def uninstall(self): - """Close any connection to the database""" - - try: - self._mongo_client.close() - except AttributeError: - pass - - self._mongo_client = None - self._database = None - self._is_installed = False - atexit.unregister(self.uninstall) - - 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) - - @auto_reconnect - def collections(self): - for col_name in self._database.collection_names(): - if col_name not in ("system.indexes",): - yield col_name - - @check_active_collection - @auto_reconnect - def insert_one(self, item, **options): - assert isinstance(item, dict), "item must be of type " - return self._database[self.active_collection].insert_one( - item, **options - ) - - @check_active_collection - @auto_reconnect - def insert_many(self, items, ordered=True, **options): - # check if all items are valid - assert isinstance(items, list), "`items` must be of type " - for item in items: - assert isinstance(item, dict), "`item` must be of type " - - options["ordered"] = ordered - return self._database[self.active_collection].insert_many( - items, **options - ) - - @check_active_collection - @auto_reconnect - def find(self, filter, projection=None, sort=None, **options): - options["sort"] = sort - return self._database[self.active_collection].find( - filter, projection, **options - ) - - @check_active_collection - @auto_reconnect - def find_one(self, filter, projection=None, sort=None, **options): - assert isinstance(filter, dict), "filter must be " - options["sort"] = sort - return self._database[self.active_collection].find_one( - filter, - projection, - **options - ) - - @check_active_collection - @auto_reconnect - def replace_one(self, filter, replacement, **options): - return self._database[self.active_collection].replace_one( - filter, replacement, **options - ) - - @check_active_collection - @auto_reconnect - def update_one(self, filter, update, **options): - return self._database[self.active_collection].update_one( - filter, update, **options - ) - - @check_active_collection - @auto_reconnect - def update_many(self, filter, update, **options): - return self._database[self.active_collection].update_many( - filter, update, **options - ) - - @check_active_collection - @auto_reconnect - def distinct(self, **options): - return self._database[self.active_collection].distinct(**options) - - @check_active_collection - @auto_reconnect - def drop_collection(self, name_or_collection, **options): - return self._database[self.active_collection].drop( - name_or_collection, **options - ) - - @check_active_collection - @auto_reconnect - def delete_one(self, filter, collation=None, **options): - options["collation"] = collation - return self._database[self.active_collection].delete_one( - filter, **options - ) - - @check_active_collection - @auto_reconnect - def delete_many(self, filter, collation=None, **options): - options["collation"] = collation - return self._database[self.active_collection].delete_many( - filter, **options - ) diff --git a/pype/modules/ftrack/ftrack_server/lib.py b/pype/modules/ftrack/ftrack_server/lib.py index 08c77d89a28..3b016d38fd3 100644 --- a/pype/modules/ftrack/ftrack_server/lib.py +++ b/pype/modules/ftrack/ftrack_server/lib.py @@ -21,7 +21,7 @@ from pype.modules.ftrack.lib import get_ftrack_event_mongo_info -from .custom_db_connector import CustomDbConnector +from pype.lib import PypeMongoConnection from pype.api import Logger TOPIC_STATUS_SERVER = "pype.event.server.status" @@ -133,27 +133,22 @@ class ProcessEventHub(SocketBaseEventHub): pypelog = Logger().get_logger("Session Processor") def __init__(self, *args, **kwargs): - self.uri, self.port, self.database, self.collection_name = ( - get_ftrack_event_mongo_info() - ) - self.dbcon = CustomDbConnector( - self.uri, - self.database, - self.port, - self.collection_name - ) + self.mongo_url = None + self.dbcon = None + super(ProcessEventHub, self).__init__(*args, **kwargs) def prepare_dbcon(self): try: - self.dbcon.install() - self.dbcon._database.list_collection_names() + database_name, collection_name = get_ftrack_event_mongo_info() + mongo_client = PypeMongoConnection.get_mongo_client() + self.dbcon = mongo_client[database_name][collection_name] + self.mongo_client = mongo_client + except pymongo.errors.AutoReconnect: - self.pypelog.error( - "Mongo server \"{}\" is not responding, exiting.".format( - os.environ["AVALON_MONGO"] - ) - ) + self.pypelog.error(( + "Mongo server \"{}\" is not responding, exiting." + ).format(PypeMongoConnection.get_default_mongo_url())) sys.exit(0) except pymongo.errors.OperationFailure: diff --git a/pype/modules/ftrack/ftrack_server/sub_event_storer.py b/pype/modules/ftrack/ftrack_server/sub_event_storer.py index 2032c122ccb..d70ef8bd426 100644 --- a/pype/modules/ftrack/ftrack_server/sub_event_storer.py +++ b/pype/modules/ftrack/ftrack_server/sub_event_storer.py @@ -14,12 +14,10 @@ TOPIC_STATUS_SERVER_RESULT ) from pype.modules.ftrack.lib import get_ftrack_event_mongo_info -from pype.modules.ftrack.ftrack_server.custom_db_connector import ( - CustomDbConnector -) +from pype.lib import PypeMongoConnection from pype.api import Logger -log = Logger().get_logger("Event storer") +log = Logger.get_logger("Event storer") subprocess_started = datetime.datetime.now() @@ -27,20 +25,21 @@ class SessionFactory: session = None -uri, port, database, collection_name = get_ftrack_event_mongo_info() -dbcon = CustomDbConnector(uri, database, port, collection_name) +database_name, collection_name = get_ftrack_event_mongo_info() +dbcon = None # ignore_topics = ["ftrack.meta.connected"] ignore_topics = [] def install_db(): + global dbcon try: - dbcon.install() - dbcon._database.list_collection_names() + mongo_client = PypeMongoConnection.get_mongo_client() + dbcon = mongo_client[database_name][collection_name] except pymongo.errors.AutoReconnect: log.error("Mongo server \"{}\" is not responding, exiting.".format( - os.environ["AVALON_MONGO"] + PypeMongoConnection.get_default_mongo_url() )) sys.exit(0) @@ -204,7 +203,7 @@ def main(args): "Error with Mongo access, probably permissions." "Check if exist database with name \"{}\"" " and collection \"{}\" inside." - ).format(database, collection_name)) + ).format(database_name, collection_name)) sock.sendall(b"MongoError") finally: diff --git a/pype/modules/ftrack/lib/settings.py b/pype/modules/ftrack/lib/settings.py index 1167d5443ef..4afac9c29fb 100644 --- a/pype/modules/ftrack/lib/settings.py +++ b/pype/modules/ftrack/lib/settings.py @@ -1,13 +1,4 @@ -import os -from pype.api import ( - Logger, - get_system_settings, - get_default_components, - decompose_url, - compose_url -) - -log = Logger().get_logger(__name__) +from pype.api import get_system_settings def get_ftrack_settings(): @@ -22,14 +13,4 @@ def get_ftrack_event_mongo_info(): ftrack_settings = get_ftrack_settings() database_name = ftrack_settings["mongo_database_name"] collection_name = ftrack_settings["mongo_collection_name"] - - # TODO add possibility to set in settings and use PYPE_MONGO_URL if not set - mongo_url = os.environ.get("FTRACK_EVENTS_MONGO_URL") - if mongo_url is not None: - components = decompose_url(mongo_url) - else: - components = get_default_components() - - uri = compose_url(**components) - - return uri, components["port"], database_name, collection_name + return database_name, collection_name From a8ab4d288b1b153c5cc7201d33a7686370ba161d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 14:25:48 +0100 Subject: [PATCH 17/18] moved scripts to scripts folder --- .../ftrack/ftrack_server/event_server_cli.py | 13 +++++++------ .../sub_event_processor.py | 0 .../{ftrack_server => scripts}/sub_event_status.py | 0 .../{ftrack_server => scripts}/sub_event_storer.py | 0 .../{ftrack_server => scripts}/sub_legacy_server.py | 0 .../{ftrack_server => scripts}/sub_user_server.py | 0 pype/modules/ftrack/tray/ftrack_tray.py | 3 ++- 7 files changed, 9 insertions(+), 7 deletions(-) rename pype/modules/ftrack/{ftrack_server => scripts}/sub_event_processor.py (100%) rename pype/modules/ftrack/{ftrack_server => scripts}/sub_event_status.py (100%) rename pype/modules/ftrack/{ftrack_server => scripts}/sub_event_storer.py (100%) rename pype/modules/ftrack/{ftrack_server => scripts}/sub_legacy_server.py (100%) rename pype/modules/ftrack/{ftrack_server => scripts}/sub_user_server.py (100%) diff --git a/pype/modules/ftrack/ftrack_server/event_server_cli.py b/pype/modules/ftrack/ftrack_server/event_server_cli.py index 5e885e47f3a..c70a12aefbe 100644 --- a/pype/modules/ftrack/ftrack_server/event_server_cli.py +++ b/pype/modules/ftrack/ftrack_server/event_server_cli.py @@ -18,6 +18,7 @@ get_pype_execute_args, PypeMongoConnection ) +from pype.modules.ftrack import FTRACK_MODULE_DIR from pype.modules.ftrack.lib import ( credentials, get_ftrack_url_from_settings @@ -98,14 +99,14 @@ def validate_credentials(url, user, api): def legacy_server(ftrack_url): # Current file - file_path = os.path.dirname(os.path.realpath(__file__)) + scripts_dir = os.path.join(FTRACK_MODULE_DIR, "scripts") min_fail_seconds = 5 max_fail_count = 3 wait_time_after_max_fail = 10 subproc = None - subproc_path = "{}/sub_legacy_server.py".format(file_path) + subproc_path = "{}/sub_legacy_server.py".format(scripts_dir) subproc_last_failed = datetime.datetime.now() subproc_failed_count = 0 @@ -183,7 +184,7 @@ def main_loop(ftrack_url): mongo_uri = PypeMongoConnection.get_default_mongo_url() # Current file - file_path = os.path.dirname(os.path.realpath(__file__)) + scripts_dir = os.path.join(FTRACK_MODULE_DIR, "scripts") min_fail_seconds = 5 max_fail_count = 3 @@ -192,21 +193,21 @@ def main_loop(ftrack_url): # Threads data storer_name = "StorerThread" storer_port = 10001 - storer_path = "{}/sub_event_storer.py".format(file_path) + storer_path = "{}/sub_event_storer.py".format(scripts_dir) storer_thread = None storer_last_failed = datetime.datetime.now() storer_failed_count = 0 processor_name = "ProcessorThread" processor_port = 10011 - processor_path = "{}/sub_event_processor.py".format(file_path) + processor_path = "{}/sub_event_processor.py".format(scripts_dir) processor_thread = None processor_last_failed = datetime.datetime.now() processor_failed_count = 0 statuser_name = "StorerThread" statuser_port = 10021 - statuser_path = "{}/sub_event_status.py".format(file_path) + statuser_path = "{}/sub_event_status.py".format(scripts_dir) statuser_thread = None statuser_last_failed = datetime.datetime.now() statuser_failed_count = 0 diff --git a/pype/modules/ftrack/ftrack_server/sub_event_processor.py b/pype/modules/ftrack/scripts/sub_event_processor.py similarity index 100% rename from pype/modules/ftrack/ftrack_server/sub_event_processor.py rename to pype/modules/ftrack/scripts/sub_event_processor.py diff --git a/pype/modules/ftrack/ftrack_server/sub_event_status.py b/pype/modules/ftrack/scripts/sub_event_status.py similarity index 100% rename from pype/modules/ftrack/ftrack_server/sub_event_status.py rename to pype/modules/ftrack/scripts/sub_event_status.py diff --git a/pype/modules/ftrack/ftrack_server/sub_event_storer.py b/pype/modules/ftrack/scripts/sub_event_storer.py similarity index 100% rename from pype/modules/ftrack/ftrack_server/sub_event_storer.py rename to pype/modules/ftrack/scripts/sub_event_storer.py diff --git a/pype/modules/ftrack/ftrack_server/sub_legacy_server.py b/pype/modules/ftrack/scripts/sub_legacy_server.py similarity index 100% rename from pype/modules/ftrack/ftrack_server/sub_legacy_server.py rename to pype/modules/ftrack/scripts/sub_legacy_server.py diff --git a/pype/modules/ftrack/ftrack_server/sub_user_server.py b/pype/modules/ftrack/scripts/sub_user_server.py similarity index 100% rename from pype/modules/ftrack/ftrack_server/sub_user_server.py rename to pype/modules/ftrack/scripts/sub_user_server.py diff --git a/pype/modules/ftrack/tray/ftrack_tray.py b/pype/modules/ftrack/tray/ftrack_tray.py index 3f6432e5410..1009d93afe6 100644 --- a/pype/modules/ftrack/tray/ftrack_tray.py +++ b/pype/modules/ftrack/tray/ftrack_tray.py @@ -8,6 +8,7 @@ from ..ftrack_server.lib import check_ftrack_url from ..ftrack_server import socket_thread from ..lib import credentials +from ..ftrack_module import FTRACK_MODULE_DIR from . import login_dialog from pype.api import Logger, resources @@ -132,7 +133,7 @@ def set_action_server(self): thread_name = "ActionServerThread" thread_port = 10021 subprocess_path = ( - "{}/ftrack_server/sub_user_server.py".format(parent_file_path) + "{}/scripts/sub_user_server.py".format(FTRACK_MODULE_DIR) ) if self.thread_socket_server is not None: self.thread_socket_server.stop() From a48fa5f9cf905dd8363b4db5f6f66e3728702027 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 18 Mar 2021 14:37:31 +0100 Subject: [PATCH 18/18] dynamic CustomSession --- pype/modules/ftrack/ftrack_server/lib.py | 50 ++++++++++++++---------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/pype/modules/ftrack/ftrack_server/lib.py b/pype/modules/ftrack/ftrack_server/lib.py index 3b016d38fd3..0b92f6486aa 100644 --- a/pype/modules/ftrack/ftrack_server/lib.py +++ b/pype/modules/ftrack/ftrack_server/lib.py @@ -18,7 +18,10 @@ import ftrack_api._centralized_storage_scenario import ftrack_api.event from ftrack_api.logging import LazyLogMessage as L - +try: + from weakref import WeakMethod +except ImportError: + from ftrack_api._weakref import WeakMethod from pype.modules.ftrack.lib import get_ftrack_event_mongo_info from pype.lib import PypeMongoConnection @@ -243,14 +246,16 @@ def _handle_packet(self, code, packet_identifier, path, data): return super()._handle_packet(code, packet_identifier, path, data) -class SocketSession(ftrack_api.session.Session): +class CustomEventHubSession(ftrack_api.session.Session): '''An isolated session for interaction with an ftrack server.''' def __init__( self, server_url=None, api_key=None, api_user=None, auto_populate=True, plugin_paths=None, cache=None, cache_key_maker=None, - auto_connect_event_hub=None, schema_cache_path=None, - plugin_arguments=None, sock=None, Eventhub=None + auto_connect_event_hub=False, schema_cache_path=None, + plugin_arguments=None, **kwargs ): + self.kwargs = kwargs + super(ftrack_api.session.Session, self).__init__() self.logger = logging.getLogger( __name__ + '.' + self.__class__.__name__ @@ -336,17 +341,10 @@ def __init__( self.check_server_compatibility() # Construct event hub and load plugins. - if Eventhub is None: - Eventhub = ftrack_api.event.hub.EventHub - self._event_hub = Eventhub( - self._server_url, - self._api_user, - self._api_key, - sock=sock - ) + self._event_hub = self._create_event_hub() self._auto_connect_event_hub_thread = None - if auto_connect_event_hub in (None, True): + if auto_connect_event_hub: # Connect to event hub in background thread so as not to block main # session usage waiting for event hub connection. self._auto_connect_event_hub_thread = threading.Thread( @@ -355,14 +353,8 @@ def __init__( self._auto_connect_event_hub_thread.daemon = True self._auto_connect_event_hub_thread.start() - # To help with migration from auto_connect_event_hub default changing - # from True to False. - self._event_hub._deprecation_warning_auto_connect = ( - auto_connect_event_hub is None - ) - # Register to auto-close session on exit. - atexit.register(self.close) + atexit.register(WeakMethod(self.close)) self._plugin_paths = plugin_paths if self._plugin_paths is None: @@ -399,3 +391,21 @@ def __init__( ), synchronous=True ) + + def _create_event_hub(self): + return ftrack_api.event.hub.EventHub( + self._server_url, + self._api_user, + self._api_key + ) + + +class SocketSession(CustomEventHubSession): + def _create_event_hub(self): + self.sock = self.kwargs["sock"] + return self.kwargs["Eventhub"]( + self._server_url, + self._api_user, + self._api_key, + sock=self.sock + )