From ee885051d915a20fe5e004a27c40a246f1e156de Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 30 Mar 2022 12:35:27 +0200 Subject: [PATCH 01/39] Added compute_resource_sync_sites to sync_server_module This method will be used in integrate_new to logically separate Site Sync parts. --- .../modules/sync_server/sync_server_module.py | 107 +++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index caf58503f1..7126c17e17 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -157,7 +157,6 @@ class SyncServerModule(OpenPypeModule, ITrayModule): representation_id, site_name=site_name, force=force) - # public facing API def remove_site(self, collection, representation_id, site_name, remove_local_files=False): """ @@ -184,6 +183,112 @@ class SyncServerModule(OpenPypeModule, ITrayModule): if remove_local_files: self._remove_local_file(collection, representation_id, site_name) + def compute_resource_sync_sites(self, project_name): + """Get available resource sync sites state for publish process. + + Returns dict with prepared state of sync sites for 'project_name'. + It checks if Site Sync is enabled, handles alternative sites. + Publish process stores this dictionary as a part of representation + document in DB. + + Example: + [ + { + 'name': '42abbc09-d62a-44a4-815c-a12cd679d2d7', + 'created_dt': datetime.datetime(2022, 3, 30, 12, 16, 9, 778637) + }, + {'name': 'studio'}, + {'name': 'SFTP'} + ] -- representation is published locally, artist or Settings have set + remote site as 'studio'. 'SFTP' is alternate site to 'studio'. Eg. + whenever file is on 'studio', it is also on 'SFTP'. + """ + + def create_metadata(name, created=True): + """Create sync site metadata for site with `name`""" + metadata = {"name": name} + if created: + metadata["created_dt"] = datetime.now() + return metadata + + if ( + not self.sync_system_settings["enabled"] or + not self.sync_project_settings[project_name]["enabled"]): + return [create_metadata(self.DEFAULT_SITE)] + + local_site = self.get_active_site(project_name) + remote_site = self.get_remote_site(project_name) + + # Attached sites metadata by site name + # That is the local site, remote site, the always accesible sites + # and their alternate sites (alias of sites with different protocol) + attached_sites = dict() + attached_sites[local_site] = create_metadata(local_site) + + if remote_site and remote_site not in attached_sites: + attached_sites[remote_site] = create_metadata(remote_site, + created=False) + + # add skeleton for sites where it should be always synced to + # usually it would be a backup site which is handled by separate + # background process + for site in self._get_always_accessible_sites(project_name): + if site not in attached_sites: + attached_sites[site] = create_metadata(site, created=False) + + attached_sites = self._add_alternative_sites(attached_sites) + + return list(attached_sites.values()) + + def _get_always_accessible_sites(self, project_name): + """Sites that synced to as a part of background process. + + Artist machine doesn't handle those, explicit Tray with that site name + as a local id must be running. + Example is dropbox site serving as a backup solution + """ + always_accessible_sites = ( + self.get_sync_project_setting(project_name)["config"]. + get("always_accessible_on", []) + ) + return [site.strip() for site in always_accessible_sites] + + def _add_alternative_sites(self, attached_sites): + """Add skeleton document for alternative sites + + Each new configured site in System Setting could serve as a alternative + site, it's a kind of alias. It means that files on 'a site' are + physically accessible also on 'a alternative' site. + Example is sftp site serving studio files via sftp protocol, physically + file is only in studio, sftp server has this location mounted. + """ + additional_sites = self.sync_system_settings.get("sites", {}) + + for site_name, site_info in additional_sites.items(): + # Get alternate sites (stripped names) for this site name + alt_sites = site_info.get("alternative_sites", []) + alt_sites = [site.strip() for site in alt_sites] + alt_sites = set(alt_sites) + + # If no alternative sites we don't need to add + if not alt_sites: + continue + + # Take a copy of data of the first alternate site that is already + # defined as an attached site to match the same state. + match_meta = next((attached_sites[site] for site in alt_sites + if site in attached_sites), None) + if not match_meta: + continue + + alt_site_meta = copy.deepcopy(match_meta) + alt_site_meta["name"] = site_name + + # Note: We change mutable `attached_site` dict in-place + attached_sites[site_name] = alt_site_meta + + return attached_sites + def clear_project(self, collection, site_name): """ Clear 'collection' of 'site_name' and its local files From 4cdcb974b384ec628e83f480a24cdca4ddd1e605 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 18:07:51 +0200 Subject: [PATCH 02/39] removed usage of config callback in maya --- openpype/hosts/maya/api/pipeline.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/openpype/hosts/maya/api/pipeline.py b/openpype/hosts/maya/api/pipeline.py index a8834d1ea3..f6f3472eef 100644 --- a/openpype/hosts/maya/api/pipeline.py +++ b/openpype/hosts/maya/api/pipeline.py @@ -9,8 +9,6 @@ import maya.api.OpenMaya as om import pyblish.api import avalon.api -from avalon.lib import find_submodule - import openpype.hosts.maya from openpype.tools.utils import host_tools from openpype.lib import ( @@ -20,7 +18,6 @@ from openpype.lib import ( ) from openpype.lib.path_tools import HostDirmap from openpype.pipeline import ( - LegacyCreator, register_loader_plugin_path, register_inventory_action_path, register_creator_plugin_path, @@ -270,21 +267,8 @@ def ls(): """ container_names = _ls() - - has_metadata_collector = False - config_host = find_submodule(avalon.api.registered_config(), "maya") - if hasattr(config_host, "collect_container_metadata"): - has_metadata_collector = True - for container in sorted(container_names): - data = parse_container(container) - - # Collect custom data if attribute is present - if has_metadata_collector: - metadata = config_host.collect_container_metadata(container) - data.update(metadata) - - yield data + yield parse_container(container) def containerise(name, From b652170492496a7d64caa34b66db334011a1cdde Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 18:09:05 +0200 Subject: [PATCH 03/39] removed usage of avalon config from houdini --- openpype/hosts/houdini/api/pipeline.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/openpype/hosts/houdini/api/pipeline.py b/openpype/hosts/houdini/api/pipeline.py index 8e093a89bc..6a69814e2e 100644 --- a/openpype/hosts/houdini/api/pipeline.py +++ b/openpype/hosts/houdini/api/pipeline.py @@ -7,8 +7,6 @@ import hou import hdefereval import pyblish.api -import avalon.api -from avalon.lib import find_submodule from openpype.pipeline import ( register_creator_plugin_path, @@ -215,24 +213,12 @@ def ls(): "pyblish.mindbender.container"): containers += lib.lsattr("id", identifier) - has_metadata_collector = False - config_host = find_submodule(avalon.api.registered_config(), "houdini") - if hasattr(config_host, "collect_container_metadata"): - has_metadata_collector = True - for container in sorted(containers, # Hou 19+ Python 3 hou.ObjNode are not # sortable due to not supporting greater # than comparisons key=lambda node: node.path()): - data = parse_container(container) - - # Collect custom data if attribute is present - if has_metadata_collector: - metadata = config_host.collect_container_metadata(container) - data.update(metadata) - - yield data + yield parse_container(container) def before_save(): From f3f06444ac7ddd193932549d00dc97a2d827d306 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 18:31:48 +0200 Subject: [PATCH 04/39] created process_context with installation functions --- openpype/pipeline/process_context.py | 333 +++++++++++++++++++++++++++ 1 file changed, 333 insertions(+) create mode 100644 openpype/pipeline/process_context.py diff --git a/openpype/pipeline/process_context.py b/openpype/pipeline/process_context.py new file mode 100644 index 0000000000..65e891c100 --- /dev/null +++ b/openpype/pipeline/process_context.py @@ -0,0 +1,333 @@ +"""Core pipeline functionality""" + +import os +import sys +import json +import types +import logging +import inspect +import platform + +import pyblish.api +from pyblish.lib import MessageHandler + +from avalon import io, Session + +import openpype +from openpype.modules import load_modules +from openpype.settings import get_project_settings +from openpype.lib import ( + Anatomy, + register_event_callback, + filter_pyblish_plugins, + change_timer_to_current_context, +) + +from . import ( + register_loader_plugin_path, + register_inventory_action, + register_creator_plugin_path, + deregister_loader_plugin_path, +) + + +_is_installed = False +_registered_root = {"_": ""} +_registered_host = {"_": None} + +log = logging.getLogger(__name__) + +PACKAGE_DIR = os.path.dirname(os.path.abspath(openpype.__file__)) +PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") + +# Global plugin paths +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") + + +def register_root(path): + """Register currently active root""" + log.info("Registering root: %s" % path) + _registered_root["_"] = path + + +def registered_root(): + """Return currently registered root""" + root = _registered_root["_"] + if root: + return root + + root = Session.get("AVALON_PROJECTS") + if root: + return os.path.normpath(root) + return "" + + +def install(host): + """Install `host` into the running Python session. + + Args: + host (module): A Python module containing the Avalon + avalon host-interface. + """ + global _is_installed + + io.install() + + missing = list() + for key in ("AVALON_PROJECT", "AVALON_ASSET"): + if key not in Session: + missing.append(key) + + assert not missing, ( + "%s missing from environment, %s" % ( + ", ".join(missing), + json.dumps(Session, indent=4, sort_keys=True) + )) + + project_name = Session["AVALON_PROJECT"] + log.info("Activating %s.." % project_name) + + # Optional host install function + if hasattr(host, "install"): + host.install() + + register_host(host) + + _is_installed = True + + # Make sure modules are loaded + load_modules() + + def modified_emit(obj, record): + """Method replacing `emit` in Pyblish's MessageHandler.""" + record.msg = record.getMessage() + obj.records.append(record) + + MessageHandler.emit = modified_emit + + log.info("Registering global plug-ins..") + pyblish.api.register_plugin_path(PUBLISH_PATH) + pyblish.api.register_discovery_filter(filter_pyblish_plugins) + register_loader_plugin_path(LOAD_PATH) + + project_name = os.environ.get("AVALON_PROJECT") + + # Register studio specific plugins + if project_name: + anatomy = Anatomy(project_name) + anatomy.set_root_environments() + register_root(anatomy.roots) + + project_settings = get_project_settings(project_name) + platform_name = platform.system().lower() + project_plugins = ( + project_settings + .get("global", {}) + .get("project_plugins", {}) + .get(platform_name) + ) or [] + for path in project_plugins: + try: + path = str(path.format(**os.environ)) + except KeyError: + pass + + if not path or not os.path.exists(path): + continue + + pyblish.api.register_plugin_path(path) + register_loader_plugin_path(path) + register_creator_plugin_path(path) + register_inventory_action(path) + + # apply monkey patched discover to original one + log.info("Patching discovery") + + register_event_callback("taskChanged", _on_task_change) + + +def _on_task_change(): + change_timer_to_current_context() + + +def uninstall(): + """Undo all of what `install()` did""" + host = registered_host() + + try: + host.uninstall() + except AttributeError: + pass + + log.info("Deregistering global plug-ins..") + pyblish.api.deregister_plugin_path(PUBLISH_PATH) + pyblish.api.deregister_discovery_filter(filter_pyblish_plugins) + deregister_loader_plugin_path(LOAD_PATH) + log.info("Global plug-ins unregistred") + + deregister_host() + + io.uninstall() + + log.info("Successfully uninstalled Avalon!") + + +def is_installed(): + """Return state of installation + + Returns: + True if installed, False otherwise + + """ + + return _is_installed + + +def register_host(host): + """Register a new host for the current process + + Arguments: + host (ModuleType): A module implementing the + Host API interface. See the Host API + documentation for details on what is + required, or browse the source code. + + """ + signatures = { + "ls": [] + } + + _validate_signature(host, signatures) + _registered_host["_"] = host + + +def _validate_signature(module, signatures): + # Required signatures for each member + + missing = list() + invalid = list() + success = True + + for member in signatures: + if not hasattr(module, member): + missing.append(member) + success = False + + else: + attr = getattr(module, member) + if sys.version_info.major >= 3: + signature = inspect.getfullargspec(attr)[0] + else: + signature = inspect.getargspec(attr)[0] + required_signature = signatures[member] + + assert isinstance(signature, list) + assert isinstance(required_signature, list) + + if not all(member in signature + for member in required_signature): + invalid.append({ + "member": member, + "signature": ", ".join(signature), + "required": ", ".join(required_signature) + }) + success = False + + if not success: + report = list() + + if missing: + report.append( + "Incomplete interface for module: '%s'\n" + "Missing: %s" % (module, ", ".join( + "'%s'" % member for member in missing)) + ) + + if invalid: + report.append( + "'%s': One or more members were found, but didn't " + "have the right argument signature." % module.__name__ + ) + + for member in invalid: + report.append( + " Found: {member}({signature})".format(**member) + ) + report.append( + " Expected: {member}({required})".format(**member) + ) + + raise ValueError("\n".join(report)) + + +def registered_host(): + """Return currently registered host""" + return _registered_host["_"] + + +def deregister_host(): + _registered_host["_"] = default_host() + + +def default_host(): + """A default host, in place of anything better + + This may be considered as reference for the + interface a host must implement. It also ensures + that the system runs, even when nothing is there + to support it. + + """ + + host = types.ModuleType("defaultHost") + + def ls(): + return list() + + host.__dict__.update({ + "ls": ls + }) + + return host + + +def debug_host(): + """A debug host, useful to debugging features that depend on a host""" + + host = types.ModuleType("debugHost") + + def ls(): + containers = [ + { + "representation": "ee-ft-a-uuid1", + "schema": "openpype:container-1.0", + "name": "Bruce01", + "objectName": "Bruce01_node", + "namespace": "_bruce01_", + "version": 3, + }, + { + "representation": "aa-bc-s-uuid2", + "schema": "openpype:container-1.0", + "name": "Bruce02", + "objectName": "Bruce01_node", + "namespace": "_bruce02_", + "version": 2, + } + ] + + for container in containers: + yield container + + host.__dict__.update({ + "ls": ls, + "open_file": lambda fname: None, + "save_file": lambda fname: None, + "current_file": lambda: os.path.expanduser("~/temp.txt"), + "has_unsaved_changes": lambda: False, + "work_root": lambda: os.path.expanduser("~/temp"), + "file_extensions": lambda: ["txt"], + }) + + return host From c49791258a5b714c84085f465e05b43f72f08266 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:36:08 +0200 Subject: [PATCH 05/39] changed function names and separated install in 2 parts --- openpype/pipeline/__init__.py | 33 ++++++++++++++++++++++++++++ openpype/pipeline/process_context.py | 26 ++++++++++++---------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/openpype/pipeline/__init__.py b/openpype/pipeline/__init__.py index 8460d20ef1..914606cc2f 100644 --- a/openpype/pipeline/__init__.py +++ b/openpype/pipeline/__init__.py @@ -68,6 +68,22 @@ from .actions import ( deregister_inventory_action_path, ) +from .process_context import ( + install_openpype_plugins, + install_host, + uninstall_host, + is_installed, + + register_root, + registered_root, + + register_host, + registered_host, + deregister_host, +) +install = install_host +uninstall = uninstall_host + __all__ = ( "AVALON_CONTAINER_ID", @@ -135,4 +151,21 @@ __all__ = ( "register_inventory_action_path", "deregister_inventory_action", "deregister_inventory_action_path", + + # --- Process context --- + "install_openpype_plugins", + "install_host", + "uninstall_host", + "is_installed", + + "register_root", + "registered_root", + + "register_host", + "registered_host", + "deregister_host", + + # Backwards compatible function names + "install", + "uninstall", ) diff --git a/openpype/pipeline/process_context.py b/openpype/pipeline/process_context.py index 65e891c100..1bef260ec9 100644 --- a/openpype/pipeline/process_context.py +++ b/openpype/pipeline/process_context.py @@ -63,7 +63,7 @@ def registered_root(): return "" -def install(host): +def install_host(host): """Install `host` into the running Python session. Args: @@ -72,6 +72,8 @@ def install(host): """ global _is_installed + _is_installed = True + io.install() missing = list() @@ -94,10 +96,7 @@ def install(host): register_host(host) - _is_installed = True - - # Make sure modules are loaded - load_modules() + register_event_callback("taskChanged", _on_task_change) def modified_emit(obj, record): """Method replacing `emit` in Pyblish's MessageHandler.""" @@ -106,12 +105,20 @@ def install(host): MessageHandler.emit = modified_emit + install_openpype_plugins() + + +def install_openpype_plugins(project_name=None): + # Make sure modules are loaded + load_modules() + log.info("Registering global plug-ins..") pyblish.api.register_plugin_path(PUBLISH_PATH) pyblish.api.register_discovery_filter(filter_pyblish_plugins) register_loader_plugin_path(LOAD_PATH) - project_name = os.environ.get("AVALON_PROJECT") + if project_name is None: + project_name = os.environ.get("AVALON_PROJECT") # Register studio specific plugins if project_name: @@ -141,17 +148,12 @@ def install(host): register_creator_plugin_path(path) register_inventory_action(path) - # apply monkey patched discover to original one - log.info("Patching discovery") - - register_event_callback("taskChanged", _on_task_change) - def _on_task_change(): change_timer_to_current_context() -def uninstall(): +def uninstall_host(): """Undo all of what `install()` did""" host = registered_host() From eabe2fe56960a098608b10599e5d0c1cee550f9a Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:37:58 +0200 Subject: [PATCH 06/39] changed usage of registered root --- .../vendor/husdoutputprocessors/avalon_uri_processor.py | 3 ++- openpype/lib/usdlib.py | 3 ++- openpype/pipeline/load/utils.py | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py b/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py index 499b733570..8cd51e6641 100644 --- a/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py +++ b/openpype/hosts/houdini/vendor/husdoutputprocessors/avalon_uri_processor.py @@ -134,6 +134,7 @@ class AvalonURIOutputProcessor(base.OutputProcessorBase): """ from avalon import api, io + from openpype.pipeline import registered_root PROJECT = api.Session["AVALON_PROJECT"] asset_doc = io.find_one({"name": asset, @@ -141,7 +142,7 @@ class AvalonURIOutputProcessor(base.OutputProcessorBase): if not asset_doc: raise RuntimeError("Invalid asset name: '%s'" % asset) - root = api.registered_root() + root = registered_root() path = self._template.format(**{ "root": root, "project": PROJECT, diff --git a/openpype/lib/usdlib.py b/openpype/lib/usdlib.py index 89021156b4..7b3b7112de 100644 --- a/openpype/lib/usdlib.py +++ b/openpype/lib/usdlib.py @@ -9,6 +9,7 @@ except ImportError: from mvpxr import Usd, UsdGeom, Sdf, Kind from avalon import io, api +from openpype.pipeline import registered_root log = logging.getLogger(__name__) @@ -323,7 +324,7 @@ def get_usd_master_path(asset, subset, representation): path = template.format( **{ - "root": api.registered_root(), + "root": registered_root(), "project": api.Session["AVALON_PROJECT"], "asset": asset_doc["name"], "subset": subset, diff --git a/openpype/pipeline/load/utils.py b/openpype/pipeline/load/utils.py index 53ac6b626d..cb7c76f133 100644 --- a/openpype/pipeline/load/utils.py +++ b/openpype/pipeline/load/utils.py @@ -10,7 +10,7 @@ import six from bson.objectid import ObjectId from avalon import io, schema -from avalon.api import Session, registered_root +from avalon.api import Session from openpype.lib import Anatomy @@ -532,6 +532,8 @@ def get_representation_path(representation, root=None, dbcon=None): dbcon = io if root is None: + from openpype.pipeline import registered_root + root = registered_root() def path_from_represenation(): From 729131738a5ef8d618f3877da2bb4635e0c2d8be Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:40:23 +0200 Subject: [PATCH 07/39] changed installation of hosts --- openpype/hosts/aftereffects/api/lib.py | 4 ++-- openpype/hosts/blender/api/pipeline.py | 4 ++-- .../hosts/blender/blender_addon/startup/init.py | 4 ++-- openpype/hosts/celaction/api/cli.py | 10 ++++------ openpype/hosts/flame/startup/openpype_in_flame.py | 6 +++--- openpype/hosts/fusion/scripts/fusion_switch_shot.py | 8 ++++++-- .../fusion/utility_scripts/__OpenPype_Menu__.py | 13 ++++++------- openpype/hosts/fusion/utility_scripts/switch_ui.py | 6 +++--- openpype/hosts/harmony/api/lib.py | 4 ++-- openpype/hosts/hiero/api/pipeline.py | 9 +-------- .../hiero/api/startup/Python/Startup/Startup.py | 4 ++-- .../hosts/houdini/startup/python2.7libs/pythonrc.py | 4 ++-- .../hosts/houdini/startup/python3.7libs/pythonrc.py | 4 ++-- openpype/hosts/maya/startup/userSetup.py | 5 ++--- openpype/hosts/nuke/startup/menu.py | 4 ++-- openpype/hosts/photoshop/api/lib.py | 5 ++--- .../utility_scripts/OpenPype_sync_util_scripts.py | 5 +++-- .../resolve/utility_scripts/__OpenPype__Menu__.py | 9 ++------- .../utility_scripts/tests/test_otio_as_edl.py | 10 +++++----- .../tests/testing_create_timeline_item_from_path.py | 8 +++----- .../tests/testing_load_media_pool_item.py | 8 +++----- openpype/hosts/tvpaint/api/launch_script.py | 4 ++-- openpype/hosts/tvpaint/api/pipeline.py | 11 ++++------- .../integration/Content/Python/init_unreal.py | 10 ++-------- openpype/hosts/webpublisher/api/__init__.py | 1 - openpype/lib/remote_publish.py | 7 ++----- openpype/tests/test_avalon_plugin_presets.py | 12 +++++------- 27 files changed, 74 insertions(+), 105 deletions(-) diff --git a/openpype/hosts/aftereffects/api/lib.py b/openpype/hosts/aftereffects/api/lib.py index dac6b5d28f..ce4cbf09af 100644 --- a/openpype/hosts/aftereffects/api/lib.py +++ b/openpype/hosts/aftereffects/api/lib.py @@ -6,6 +6,7 @@ import logging from Qt import QtWidgets +from openpype.pipeline import install_host from openpype.lib.remote_publish import headless_publish from openpype.tools.utils import host_tools @@ -22,10 +23,9 @@ def safe_excepthook(*args): def main(*subprocess_args): sys.excepthook = safe_excepthook - import avalon.api from openpype.hosts.aftereffects import api - avalon.api.install(api) + install_host(api) os.environ["OPENPYPE_LOG_NO_COLORS"] = "False" app = QtWidgets.QApplication([]) diff --git a/openpype/hosts/blender/api/pipeline.py b/openpype/hosts/blender/api/pipeline.py index b9ec2cfea4..0ea579970e 100644 --- a/openpype/hosts/blender/api/pipeline.py +++ b/openpype/hosts/blender/api/pipeline.py @@ -19,6 +19,7 @@ from openpype.pipeline import ( deregister_loader_plugin_path, deregister_creator_plugin_path, AVALON_CONTAINER_ID, + uninstall_host, ) from openpype.api import Logger from openpype.lib import ( @@ -209,11 +210,10 @@ def reload_pipeline(*args): """ - avalon.api.uninstall() + uninstall_host() for module in ( "avalon.io", - "avalon.lib", "avalon.pipeline", "avalon.api", ): diff --git a/openpype/hosts/blender/blender_addon/startup/init.py b/openpype/hosts/blender/blender_addon/startup/init.py index e43373bc6c..13a4b8a7a1 100644 --- a/openpype/hosts/blender/blender_addon/startup/init.py +++ b/openpype/hosts/blender/blender_addon/startup/init.py @@ -1,4 +1,4 @@ -from avalon import pipeline +from openpype.pipeline import install_host from openpype.hosts.blender import api -pipeline.install(api) +install_host(api) diff --git a/openpype/hosts/celaction/api/cli.py b/openpype/hosts/celaction/api/cli.py index bc1e3eaf89..85e210f21a 100644 --- a/openpype/hosts/celaction/api/cli.py +++ b/openpype/hosts/celaction/api/cli.py @@ -3,8 +3,6 @@ import sys import copy import argparse -from avalon import io - import pyblish.api import pyblish.util @@ -13,6 +11,8 @@ import openpype import openpype.hosts.celaction from openpype.hosts.celaction import api as celaction from openpype.tools.utils import host_tools +from openpype.pipeline.process_context import install_openpype_plugins + log = Logger().get_logger("Celaction_cli_publisher") @@ -21,9 +21,6 @@ publish_host = "celaction" HOST_DIR = os.path.dirname(os.path.abspath(openpype.hosts.celaction.__file__)) PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "create") -INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") def cli(): @@ -74,7 +71,8 @@ def main(): _prepare_publish_environments() # Registers pype's Global pyblish plugins - openpype.install() + # - use fake host + install_openpype_plugins() if os.path.exists(PUBLISH_PATH): log.info(f"Registering path: {PUBLISH_PATH}") diff --git a/openpype/hosts/flame/startup/openpype_in_flame.py b/openpype/hosts/flame/startup/openpype_in_flame.py index 931c5a1b79..7015abc7f4 100644 --- a/openpype/hosts/flame/startup/openpype_in_flame.py +++ b/openpype/hosts/flame/startup/openpype_in_flame.py @@ -3,16 +3,16 @@ import sys from Qt import QtWidgets from pprint import pformat import atexit -import openpype + import avalon import openpype.hosts.flame.api as opfapi +from openpype.pipeline import install_host def openpype_install(): """Registering OpenPype in context """ - openpype.install() - avalon.api.install(opfapi) + install_host(opfapi) print("Avalon registered hosts: {}".format( avalon.api.registered_host())) diff --git a/openpype/hosts/fusion/scripts/fusion_switch_shot.py b/openpype/hosts/fusion/scripts/fusion_switch_shot.py index ca7efb9136..ca8e5c9e37 100644 --- a/openpype/hosts/fusion/scripts/fusion_switch_shot.py +++ b/openpype/hosts/fusion/scripts/fusion_switch_shot.py @@ -7,6 +7,10 @@ import logging import avalon.api from avalon import io +from openpype.pipeline import ( + install_host, + registered_host, +) from openpype.lib import version_up from openpype.hosts.fusion import api from openpype.hosts.fusion.api import lib @@ -218,7 +222,7 @@ def switch(asset_name, filepath=None, new=True): assert current_comp is not None, ( "Fusion could not load '{}'").format(filepath) - host = avalon.api.registered_host() + host = registered_host() containers = list(host.ls()) assert containers, "Nothing to update" @@ -279,7 +283,7 @@ if __name__ == '__main__': args, unknown = parser.parse_args() - avalon.api.install(api) + install_host(api) switch(args.asset_name, args.file_path) sys.exit(0) diff --git a/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py b/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py index 4b5e8f91a0..aa98563785 100644 --- a/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py +++ b/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py @@ -1,24 +1,23 @@ import os import sys -import openpype from openpype.api import Logger +from openpype.pipeline import ( + install_host, + registered_host, +) log = Logger().get_logger(__name__) def main(env): - import avalon.api from openpype.hosts.fusion import api from openpype.hosts.fusion.api import menu - # Registers pype's Global pyblish plugins - openpype.install() - # activate resolve from pype - avalon.api.install(api) + install_host(api) - log.info(f"Avalon registered hosts: {avalon.api.registered_host()}") + log.info(f"Avalon registered hosts: {registered_host()}") menu.launch_openpype_menu() diff --git a/openpype/hosts/fusion/utility_scripts/switch_ui.py b/openpype/hosts/fusion/utility_scripts/switch_ui.py index d9eeae25ea..37306c7a2a 100644 --- a/openpype/hosts/fusion/utility_scripts/switch_ui.py +++ b/openpype/hosts/fusion/utility_scripts/switch_ui.py @@ -1,14 +1,15 @@ import os +import sys import glob import logging from Qt import QtWidgets, QtCore -import avalon.api from avalon import io import qtawesome as qta from openpype import style +from openpype.pipeline import install_host from openpype.hosts.fusion import api from openpype.lib.avalon_context import get_workdir_from_session @@ -181,8 +182,7 @@ class App(QtWidgets.QWidget): if __name__ == '__main__': - import sys - avalon.api.install(api) + install_host(api) app = QtWidgets.QApplication(sys.argv) window = App() diff --git a/openpype/hosts/harmony/api/lib.py b/openpype/hosts/harmony/api/lib.py index 66eeac1e3a..53fd0f07dd 100644 --- a/openpype/hosts/harmony/api/lib.py +++ b/openpype/hosts/harmony/api/lib.py @@ -183,10 +183,10 @@ def launch(application_path, *args): application_path (str): Path to Harmony. """ - from avalon import api + from openpype.pipeline import install_host from openpype.hosts.harmony import api as harmony - api.install(harmony) + install_host(harmony) ProcessContext.port = random.randrange(49152, 65535) os.environ["AVALON_HARMONY_PORT"] = str(ProcessContext.port) diff --git a/openpype/hosts/hiero/api/pipeline.py b/openpype/hosts/hiero/api/pipeline.py index b334102129..616ff53fd8 100644 --- a/openpype/hosts/hiero/api/pipeline.py +++ b/openpype/hosts/hiero/api/pipeline.py @@ -34,14 +34,7 @@ AVALON_CONTAINERS = ":AVALON_CONTAINERS" def install(): - """ - Installing Hiero integration for avalon - - Args: - config (obj): avalon config module `pype` in our case, it is not - used but required by avalon.api.install() - - """ + """Installing Hiero integration.""" # adding all events events.register_events() diff --git a/openpype/hosts/hiero/api/startup/Python/Startup/Startup.py b/openpype/hosts/hiero/api/startup/Python/Startup/Startup.py index 21c21cd7c3..2e638c2088 100644 --- a/openpype/hosts/hiero/api/startup/Python/Startup/Startup.py +++ b/openpype/hosts/hiero/api/startup/Python/Startup/Startup.py @@ -1,9 +1,9 @@ import traceback # activate hiero from pype -import avalon.api +from openpype.pipeline import install_host import openpype.hosts.hiero.api as phiero -avalon.api.install(phiero) +install_host(phiero) try: __import__("openpype.hosts.hiero.api") diff --git a/openpype/hosts/houdini/startup/python2.7libs/pythonrc.py b/openpype/hosts/houdini/startup/python2.7libs/pythonrc.py index eb33b49759..afadbffd3e 100644 --- a/openpype/hosts/houdini/startup/python2.7libs/pythonrc.py +++ b/openpype/hosts/houdini/startup/python2.7libs/pythonrc.py @@ -1,10 +1,10 @@ -import avalon.api +from openpype.pipeline import install_host from openpype.hosts.houdini import api def main(): print("Installing OpenPype ...") - avalon.api.install(api) + install_host(api) main() diff --git a/openpype/hosts/houdini/startup/python3.7libs/pythonrc.py b/openpype/hosts/houdini/startup/python3.7libs/pythonrc.py index eb33b49759..afadbffd3e 100644 --- a/openpype/hosts/houdini/startup/python3.7libs/pythonrc.py +++ b/openpype/hosts/houdini/startup/python3.7libs/pythonrc.py @@ -1,10 +1,10 @@ -import avalon.api +from openpype.pipeline import install_host from openpype.hosts.houdini import api def main(): print("Installing OpenPype ...") - avalon.api.install(api) + install_host(api) main() diff --git a/openpype/hosts/maya/startup/userSetup.py b/openpype/hosts/maya/startup/userSetup.py index b89244817a..a3ab483add 100644 --- a/openpype/hosts/maya/startup/userSetup.py +++ b/openpype/hosts/maya/startup/userSetup.py @@ -1,11 +1,10 @@ import os -import avalon.api from openpype.api import get_project_settings +from openpype.pipeline import install_host from openpype.hosts.maya import api -import openpype.hosts.maya.api.lib as mlib from maya import cmds -avalon.api.install(api) +install_host(api) print("starting OpenPype usersetup") diff --git a/openpype/hosts/nuke/startup/menu.py b/openpype/hosts/nuke/startup/menu.py index 2cac6d09e7..9ed43b2110 100644 --- a/openpype/hosts/nuke/startup/menu.py +++ b/openpype/hosts/nuke/startup/menu.py @@ -1,7 +1,7 @@ import nuke -import avalon.api from openpype.api import Logger +from openpype.pipeline import install_host from openpype.hosts.nuke import api from openpype.hosts.nuke.api.lib import ( on_script_load, @@ -13,7 +13,7 @@ from openpype.hosts.nuke.api.lib import ( log = Logger.get_logger(__name__) -avalon.api.install(api) +install_host(api) # fix ffmpeg settings on script nuke.addOnScriptLoad(on_script_load) diff --git a/openpype/hosts/photoshop/api/lib.py b/openpype/hosts/photoshop/api/lib.py index 6d2a493a94..2f57d64464 100644 --- a/openpype/hosts/photoshop/api/lib.py +++ b/openpype/hosts/photoshop/api/lib.py @@ -5,9 +5,8 @@ import traceback from Qt import QtWidgets -import avalon.api - from openpype.api import Logger +from openpype.pipeline import install_host from openpype.tools.utils import host_tools from openpype.lib.remote_publish import headless_publish from openpype.lib import env_value_to_bool @@ -24,7 +23,7 @@ def safe_excepthook(*args): def main(*subprocess_args): from openpype.hosts.photoshop import api - avalon.api.install(api) + install_host(api) sys.excepthook = safe_excepthook # coloring in StdOutBroker diff --git a/openpype/hosts/resolve/utility_scripts/OpenPype_sync_util_scripts.py b/openpype/hosts/resolve/utility_scripts/OpenPype_sync_util_scripts.py index ac66916b91..3a16b9c966 100644 --- a/openpype/hosts/resolve/utility_scripts/OpenPype_sync_util_scripts.py +++ b/openpype/hosts/resolve/utility_scripts/OpenPype_sync_util_scripts.py @@ -1,13 +1,14 @@ #!/usr/bin/env python import os import sys -import openpype + +from openpype.pipeline import install_host def main(env): import openpype.hosts.resolve as bmdvr # Registers openpype's Global pyblish plugins - openpype.install() + install_host(bmdvr) bmdvr.setup(env) diff --git a/openpype/hosts/resolve/utility_scripts/__OpenPype__Menu__.py b/openpype/hosts/resolve/utility_scripts/__OpenPype__Menu__.py index b0cef1838a..89ade9238b 100644 --- a/openpype/hosts/resolve/utility_scripts/__OpenPype__Menu__.py +++ b/openpype/hosts/resolve/utility_scripts/__OpenPype__Menu__.py @@ -1,8 +1,7 @@ import os import sys -import avalon.api as avalon -import openpype +from openpype.pipeline import install_host from openpype.api import Logger log = Logger().get_logger(__name__) @@ -10,13 +9,9 @@ log = Logger().get_logger(__name__) def main(env): import openpype.hosts.resolve as bmdvr - # Registers openpype's Global pyblish plugins - openpype.install() # activate resolve from openpype - avalon.install(bmdvr) - - log.info(f"Avalon registered hosts: {avalon.registered_host()}") + install_host(bmdvr) bmdvr.launch_pype_menu() diff --git a/openpype/hosts/resolve/utility_scripts/tests/test_otio_as_edl.py b/openpype/hosts/resolve/utility_scripts/tests/test_otio_as_edl.py index 5430ad32df..8433bd9172 100644 --- a/openpype/hosts/resolve/utility_scripts/tests/test_otio_as_edl.py +++ b/openpype/hosts/resolve/utility_scripts/tests/test_otio_as_edl.py @@ -1,9 +1,11 @@ #! python3 import os import sys -import avalon.api as avalon -import openpype + import opentimelineio as otio + +from openpype.pipeline import install_host + from openpype.hosts.resolve import TestGUI import openpype.hosts.resolve as bmdvr from openpype.hosts.resolve.otio import davinci_export as otio_export @@ -14,10 +16,8 @@ class ThisTestGUI(TestGUI): def __init__(self): super(ThisTestGUI, self).__init__() - # Registers openpype's Global pyblish plugins - openpype.install() # activate resolve from openpype - avalon.install(bmdvr) + install_host(bmdvr) def _open_dir_button_pressed(self, event): # selected_path = self.fu.RequestFile(os.path.expanduser("~")) diff --git a/openpype/hosts/resolve/utility_scripts/tests/testing_create_timeline_item_from_path.py b/openpype/hosts/resolve/utility_scripts/tests/testing_create_timeline_item_from_path.py index afa311e0b8..477955d527 100644 --- a/openpype/hosts/resolve/utility_scripts/tests/testing_create_timeline_item_from_path.py +++ b/openpype/hosts/resolve/utility_scripts/tests/testing_create_timeline_item_from_path.py @@ -1,8 +1,8 @@ #! python3 import os import sys -import avalon.api as avalon -import openpype + +from openpype.pipeline import install_host from openpype.hosts.resolve import TestGUI import openpype.hosts.resolve as bmdvr import clique @@ -13,10 +13,8 @@ class ThisTestGUI(TestGUI): def __init__(self): super(ThisTestGUI, self).__init__() - # Registers openpype's Global pyblish plugins - openpype.install() # activate resolve from openpype - avalon.install(bmdvr) + install_host(bmdvr) def _open_dir_button_pressed(self, event): # selected_path = self.fu.RequestFile(os.path.expanduser("~")) diff --git a/openpype/hosts/resolve/utility_scripts/tests/testing_load_media_pool_item.py b/openpype/hosts/resolve/utility_scripts/tests/testing_load_media_pool_item.py index cfdbe890e5..872d620162 100644 --- a/openpype/hosts/resolve/utility_scripts/tests/testing_load_media_pool_item.py +++ b/openpype/hosts/resolve/utility_scripts/tests/testing_load_media_pool_item.py @@ -1,6 +1,5 @@ #! python3 -import avalon.api as avalon -import openpype +from openpype.pipeline import install_host import openpype.hosts.resolve as bmdvr @@ -15,8 +14,7 @@ def file_processing(fpath): if __name__ == "__main__": path = "C:/CODE/__openpype_projects/jtest03dev/shots/sq01/mainsq01sh030/publish/plate/plateMain/v006/jt3d_mainsq01sh030_plateMain_v006.0996.exr" - openpype.install() # activate resolve from openpype - avalon.install(bmdvr) + install_host(bmdvr) - file_processing(path) \ No newline at end of file + file_processing(path) diff --git a/openpype/hosts/tvpaint/api/launch_script.py b/openpype/hosts/tvpaint/api/launch_script.py index e66bf61df6..0b25027fc6 100644 --- a/openpype/hosts/tvpaint/api/launch_script.py +++ b/openpype/hosts/tvpaint/api/launch_script.py @@ -8,8 +8,8 @@ import logging from Qt import QtWidgets, QtCore, QtGui -from avalon import api from openpype import style +from openpype.pipeline import install_host from openpype.hosts.tvpaint.api.communication_server import ( CommunicationWrapper ) @@ -31,7 +31,7 @@ def main(launch_args): qt_app = QtWidgets.QApplication([]) # Execute pipeline installation - api.install(tvpaint_host) + install_host(tvpaint_host) # Create Communicator object and trigger launch # - this must be done before anything is processed diff --git a/openpype/hosts/tvpaint/api/pipeline.py b/openpype/hosts/tvpaint/api/pipeline.py index cafdf0701d..78c10c3dae 100644 --- a/openpype/hosts/tvpaint/api/pipeline.py +++ b/openpype/hosts/tvpaint/api/pipeline.py @@ -67,11 +67,8 @@ instances=2 def install(): - """Install Maya-specific functionality of avalon-core. + """Install TVPaint-specific functionality.""" - This function is called automatically on calling `api.install(maya)`. - - """ log.info("OpenPype - Installing TVPaint integration") io.install() @@ -96,11 +93,11 @@ def install(): def uninstall(): - """Uninstall TVPaint-specific functionality of avalon-core. - - This function is called automatically on calling `api.uninstall()`. + """Uninstall TVPaint-specific functionality. + This function is called automatically on calling `uninstall_host()`. """ + log.info("OpenPype - Uninstalling TVPaint integration") pyblish.api.deregister_host("tvpaint") pyblish.api.deregister_plugin_path(PUBLISH_PATH) diff --git a/openpype/hosts/unreal/integration/Content/Python/init_unreal.py b/openpype/hosts/unreal/integration/Content/Python/init_unreal.py index 2ecd301c25..4bb03b07ed 100644 --- a/openpype/hosts/unreal/integration/Content/Python/init_unreal.py +++ b/openpype/hosts/unreal/integration/Content/Python/init_unreal.py @@ -2,13 +2,7 @@ import unreal openpype_detected = True try: - from avalon import api -except ImportError as exc: - api = None - openpype_detected = False - unreal.log_error("Avalon: cannot load Avalon [ {} ]".format(exc)) - -try: + from openpype.pipeline import install_host from openpype.hosts.unreal import api as openpype_host except ImportError as exc: openpype_host = None @@ -16,7 +10,7 @@ except ImportError as exc: unreal.log_error("OpenPype: cannot load OpenPype [ {} ]".format(exc)) if openpype_detected: - api.install(openpype_host) + install_host(openpype_host) @unreal.uclass() diff --git a/openpype/hosts/webpublisher/api/__init__.py b/openpype/hosts/webpublisher/api/__init__.py index dbeb628073..72bbffd099 100644 --- a/openpype/hosts/webpublisher/api/__init__.py +++ b/openpype/hosts/webpublisher/api/__init__.py @@ -1,7 +1,6 @@ import os import logging -from avalon import api as avalon from avalon import io from pyblish import api as pyblish import openpype.hosts.webpublisher diff --git a/openpype/lib/remote_publish.py b/openpype/lib/remote_publish.py index 9d97671a61..8a42daf4e9 100644 --- a/openpype/lib/remote_publish.py +++ b/openpype/lib/remote_publish.py @@ -1,13 +1,12 @@ import os from datetime import datetime -import sys -from bson.objectid import ObjectId import collections +from bson.objectid import ObjectId + import pyblish.util import pyblish.api -from openpype import uninstall from openpype.lib.mongo import OpenPypeMongoConnection from openpype.lib.plugin_tools import parse_json @@ -81,7 +80,6 @@ def publish(log, close_plugin_name=None): if result["error"]: log.error(error_format.format(**result)) - uninstall() if close_plugin: # close host app explicitly after error context = pyblish.api.Context() close_plugin().process(context) @@ -118,7 +116,6 @@ def publish_and_log(dbcon, _id, log, close_plugin_name=None, batch_id=None): if result["error"]: log.error(error_format.format(**result)) - uninstall() log_lines = [error_format.format(**result)] + log_lines dbcon.update_one( {"_id": _id}, diff --git a/openpype/tests/test_avalon_plugin_presets.py b/openpype/tests/test_avalon_plugin_presets.py index c491be1c05..464c216d6f 100644 --- a/openpype/tests/test_avalon_plugin_presets.py +++ b/openpype/tests/test_avalon_plugin_presets.py @@ -1,6 +1,5 @@ -import avalon.api as api -import openpype from openpype.pipeline import ( + install_host, LegacyCreator, register_creator_plugin, discover_creator_plugins, @@ -23,15 +22,14 @@ class Test: __name__ = "test" ls = len - def __call__(self): - pass + @staticmethod + def install(): + register_creator_plugin(MyTestCreator) def test_avalon_plugin_presets(monkeypatch, printer): + install_host(Test) - openpype.install() - api.register_host(Test()) - register_creator_plugin(MyTestCreator) plugins = discover_creator_plugins() printer("Test if we got our test plugin") assert MyTestCreator in plugins From 331f87bd15c15099eb30d678c871fe3809dba885 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:41:18 +0200 Subject: [PATCH 08/39] changed usages of registered host and config --- openpype/hosts/testhost/run_publish.py | 4 ++-- openpype/pype_commands.py | 10 ++++++---- openpype/tools/loader/app.py | 10 ---------- openpype/tools/utils/host_tools.py | 3 ++- openpype/tools/utils/lib.py | 15 ++++++++------- 5 files changed, 18 insertions(+), 24 deletions(-) diff --git a/openpype/hosts/testhost/run_publish.py b/openpype/hosts/testhost/run_publish.py index 44860a30e4..cc80bdc604 100644 --- a/openpype/hosts/testhost/run_publish.py +++ b/openpype/hosts/testhost/run_publish.py @@ -48,8 +48,8 @@ from openpype.tools.publisher.window import PublisherWindow def main(): """Main function for testing purposes.""" - import avalon.api import pyblish.api + from openpype.pipeline import install_host from openpype.modules import ModulesManager from openpype.hosts.testhost import api as testhost @@ -57,7 +57,7 @@ def main(): for plugin_path in manager.collect_plugin_paths()["publish"]: pyblish.api.register_plugin_path(plugin_path) - avalon.api.install(testhost) + install_host(testhost) QtWidgets.QApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) app = QtWidgets.QApplication([]) diff --git a/openpype/pype_commands.py b/openpype/pype_commands.py index c05eece2be..e0c8847040 100644 --- a/openpype/pype_commands.py +++ b/openpype/pype_commands.py @@ -101,7 +101,8 @@ class PypeCommands: RuntimeError: When there is no path to process. """ from openpype.modules import ModulesManager - from openpype import install, uninstall + from openpype.pipeline import install_openpype_plugins + from openpype.api import Logger from openpype.tools.utils.host_tools import show_publish from openpype.tools.utils.lib import qt_app_context @@ -112,7 +113,7 @@ class PypeCommands: log = Logger.get_logger() - install() + install_openpype_plugins() manager = ModulesManager() @@ -294,7 +295,8 @@ class PypeCommands: # Register target and host import pyblish.api import pyblish.util - import avalon.api + + from openpype.pipeline import install_host from openpype.hosts.webpublisher import api as webpublisher log = PypeLogger.get_logger() @@ -315,7 +317,7 @@ class PypeCommands: for target in targets: pyblish.api.register_target(target) - avalon.api.install(webpublisher) + install_host(webpublisher) log.info("Running publish ...") diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 923a1fabdb..23c0909f2b 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -608,14 +608,4 @@ def cli(args): # Store settings api.Session["AVALON_PROJECT"] = project - from avalon import pipeline - - # Find the set config - _config = pipeline.find_config() - if hasattr(_config, "install"): - _config.install() - else: - print("Config `%s` has no function `install`" % - _config.__name__) - show() diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 2d9733ec94..b0c30f6dfb 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -6,6 +6,7 @@ use singleton approach with global functions (using helper anyway). import os import avalon.api import pyblish.api +from openpype.pipeline import registered_host from .lib import qt_app_context @@ -47,7 +48,7 @@ class HostToolsHelper: Window, validate_host_requirements ) # Host validation - host = avalon.api.registered_host() + host = registered_host() validate_host_requirements(host) workfiles_window = Window(parent=parent) diff --git a/openpype/tools/utils/lib.py b/openpype/tools/utils/lib.py index 422d0f5389..12dd637e6a 100644 --- a/openpype/tools/utils/lib.py +++ b/openpype/tools/utils/lib.py @@ -6,16 +6,17 @@ import collections from Qt import QtWidgets, QtCore, QtGui import qtawesome -import avalon.api - -from openpype.style import get_default_entity_icon_color +from openpype.style import ( + get_default_entity_icon_color, + get_objected_colors, +) +from openpype.resources import get_image_path +from openpype.lib import filter_profiles from openpype.api import ( get_project_settings, Logger ) -from openpype.lib import filter_profiles -from openpype.style import get_objected_colors -from openpype.resources import get_image_path +from openpype.pipeline import registered_host log = Logger.get_logger(__name__) @@ -402,7 +403,7 @@ class FamilyConfigCache: self.family_configs.clear() # Skip if we're not in host context - if not avalon.api.registered_host(): + if not registered_host(): return # Update the icons from the project configuration From f9043329b49573a3c3c89406a25bb266e2ca0106 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:41:29 +0200 Subject: [PATCH 09/39] removed unused imports --- .../ftrack/event_handlers_user/action_create_folders.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_user/action_create_folders.py b/openpype/modules/ftrack/event_handlers_user/action_create_folders.py index d15a865124..0ed12bd03e 100644 --- a/openpype/modules/ftrack/event_handlers_user/action_create_folders.py +++ b/openpype/modules/ftrack/event_handlers_user/action_create_folders.py @@ -1,11 +1,6 @@ import os from openpype_modules.ftrack.lib import BaseAction, statics_icon -from avalon import lib as avalonlib -from openpype.api import ( - Anatomy, - get_project_settings -) -from openpype.lib import ApplicationManager +from openpype.api import Anatomy class CreateFolders(BaseAction): From adc27e5186d30ba87c41b1f973a69d225f9f1174 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:41:46 +0200 Subject: [PATCH 10/39] changed how library loader is shown in tray --- openpype/modules/avalon_apps/avalon_app.py | 47 ++++++++++++---------- openpype/tools/libraryloader/app.py | 10 ----- openpype/tools/libraryloader/lib.py | 21 ---------- 3 files changed, 26 insertions(+), 52 deletions(-) delete mode 100644 openpype/tools/libraryloader/lib.py diff --git a/openpype/modules/avalon_apps/avalon_app.py b/openpype/modules/avalon_apps/avalon_app.py index 51a22323f1..1d21de129b 100644 --- a/openpype/modules/avalon_apps/avalon_app.py +++ b/openpype/modules/avalon_apps/avalon_app.py @@ -1,5 +1,5 @@ import os -import openpype + from openpype.modules import OpenPypeModule from openpype_interfaces import ITrayModule @@ -26,7 +26,8 @@ class AvalonModule(OpenPypeModule, ITrayModule): self.avalon_mongo_timeout = avalon_mongo_timeout # Tray attributes - self.libraryloader = None + self._library_loader_imported = None + self._library_loader_window = None self.rest_api_obj = None def get_global_environments(self): @@ -41,21 +42,11 @@ class AvalonModule(OpenPypeModule, ITrayModule): def tray_init(self): # Add library tool + self._library_loader_imported = False try: - from Qt import QtCore from openpype.tools.libraryloader import LibraryLoaderWindow - libraryloader = LibraryLoaderWindow( - show_projects=True, - show_libraries=True - ) - # Remove always on top flag for tray - window_flags = libraryloader.windowFlags() - if window_flags | QtCore.Qt.WindowStaysOnTopHint: - window_flags ^= QtCore.Qt.WindowStaysOnTopHint - libraryloader.setWindowFlags(window_flags) - self.libraryloader = libraryloader - + self._library_loader_imported = True except Exception: self.log.warning( "Couldn't load Library loader tool for tray.", @@ -64,7 +55,7 @@ class AvalonModule(OpenPypeModule, ITrayModule): # Definition of Tray menu def tray_menu(self, tray_menu): - if self.libraryloader is None: + if not self._library_loader_imported: return from Qt import QtWidgets @@ -84,17 +75,31 @@ class AvalonModule(OpenPypeModule, ITrayModule): return def show_library_loader(self): - if self.libraryloader is None: - return + if self._library_loader_window is None: + from Qt import QtCore + from openpype.tools.libraryloader import LibraryLoaderWindow + from openpype.pipeline import install_openpype_plugins - self.libraryloader.show() + libraryloader = LibraryLoaderWindow( + show_projects=True, + show_libraries=True + ) + # Remove always on top flag for tray + window_flags = libraryloader.windowFlags() + if window_flags | QtCore.Qt.WindowStaysOnTopHint: + window_flags ^= QtCore.Qt.WindowStaysOnTopHint + libraryloader.setWindowFlags(window_flags) + self._library_loader_window = libraryloader + + install_openpype_plugins() + + self._library_loader_window.show() # Raise and activate the window # for MacOS - self.libraryloader.raise_() + self._library_loader_window.raise_() # for Windows - self.libraryloader.activateWindow() - self.libraryloader.refresh() + self._library_loader_window.activateWindow() # Webserver module implementation def webserver_initialization(self, server_manager): diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index b73b415128..328e16205c 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -16,8 +16,6 @@ from openpype.tools.utils.assets_widget import MultiSelectAssetsWidget from openpype.modules import ModulesManager -from . import lib - module = sys.modules[__name__] module.window = None @@ -260,14 +258,6 @@ class LibraryLoaderWindow(QtWidgets.QDialog): self.dbcon.Session["AVALON_PROJECT"] = project_name - _config = lib.find_config() - if hasattr(_config, "install"): - _config.install() - else: - print( - "Config `%s` has no function `install`" % _config.__name__ - ) - self._subsets_widget.on_project_change(project_name) if self._repres_widget: self._repres_widget.on_project_change(project_name) diff --git a/openpype/tools/libraryloader/lib.py b/openpype/tools/libraryloader/lib.py deleted file mode 100644 index 182b48893a..0000000000 --- a/openpype/tools/libraryloader/lib.py +++ /dev/null @@ -1,21 +0,0 @@ -import os -import importlib -import logging - -log = logging.getLogger(__name__) - - -# `find_config` from `pipeline` -def find_config(): - log.info("Finding configuration for project..") - - config = os.environ["AVALON_CONFIG"] - - if not config: - raise EnvironmentError( - "No configuration found in " - "the project nor environment" - ) - - log.info("Found %s, loading.." % config) - return importlib.import_module(config) From 4364cd55c39e686348818ff0ea1b4de49631e396 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 1 Apr 2022 19:42:07 +0200 Subject: [PATCH 11/39] cleaned up openpype init file --- openpype/__init__.py | 97 -------------------------------------------- 1 file changed, 97 deletions(-) diff --git a/openpype/__init__.py b/openpype/__init__.py index 7fc7e63e61..810664707a 100644 --- a/openpype/__init__.py +++ b/openpype/__init__.py @@ -1,102 +1,5 @@ -# -*- coding: utf-8 -*- -"""Pype module.""" import os -import platform -import logging - -from .settings import get_project_settings -from .lib import ( - Anatomy, - filter_pyblish_plugins, - change_timer_to_current_context, - register_event_callback, -) - -log = logging.getLogger(__name__) PACKAGE_DIR = os.path.dirname(os.path.abspath(__file__)) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") - -# Global plugin paths -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "load") - - -def install(): - """Install OpenPype to Avalon.""" - import avalon.api - import pyblish.api - from pyblish.lib import MessageHandler - from openpype.modules import load_modules - from openpype.pipeline import ( - register_loader_plugin_path, - register_inventory_action, - register_creator_plugin_path, - ) - - # Make sure modules are loaded - load_modules() - - def modified_emit(obj, record): - """Method replacing `emit` in Pyblish's MessageHandler.""" - record.msg = record.getMessage() - obj.records.append(record) - - MessageHandler.emit = modified_emit - - log.info("Registering global plug-ins..") - pyblish.api.register_plugin_path(PUBLISH_PATH) - pyblish.api.register_discovery_filter(filter_pyblish_plugins) - register_loader_plugin_path(LOAD_PATH) - - project_name = os.environ.get("AVALON_PROJECT") - - # Register studio specific plugins - if project_name: - anatomy = Anatomy(project_name) - anatomy.set_root_environments() - avalon.api.register_root(anatomy.roots) - - project_settings = get_project_settings(project_name) - platform_name = platform.system().lower() - project_plugins = ( - project_settings - .get("global", {}) - .get("project_plugins", {}) - .get(platform_name) - ) or [] - for path in project_plugins: - try: - path = str(path.format(**os.environ)) - except KeyError: - pass - - if not path or not os.path.exists(path): - continue - - pyblish.api.register_plugin_path(path) - register_loader_plugin_path(path) - register_creator_plugin_path(path) - register_inventory_action(path) - - # apply monkey patched discover to original one - log.info("Patching discovery") - - register_event_callback("taskChanged", _on_task_change) - - -def _on_task_change(): - change_timer_to_current_context() - - -def uninstall(): - """Uninstall Pype from Avalon.""" - import pyblish.api - from openpype.pipeline import deregister_loader_plugin_path - - log.info("Deregistering global plug-ins..") - pyblish.api.deregister_plugin_path(PUBLISH_PATH) - pyblish.api.deregister_discovery_filter(filter_pyblish_plugins) - deregister_loader_plugin_path(LOAD_PATH) - log.info("Global plug-ins unregistred") From 8ec4d9c8d4bc203c820910ac3b5bd879cfa4b210 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 4 Apr 2022 10:59:43 +0200 Subject: [PATCH 12/39] remove irrelevant comment --- openpype/hosts/celaction/api/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/hosts/celaction/api/cli.py b/openpype/hosts/celaction/api/cli.py index 85e210f21a..ef73c7457a 100644 --- a/openpype/hosts/celaction/api/cli.py +++ b/openpype/hosts/celaction/api/cli.py @@ -71,7 +71,6 @@ def main(): _prepare_publish_environments() # Registers pype's Global pyblish plugins - # - use fake host install_openpype_plugins() if os.path.exists(PUBLISH_PATH): From c8a886d6ce575f1cedccecd1429876746bbaf0a1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 4 Apr 2022 17:52:23 +0200 Subject: [PATCH 13/39] added install_openpype_plugins into load cli --- openpype/tools/loader/app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 23c0909f2b..ab57f63c38 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -5,6 +5,7 @@ from avalon import api, io from openpype import style from openpype.lib import register_event_callback +from openpype.pipeline import install_openpype_plugins from openpype.tools.utils import ( lib, PlaceholderLineEdit @@ -608,4 +609,6 @@ def cli(args): # Store settings api.Session["AVALON_PROJECT"] = project + install_openpype_plugins() + show() From 578a0469c9a487948494f30a036bc14b8882323d Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 4 Apr 2022 17:57:27 +0200 Subject: [PATCH 14/39] pass project name to plugin install --- openpype/tools/loader/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index ab57f63c38..fad284d82b 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -609,6 +609,6 @@ def cli(args): # Store settings api.Session["AVALON_PROJECT"] = project - install_openpype_plugins() + install_openpype_plugins(project) show() From 905eccdc4197cdf0db4c2dfdbcca86619736ef02 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 6 Apr 2022 13:58:53 +0200 Subject: [PATCH 15/39] fixed registered host callbacks --- openpype/hosts/flame/startup/openpype_in_flame.py | 9 +++++---- .../hosts/houdini/plugins/publish/collect_inputs.py | 5 +++-- .../houdini/plugins/publish/increment_current_file.py | 4 ++-- openpype/hosts/houdini/plugins/publish/save_scene.py | 5 +++-- openpype/hosts/maya/api/lib.py | 5 +++-- openpype/hosts/photoshop/api/pipeline.py | 4 ++-- openpype/hosts/tvpaint/plugins/load/load_workfile.py | 5 +++-- openpype/lib/avalon_context.py | 3 ++- openpype/pipeline/create/context.py | 2 +- openpype/pipeline/create/legacy_create.py | 3 ++- .../plugins/publish/collect_scene_loaded_versions.py | 5 +++-- openpype/scripts/fusion_switch_shot.py | 3 ++- openpype/tools/mayalookassigner/commands.py | 11 +++++++---- openpype/tools/mayalookassigner/vray_proxies.py | 5 +++-- openpype/tools/publisher/control.py | 8 +++++--- openpype/tools/sceneinventory/model.py | 9 ++++++--- openpype/tools/subsetmanager/model.py | 4 ++-- openpype/tools/subsetmanager/window.py | 9 ++++----- openpype/tools/workfiles/app.py | 3 ++- 19 files changed, 60 insertions(+), 42 deletions(-) diff --git a/openpype/hosts/flame/startup/openpype_in_flame.py b/openpype/hosts/flame/startup/openpype_in_flame.py index 7015abc7f4..779143cfb3 100644 --- a/openpype/hosts/flame/startup/openpype_in_flame.py +++ b/openpype/hosts/flame/startup/openpype_in_flame.py @@ -4,17 +4,18 @@ from Qt import QtWidgets from pprint import pformat import atexit -import avalon import openpype.hosts.flame.api as opfapi -from openpype.pipeline import install_host +from openpype.pipeline import ( + install_host, + registered_host, +) def openpype_install(): """Registering OpenPype in context """ install_host(opfapi) - print("Avalon registered hosts: {}".format( - avalon.api.registered_host())) + print("Avalon registered hosts: {}".format(registered_host())) # Exception handler diff --git a/openpype/hosts/houdini/plugins/publish/collect_inputs.py b/openpype/hosts/houdini/plugins/publish/collect_inputs.py index 39e2737e8c..8c7098c710 100644 --- a/openpype/hosts/houdini/plugins/publish/collect_inputs.py +++ b/openpype/hosts/houdini/plugins/publish/collect_inputs.py @@ -1,6 +1,7 @@ -import avalon.api as api import pyblish.api +from openpype.pipeline import registered_host + def collect_input_containers(nodes): """Collect containers that contain any of the node in `nodes`. @@ -18,7 +19,7 @@ def collect_input_containers(nodes): lookup = frozenset(nodes) containers = [] - host = api.registered_host() + host = registered_host() for container in host.ls(): node = container["node"] diff --git a/openpype/hosts/houdini/plugins/publish/increment_current_file.py b/openpype/hosts/houdini/plugins/publish/increment_current_file.py index 31c2954ee7..c5cacd1880 100644 --- a/openpype/hosts/houdini/plugins/publish/increment_current_file.py +++ b/openpype/hosts/houdini/plugins/publish/increment_current_file.py @@ -1,8 +1,8 @@ import pyblish.api -import avalon.api from openpype.api import version_up from openpype.action import get_errored_plugins_from_data +from openpype.pipeline import registered_host class IncrementCurrentFile(pyblish.api.InstancePlugin): @@ -41,7 +41,7 @@ class IncrementCurrentFile(pyblish.api.InstancePlugin): ) # Filename must not have changed since collecting - host = avalon.api.registered_host() + host = registered_host() current_file = host.current_file() assert ( context.data["currentFile"] == current_file diff --git a/openpype/hosts/houdini/plugins/publish/save_scene.py b/openpype/hosts/houdini/plugins/publish/save_scene.py index fe5962fbd3..6128c7af77 100644 --- a/openpype/hosts/houdini/plugins/publish/save_scene.py +++ b/openpype/hosts/houdini/plugins/publish/save_scene.py @@ -1,5 +1,6 @@ import pyblish.api -import avalon.api + +from openpype.pipeline import registered_host class SaveCurrentScene(pyblish.api.ContextPlugin): @@ -12,7 +13,7 @@ class SaveCurrentScene(pyblish.api.ContextPlugin): def process(self, context): # Filename must not have changed since collecting - host = avalon.api.registered_host() + host = registered_host() current_file = host.current_file() assert context.data['currentFile'] == current_file, ( "Collected filename from current scene name." diff --git a/openpype/hosts/maya/api/lib.py b/openpype/hosts/maya/api/lib.py index 92fc5133a9..3364e75769 100644 --- a/openpype/hosts/maya/api/lib.py +++ b/openpype/hosts/maya/api/lib.py @@ -26,6 +26,7 @@ from openpype.pipeline import ( loaders_from_representation, get_representation_path, load_container, + registered_host, ) from .commands import reset_frame_range @@ -1574,7 +1575,7 @@ def assign_look_by_version(nodes, version_id): "name": "json"}) # See if representation is already loaded, if so reuse it. - host = api.registered_host() + host = registered_host() representation_id = str(look_representation['_id']) for container in host.ls(): if (container['loader'] == "LookLoader" and @@ -2612,7 +2613,7 @@ def get_attr_in_layer(attr, layer): def fix_incompatible_containers(): """Backwards compatibility: old containers to use new ReferenceLoader""" - host = api.registered_host() + host = registered_host() for container in host.ls(): loader = container['loader'] diff --git a/openpype/hosts/photoshop/api/pipeline.py b/openpype/hosts/photoshop/api/pipeline.py index 7fdaa61b40..1f069c2636 100644 --- a/openpype/hosts/photoshop/api/pipeline.py +++ b/openpype/hosts/photoshop/api/pipeline.py @@ -3,7 +3,6 @@ from Qt import QtWidgets from bson.objectid import ObjectId import pyblish.api -import avalon.api from avalon import io from openpype.api import Logger @@ -14,6 +13,7 @@ from openpype.pipeline import ( deregister_loader_plugin_path, deregister_creator_plugin_path, AVALON_CONTAINER_ID, + registered_host, ) import openpype.hosts.photoshop @@ -33,7 +33,7 @@ def check_inventory(): if not lib.any_outdated(): return - host = avalon.api.registered_host() + host = registered_host() outdated_containers = [] for container in host.ls(): representation = container['representation'] diff --git a/openpype/hosts/tvpaint/plugins/load/load_workfile.py b/openpype/hosts/tvpaint/plugins/load/load_workfile.py index d224cfc390..1ce5449065 100644 --- a/openpype/hosts/tvpaint/plugins/load/load_workfile.py +++ b/openpype/hosts/tvpaint/plugins/load/load_workfile.py @@ -1,12 +1,13 @@ import os -from avalon import api, io +from avalon import io from openpype.lib import ( StringTemplate, get_workfile_template_key_from_context, get_workdir_data, get_last_workfile_with_version, ) +from openpype.pipeline import registered_host from openpype.api import Anatomy from openpype.hosts.tvpaint.api import lib, pipeline, plugin @@ -22,7 +23,7 @@ class LoadWorkfile(plugin.Loader): def load(self, context, name, namespace, options): # Load context of current workfile as first thing # - which context and extension has - host = api.registered_host() + host = registered_host() current_file = host.current_file() context = pipeline.get_current_workfile_context() diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 0348d88be2..e82dcc558f 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -161,9 +161,10 @@ def is_latest(representation): @with_avalon def any_outdated(): """Return whether the current scene has any outdated content""" + from openpype.pipeline import registered_host checked = set() - host = avalon.api.registered_host() + host = registered_host() for container in host.ls(): representation = container['representation'] if representation in checked: diff --git a/openpype/pipeline/create/context.py b/openpype/pipeline/create/context.py index 3efdb0e5c3..0cc2819172 100644 --- a/openpype/pipeline/create/context.py +++ b/openpype/pipeline/create/context.py @@ -356,7 +356,7 @@ class CreatedInstance: already existing instance. creator(BaseCreator): Creator responsible for instance. host(ModuleType): Host implementation loaded with - `avalon.api.registered_host`. + `openpype.pipeline.registered_host`. new(bool): Is instance new. """ # Keys that can't be changed or removed from data after loading using diff --git a/openpype/pipeline/create/legacy_create.py b/openpype/pipeline/create/legacy_create.py index cf6629047e..46e0e3d663 100644 --- a/openpype/pipeline/create/legacy_create.py +++ b/openpype/pipeline/create/legacy_create.py @@ -142,7 +142,8 @@ def legacy_create(Creator, name, asset, options=None, data=None): Name of instance """ - from avalon.api import registered_host + from openpype.pipeline import registered_host + host = registered_host() plugin = Creator(name, asset, options, data) diff --git a/openpype/plugins/publish/collect_scene_loaded_versions.py b/openpype/plugins/publish/collect_scene_loaded_versions.py index 6746757e5f..e54592abb8 100644 --- a/openpype/plugins/publish/collect_scene_loaded_versions.py +++ b/openpype/plugins/publish/collect_scene_loaded_versions.py @@ -1,7 +1,8 @@ from bson.objectid import ObjectId import pyblish.api -from avalon import api, io +from avalon import io +from openpype.pipeline import registered_host class CollectSceneLoadedVersions(pyblish.api.ContextPlugin): @@ -24,7 +25,7 @@ class CollectSceneLoadedVersions(pyblish.api.ContextPlugin): ] def process(self, context): - host = api.registered_host() + host = registered_host() if host is None: self.log.warn("No registered host.") return diff --git a/openpype/scripts/fusion_switch_shot.py b/openpype/scripts/fusion_switch_shot.py index 6db8ff36a8..85a5821c6e 100644 --- a/openpype/scripts/fusion_switch_shot.py +++ b/openpype/scripts/fusion_switch_shot.py @@ -9,6 +9,7 @@ import avalon.fusion # Config imports import openpype.lib as pype +from openpype.pipeline import registered_host import openpype.hosts.fusion.lib as fusion_lib from openpype.lib.avalon_context import get_workdir_from_session @@ -176,7 +177,7 @@ def switch(asset_name, filepath=None, new=True): current_comp = fusion.LoadComp(filepath, quiet=True) assert current_comp is not None, "Fusion could not load '%s'" % filepath - host = api.registered_host() + host = registered_host() containers = list(host.ls()) assert containers, "Nothing to update" diff --git a/openpype/tools/mayalookassigner/commands.py b/openpype/tools/mayalookassigner/commands.py index 78fd51c7a3..8fd592d347 100644 --- a/openpype/tools/mayalookassigner/commands.py +++ b/openpype/tools/mayalookassigner/commands.py @@ -5,9 +5,12 @@ import os from bson.objectid import ObjectId import maya.cmds as cmds -from avalon import io, api +from avalon import io -from openpype.pipeline import remove_container +from openpype.pipeline import ( + remove_container, + registered_host, +) from openpype.hosts.maya.api import lib from .vray_proxies import get_alembic_ids_cache @@ -79,7 +82,7 @@ def get_all_asset_nodes(): list: list of dictionaries """ - host = api.registered_host() + host = registered_host() nodes = [] for container in host.ls(): @@ -192,7 +195,7 @@ def remove_unused_looks(): """ - host = api.registered_host() + host = registered_host() unused = [] for container in host.ls(): diff --git a/openpype/tools/mayalookassigner/vray_proxies.py b/openpype/tools/mayalookassigner/vray_proxies.py index 25621fc652..c97664f3cb 100644 --- a/openpype/tools/mayalookassigner/vray_proxies.py +++ b/openpype/tools/mayalookassigner/vray_proxies.py @@ -11,13 +11,14 @@ from bson.objectid import ObjectId import alembic.Abc from maya import cmds -from avalon import io, api +from avalon import io from openpype.pipeline import ( load_container, loaders_from_representation, discover_loader_plugins, get_representation_path, + registered_host, ) from openpype.hosts.maya.api import lib @@ -188,7 +189,7 @@ def load_look(version_id): "name": "ma"}) # See if representation is already loaded, if so reuse it. - host = api.registered_host() + host = registered_host() representation_id = str(look_representation['_id']) for container in host.ls(): if (container['loader'] == "LookLoader" and diff --git a/openpype/tools/publisher/control.py b/openpype/tools/publisher/control.py index 6707feac9c..2973d6a5bb 100644 --- a/openpype/tools/publisher/control.py +++ b/openpype/tools/publisher/control.py @@ -11,10 +11,12 @@ try: except Exception: from openpype.lib.python_2_comp import WeakMethod -import avalon.api import pyblish.api -from openpype.pipeline import PublishValidationError +from openpype.pipeline import ( + PublishValidationError, + registered_host, +) from openpype.pipeline.create import CreateContext from Qt import QtCore @@ -353,7 +355,7 @@ class PublisherController: """ def __init__(self, dbcon=None, headless=False): self.log = logging.getLogger("PublisherController") - self.host = avalon.api.registered_host() + self.host = registered_host() self.headless = headless self.create_context = CreateContext( diff --git a/openpype/tools/sceneinventory/model.py b/openpype/tools/sceneinventory/model.py index 091d6ca925..f8fd8a911a 100644 --- a/openpype/tools/sceneinventory/model.py +++ b/openpype/tools/sceneinventory/model.py @@ -7,8 +7,11 @@ from Qt import QtCore, QtGui import qtawesome from bson.objectid import ObjectId -from avalon import api, io, schema -from openpype.pipeline import HeroVersionType +from avalon import io, schema +from openpype.pipeline import ( + HeroVersionType, + registered_host, +) from openpype.style import get_default_entity_icon_color from openpype.tools.utils.models import TreeModel, Item from openpype.modules import ModulesManager @@ -181,7 +184,7 @@ class InventoryModel(TreeModel): def refresh(self, selected=None, items=None): """Refresh the model""" - host = api.registered_host() + host = registered_host() if not items: # for debugging or testing, injecting items from outside items = host.ls() diff --git a/openpype/tools/subsetmanager/model.py b/openpype/tools/subsetmanager/model.py index b76c3c2343..760a167b42 100644 --- a/openpype/tools/subsetmanager/model.py +++ b/openpype/tools/subsetmanager/model.py @@ -2,7 +2,7 @@ import uuid from Qt import QtCore, QtGui -from avalon import api +from openpype.pipeline import registered_host ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 @@ -21,7 +21,7 @@ class InstanceModel(QtGui.QStandardItemModel): self._instances_by_item_id = {} instances = None - host = api.registered_host() + host = registered_host() list_instances = getattr(host, "list_instances", None) if list_instances: instances = list_instances() diff --git a/openpype/tools/subsetmanager/window.py b/openpype/tools/subsetmanager/window.py index a53af52174..6314e67015 100644 --- a/openpype/tools/subsetmanager/window.py +++ b/openpype/tools/subsetmanager/window.py @@ -4,9 +4,8 @@ import sys from Qt import QtWidgets, QtCore import qtawesome -from avalon import api - from openpype import style +from openpype.pipeline import registered_host from openpype.tools.utils import PlaceholderLineEdit from openpype.tools.utils.lib import ( iter_model_rows, @@ -106,7 +105,7 @@ class SubsetManagerWindow(QtWidgets.QDialog): self._details_widget.set_details(container, item_id) def _on_save(self): - host = api.registered_host() + host = registered_host() if not hasattr(host, "save_instances"): print("BUG: Host does not have \"save_instances\" method") return @@ -141,7 +140,7 @@ class SubsetManagerWindow(QtWidgets.QDialog): # Prepare menu menu = QtWidgets.QMenu(self) actions = [] - host = api.registered_host() + host = registered_host() if hasattr(host, "remove_instance"): action = QtWidgets.QAction("Remove instance", menu) action.setData(host.remove_instance) @@ -176,7 +175,7 @@ class SubsetManagerWindow(QtWidgets.QDialog): self._details_widget.set_details(None, None) self._model.refresh() - host = api.registered_host() + host = registered_host() dev_mode = os.environ.get("AVALON_DEVELOP_MODE") or "" editable = False if dev_mode.lower() in ("1", "yes", "true", "on"): diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index f0e7900cf5..38e1911060 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -3,6 +3,7 @@ import logging from avalon import api +from openpype.pipeline import registered_host from openpype.tools.utils import qt_app_context from .window import Window @@ -47,7 +48,7 @@ def show(root=None, debug=False, parent=None, use_context=True, save=True): except (AttributeError, RuntimeError): pass - host = api.registered_host() + host = registered_host() validate_host_requirements(host) if debug: From 2cd10be1557ff7600b44417179d4cfed2f2a8ea3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 6 Apr 2022 14:00:36 +0200 Subject: [PATCH 16/39] fixed registered host in workfiles tool --- openpype/tools/workfiles/files_widget.py | 3 ++- openpype/tools/workfiles/save_as_dialog.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openpype/tools/workfiles/files_widget.py b/openpype/tools/workfiles/files_widget.py index 56af7752da..bb2ded3b94 100644 --- a/openpype/tools/workfiles/files_widget.py +++ b/openpype/tools/workfiles/files_widget.py @@ -18,6 +18,7 @@ from openpype.lib.avalon_context import ( update_current_task, compute_session_changes ) +from openpype.pipeline import registered_host from .model import ( WorkAreaFilesModel, PublishFilesModel, @@ -93,7 +94,7 @@ class FilesWidget(QtWidgets.QWidget): # This is not root but workfile directory self._workfiles_root = None self._workdir_path = None - self.host = api.registered_host() + self.host = registered_host() # Whether to automatically select the latest modified # file on a refresh of the files model. diff --git a/openpype/tools/workfiles/save_as_dialog.py b/openpype/tools/workfiles/save_as_dialog.py index f5ae393d0f..0a7c7821ba 100644 --- a/openpype/tools/workfiles/save_as_dialog.py +++ b/openpype/tools/workfiles/save_as_dialog.py @@ -11,6 +11,7 @@ from openpype.lib import ( get_last_workfile_with_version, get_workdir_data, ) +from openpype.pipeline import registered_host from openpype.tools.utils import PlaceholderLineEdit log = logging.getLogger(__name__) @@ -65,7 +66,7 @@ class CommentMatcher(object): return # Create a regex group for extensions - extensions = api.registered_host().file_extensions() + extensions = registered_host().file_extensions() any_extension = "(?:{})".format( "|".join(re.escape(ext[1:]) for ext in extensions) ) @@ -200,7 +201,7 @@ class SaveAsDialog(QtWidgets.QDialog): self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) self.result = None - self.host = api.registered_host() + self.host = registered_host() self.root = root self.work_file = None self._extensions = extensions From d41e99cb345bb3407e5e1af5d05de981f1a49795 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 6 Apr 2022 14:14:48 +0200 Subject: [PATCH 17/39] Fix - added recursive configuration for alternative sites --- .../modules/sync_server/sync_server_module.py | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index 7126c17e17..d2f341786c 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -229,6 +229,7 @@ class SyncServerModule(OpenPypeModule, ITrayModule): attached_sites[remote_site] = create_metadata(remote_site, created=False) + attached_sites = self._add_alternative_sites(attached_sites) # add skeleton for sites where it should be always synced to # usually it would be a backup site which is handled by separate # background process @@ -236,8 +237,6 @@ class SyncServerModule(OpenPypeModule, ITrayModule): if site not in attached_sites: attached_sites[site] = create_metadata(site, created=False) - attached_sites = self._add_alternative_sites(attached_sites) - return list(attached_sites.values()) def _get_always_accessible_sites(self, project_name): @@ -264,9 +263,11 @@ class SyncServerModule(OpenPypeModule, ITrayModule): """ additional_sites = self.sync_system_settings.get("sites", {}) + alt_site_pairs = self._get_alt_site_pairs(additional_sites) + for site_name, site_info in additional_sites.items(): # Get alternate sites (stripped names) for this site name - alt_sites = site_info.get("alternative_sites", []) + alt_sites = alt_site_pairs.get(site_name) alt_sites = [site.strip() for site in alt_sites] alt_sites = set(alt_sites) @@ -289,6 +290,44 @@ class SyncServerModule(OpenPypeModule, ITrayModule): return attached_sites + def _get_alt_site_pairs(self, conf_sites): + """Returns dict of site and its alternative sites. + + If `site` has alternative site, it means that alt_site has 'site' as + alternative site + Args: + conf_sites (dict) + Returns: + (dict): {'site': [alternative sites]...} + """ + alt_site_pairs = {} + for site_name, site_info in conf_sites.items(): + alt_sites = set(site_info.get("alternative_sites", [])) + if not alt_site_pairs.get(site_name): + alt_site_pairs[site_name] = [] + + alt_site_pairs[site_name].extend(alt_sites) + + for alt_site in alt_sites: + if not alt_site_pairs.get(alt_site): + alt_site_pairs[alt_site] = [] + alt_site_pairs[alt_site].extend([site_name]) + + # transitive relationship, eg site is alternative to another which is + # alternative to nex site + loop = True + while loop: + loop = False + for site, alt_sites in alt_site_pairs.items(): + for alt_site in alt_sites: + for alt_alt_site in alt_site_pairs.get(alt_site, []): + if ( alt_alt_site != site + and alt_alt_site not in alt_sites): + alt_site_pairs[site].append(alt_alt_site) + loop = True + + return alt_site_pairs + def clear_project(self, collection, site_name): """ Clear 'collection' of 'site_name' and its local files From b3767433733c07d7a89ef53f2b62edf9c09fc37e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 6 Apr 2022 14:15:38 +0200 Subject: [PATCH 18/39] Fix - moved conftest to be applicable for all kind of tests --- tests/{integration => }/conftest.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/{integration => }/conftest.py (100%) diff --git a/tests/integration/conftest.py b/tests/conftest.py similarity index 100% rename from tests/integration/conftest.py rename to tests/conftest.py From 586a429beabec5b7c71ee44ba6896f383ae4a2e6 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 6 Apr 2022 14:15:56 +0200 Subject: [PATCH 19/39] Added basic test for alternate site method --- .../modules/sync_server/test_module_api.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 tests/unit/openpype/modules/sync_server/test_module_api.py diff --git a/tests/unit/openpype/modules/sync_server/test_module_api.py b/tests/unit/openpype/modules/sync_server/test_module_api.py new file mode 100644 index 0000000000..377045e229 --- /dev/null +++ b/tests/unit/openpype/modules/sync_server/test_module_api.py @@ -0,0 +1,59 @@ +"""Test file for Sync Server, tests API methods, currently for integrate_new + + File: + creates temporary directory and downloads .zip file from GDrive + unzips .zip file + uses content of .zip file (MongoDB's dumps) to import to new databases + with use of 'monkeypatch_session' modifies required env vars + temporarily + runs battery of tests checking that site operation for Sync Server + module are working + removes temporary folder + removes temporary databases (?) +""" +import pytest + +import sys, os + +os.environ["OPENPYPE_MONGO"] = "mongodb://localhost:27017" +os.environ["AVALON_MONGO"] = "mongodb://localhost:27017" +os.environ["OPENPYPE_DATABASE_NAME"] = "openpype" +os.environ["AVALON_TIMEOUT"] = '3000' +os.environ["OPENPYPE_DEBUG"] = "3" + +os.environ["AVALON_PROJECT"] = "petr_test" +os.environ["AVALON_DB"] = "avalon" +os.environ["QT_PREFERRED_BINDING"] = "PySide2" +os.environ["QT_VERBOSE"] = "true" + +from tests.lib.testing_classes import ModuleUnitTest + + +class TestModuleApi(ModuleUnitTest): + + REPRESENTATION_ID = "60e578d0c987036c6a7b741d" + + TEST_FILES = [("1eCwPljuJeOI8A3aisfOIBKKjcmIycTEt", + "test_site_operations.zip", '')] + + @pytest.fixture(scope="module") + def setup_sync_server_module(self, dbcon): + """Get sync_server_module from ModulesManager""" + from openpype.modules import ModulesManager + + manager = ModulesManager() + sync_server = manager.modules_by_name["sync_server"] + yield sync_server + + def test_get_alt_site_pairs(self, setup_sync_server_module): + conf_sites = {'SFTP': {"alternative_sites": ["studio"]}, + "studio2": {"alternative_sites": ["studio"]}} + + ret = setup_sync_server_module._get_alt_site_pairs(conf_sites) + expected = {"SFTP": ["studio", "studio2"], + "studio": ["SFTP", "studio2"], + "studio2": ["studio", "SFTP"]} + assert ret == expected, "Not matching result" + + +test_case = TestModuleApi() From cadd5d1e5db0f5cc18ac231cb0287a11ee7b4fe5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 6 Apr 2022 15:02:42 +0200 Subject: [PATCH 20/39] fix registered host in AE host --- openpype/hosts/aftereffects/api/pipeline.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/openpype/hosts/aftereffects/api/pipeline.py b/openpype/hosts/aftereffects/api/pipeline.py index 94bc369856..4953b19ced 100644 --- a/openpype/hosts/aftereffects/api/pipeline.py +++ b/openpype/hosts/aftereffects/api/pipeline.py @@ -15,6 +15,7 @@ from openpype.pipeline import ( deregister_loader_plugin_path, deregister_creator_plugin_path, AVALON_CONTAINER_ID, + registered_host, ) import openpype.hosts.aftereffects from openpype.lib import register_event_callback @@ -37,7 +38,7 @@ def check_inventory(): if not lib.any_outdated(): return - host = pyblish.api.registered_host() + host = registered_host() outdated_containers = [] for container in host.ls(): representation = container['representation'] @@ -54,12 +55,12 @@ def check_inventory(): # Warn about outdated containers. print("Starting new QApplication..") app = QtWidgets.QApplication(sys.argv) - - message_box = QtWidgets.QMessageBox() - message_box.setIcon(QtWidgets.QMessageBox.Warning) - msg = "There are outdated containers in the scene." - message_box.setText(msg) - message_box.exec_() + if outdated_containers: + message_box = QtWidgets.QMessageBox() + message_box.setIcon(QtWidgets.QMessageBox.Warning) + msg = "There are outdated containers in the scene." + message_box.setText(msg) + message_box.exec_() def application_launch(): From 91c461a1f761fa206906fa3531b74f9afd2762be Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 6 Apr 2022 15:03:27 +0200 Subject: [PATCH 21/39] change registering logs --- openpype/hosts/flame/startup/openpype_in_flame.py | 2 +- openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/flame/startup/openpype_in_flame.py b/openpype/hosts/flame/startup/openpype_in_flame.py index 779143cfb3..f2ac23b19e 100644 --- a/openpype/hosts/flame/startup/openpype_in_flame.py +++ b/openpype/hosts/flame/startup/openpype_in_flame.py @@ -15,7 +15,7 @@ def openpype_install(): """Registering OpenPype in context """ install_host(opfapi) - print("Avalon registered hosts: {}".format(registered_host())) + print("Registered host: {}".format(registered_host())) # Exception handler diff --git a/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py b/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py index aa98563785..de8fc4b3b4 100644 --- a/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py +++ b/openpype/hosts/fusion/utility_scripts/__OpenPype_Menu__.py @@ -17,7 +17,7 @@ def main(env): # activate resolve from pype install_host(api) - log.info(f"Avalon registered hosts: {registered_host()}") + log.info(f"Registered host: {registered_host()}") menu.launch_openpype_menu() From a2a2d5e193798783f1be34d38820c16ece48d404 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 6 Apr 2022 15:41:30 +0200 Subject: [PATCH 22/39] removed repeated logic of any_outdata from after effects --- openpype/hosts/aftereffects/api/pipeline.py | 25 +++++---------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/openpype/hosts/aftereffects/api/pipeline.py b/openpype/hosts/aftereffects/api/pipeline.py index 4953b19ced..3ed2de0e9d 100644 --- a/openpype/hosts/aftereffects/api/pipeline.py +++ b/openpype/hosts/aftereffects/api/pipeline.py @@ -38,29 +38,14 @@ def check_inventory(): if not lib.any_outdated(): return - host = registered_host() - outdated_containers = [] - for container in host.ls(): - representation = container['representation'] - representation_doc = io.find_one( - { - "_id": ObjectId(representation), - "type": "representation" - }, - projection={"parent": True} - ) - if representation_doc and not lib.is_latest(representation_doc): - outdated_containers.append(container) - # Warn about outdated containers. print("Starting new QApplication..") app = QtWidgets.QApplication(sys.argv) - if outdated_containers: - message_box = QtWidgets.QMessageBox() - message_box.setIcon(QtWidgets.QMessageBox.Warning) - msg = "There are outdated containers in the scene." - message_box.setText(msg) - message_box.exec_() + message_box = QtWidgets.QMessageBox() + message_box.setIcon(QtWidgets.QMessageBox.Warning) + msg = "There are outdated containers in the scene." + message_box.setText(msg) + message_box.exec_() def application_launch(): From 8fde20646bc440e40d949d36bce941e80392f885 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 7 Apr 2022 10:25:40 +0200 Subject: [PATCH 23/39] Hound --- openpype/modules/sync_server/sync_server_module.py | 4 ++-- .../openpype/modules/sync_server/test_module_api.py | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index d2f341786c..0a70830255 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -265,7 +265,7 @@ class SyncServerModule(OpenPypeModule, ITrayModule): alt_site_pairs = self._get_alt_site_pairs(additional_sites) - for site_name, site_info in additional_sites.items(): + for site_name in additional_sites.keys(): # Get alternate sites (stripped names) for this site name alt_sites = alt_site_pairs.get(site_name) alt_sites = [site.strip() for site in alt_sites] @@ -321,7 +321,7 @@ class SyncServerModule(OpenPypeModule, ITrayModule): for site, alt_sites in alt_site_pairs.items(): for alt_site in alt_sites: for alt_alt_site in alt_site_pairs.get(alt_site, []): - if ( alt_alt_site != site + if (alt_alt_site != site and alt_alt_site not in alt_sites): alt_site_pairs[site].append(alt_alt_site) loop = True diff --git a/tests/unit/openpype/modules/sync_server/test_module_api.py b/tests/unit/openpype/modules/sync_server/test_module_api.py index 377045e229..b6ba2a01b6 100644 --- a/tests/unit/openpype/modules/sync_server/test_module_api.py +++ b/tests/unit/openpype/modules/sync_server/test_module_api.py @@ -13,19 +13,6 @@ """ import pytest -import sys, os - -os.environ["OPENPYPE_MONGO"] = "mongodb://localhost:27017" -os.environ["AVALON_MONGO"] = "mongodb://localhost:27017" -os.environ["OPENPYPE_DATABASE_NAME"] = "openpype" -os.environ["AVALON_TIMEOUT"] = '3000' -os.environ["OPENPYPE_DEBUG"] = "3" - -os.environ["AVALON_PROJECT"] = "petr_test" -os.environ["AVALON_DB"] = "avalon" -os.environ["QT_PREFERRED_BINDING"] = "PySide2" -os.environ["QT_VERBOSE"] = "true" - from tests.lib.testing_classes import ModuleUnitTest From 43a68681d6fa71254158006fb642074da51205c4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 8 Apr 2022 12:21:00 +0200 Subject: [PATCH 24/39] Refactor - changed logic to loop through alt sites --- .../modules/sync_server/sync_server_module.py | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index 0a70830255..ebdcffdab7 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -313,18 +313,23 @@ class SyncServerModule(OpenPypeModule, ITrayModule): alt_site_pairs[alt_site] = [] alt_site_pairs[alt_site].extend([site_name]) - # transitive relationship, eg site is alternative to another which is - # alternative to nex site - loop = True - while loop: - loop = False - for site, alt_sites in alt_site_pairs.items(): - for alt_site in alt_sites: - for alt_alt_site in alt_site_pairs.get(alt_site, []): - if (alt_alt_site != site - and alt_alt_site not in alt_sites): - alt_site_pairs[site].append(alt_alt_site) - loop = True + for site_name, alt_sites in alt_site_pairs.items(): + sites_queue = deque(alt_sites) + while sites_queue: + alt_site = sites_queue.popleft() + + # safety against wrong config + # {"SFTP": {"alternative_site": "SFTP"} + if alt_site == site_name or alt_site not in alt_site_pairs: + continue + + for alt_alt_site in alt_site_pairs[alt_site]: + if ( + alt_alt_site != site_name + and alt_alt_site not in alt_sites + ): + alt_sites.append(alt_alt_site) + sites_queue.append(alt_alt_site) return alt_site_pairs @@ -992,6 +997,11 @@ class SyncServerModule(OpenPypeModule, ITrayModule): if self.enabled and sync_settings.get('enabled'): sites.append(self.LOCAL_SITE) + active_site = sync_settings["config"]["active_site"] + # for Tray running background process + if active_site not in sites and active_site == get_local_site_id(): + sites.append(active_site) + return sites def tray_init(self): From e0db71ba07edafe3e23caf01c77d0101df47c337 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 8 Apr 2022 16:57:01 +0200 Subject: [PATCH 25/39] Refactor - changed to defaultdict --- openpype/modules/sync_server/sync_server_module.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index ebdcffdab7..596aeb8b39 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -4,7 +4,7 @@ from datetime import datetime import threading import platform import copy -from collections import deque +from collections import deque, defaultdict from avalon.api import AvalonMongoDB @@ -300,18 +300,13 @@ class SyncServerModule(OpenPypeModule, ITrayModule): Returns: (dict): {'site': [alternative sites]...} """ - alt_site_pairs = {} + alt_site_pairs = defaultdict(list) for site_name, site_info in conf_sites.items(): alt_sites = set(site_info.get("alternative_sites", [])) - if not alt_site_pairs.get(site_name): - alt_site_pairs[site_name] = [] - alt_site_pairs[site_name].extend(alt_sites) for alt_site in alt_sites: - if not alt_site_pairs.get(alt_site): - alt_site_pairs[alt_site] = [] - alt_site_pairs[alt_site].extend([site_name]) + alt_site_pairs[alt_site].append(site_name) for site_name, alt_sites in alt_site_pairs.items(): sites_queue = deque(alt_sites) From fe3758581bbbd2f3249ebccdc20e30aa613a071b Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Mon, 11 Apr 2022 14:55:59 +0200 Subject: [PATCH 26/39] disable maintain selection on unreal creator plugin --- openpype/hosts/unreal/api/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/unreal/api/plugin.py b/openpype/hosts/unreal/api/plugin.py index b24bab831d..d8d2f2420d 100644 --- a/openpype/hosts/unreal/api/plugin.py +++ b/openpype/hosts/unreal/api/plugin.py @@ -10,6 +10,7 @@ from openpype.pipeline import ( class Creator(LegacyCreator): """This serves as skeleton for future OpenPype specific functionality""" defaults = ['Main'] + maintain_selection = False class Loader(LoaderPlugin, ABC): From 30cc08c1da6fe4e5a9b3656d4bd875be209d47b5 Mon Sep 17 00:00:00 2001 From: jrsndlr Date: Tue, 12 Apr 2022 14:57:02 +0200 Subject: [PATCH 27/39] Embed YouTube videos --- website/docs/artist_hosts_nuke_tut.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/website/docs/artist_hosts_nuke_tut.md b/website/docs/artist_hosts_nuke_tut.md index eefb213dd2..77d9d27d1b 100644 --- a/website/docs/artist_hosts_nuke_tut.md +++ b/website/docs/artist_hosts_nuke_tut.md @@ -144,6 +144,8 @@ This tool will append all available subsets into an actual node graph. It will l This QuickStart is short introduction to what OpenPype can do for you. It attempts to make an overview for compositing artists, and simplifies processes that are better described in specific parts of the documentation. + + ### Launch Nuke - Shot and Task Context OpenPype has to know what shot and task you are working on. You need to run Nuke in context of the task, using Ftrack Action or OpenPype Launcher to select the task and run Nuke. @@ -315,6 +317,8 @@ Main disadvantage of this approach is that you can render only one version of yo When making quick farm publishes, like making two versions with different color correction, care must be taken to let the first job (first version) completely finish before the second version starts rendering. + + ### Managing Versions ![Versionless](assets/nuke_tut/nuke_ManageVersion.png) @@ -331,7 +335,11 @@ Use Manage to switch versions for loaded assets. If your Pyblish dialog fails on Validate Containers, you might have an old asset loaded. Use OpenPype - Manage... to switch the asset(s) to the latest version. + + ### Fixing Validate Version If your Pyblish dialog fails on Validate Version, you might be trying to publish already published version. Rise your version in the OpenPype WorkFiles SaveAs. -Or maybe you accidentally copied write node from different shot to your current one. Check the write publishes on the left side of the Pyblish dialog. Typically you publish only one write. Locate and delete the stray write from other shot. \ No newline at end of file +Or maybe you accidentally copied write node from different shot to your current one. Check the write publishes on the left side of the Pyblish dialog. Typically you publish only one write. Locate and delete the stray write from other shot. + + From 4b3412e6dd000199810a85a6c868d35651572535 Mon Sep 17 00:00:00 2001 From: jrsndlr Date: Tue, 12 Apr 2022 15:33:37 +0200 Subject: [PATCH 28/39] More videos --- website/docs/artist_hosts_hiero.md | 11 ++++++++++ website/docs/artist_hosts_nuke_tut.md | 30 +++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/website/docs/artist_hosts_hiero.md b/website/docs/artist_hosts_hiero.md index f516c3a6e0..dc6f1696e7 100644 --- a/website/docs/artist_hosts_hiero.md +++ b/website/docs/artist_hosts_hiero.md @@ -94,6 +94,8 @@ This tool will set any defined colorspace definition from OpenPype `Settings / P With OpenPype, you can use Hiero/NKS as a starting point for creating a project's **shots** as *assets* from timeline clips with its *hierarchycal parents* like **episodes**, **sequences**, **folders**, and its child **tasks**. Most importantly it will create **versions** of plate *subsets*, with or without **reference video**. Publishig is naturally creating clip's **thumbnails** and assigns it to shot *asset*. Hiero is also publishing **audio** *subset* and various **soft-effects** either as retiming component as part of published plates or **color-tranformations**, that will be evailable later on for compositor artists to use either as *viewport input-process* or *loaded nodes* in graph editor.



+ + ### Preparing timeline for conversion to instances Because we don't support on-fly data conversion so in case of working with raw camera sources or some other formats which need to be converted for 2D/3D work. We suggest to convert those before and reconform the timeline. Before any clips in timeline could be converted to publishable instances we recommend following. 1. Merge all tracks which supposed to be one and they are multiply only because of editor's style @@ -191,3 +193,12 @@ If you wish to change any individual properties of the shot then you are able to + +### Publishing Effects from Hiero to Nuke +This video shows a way to publish shot look as effect from Hiero to Nuke. + + + +### Assembling edit from published shot versions + + diff --git a/website/docs/artist_hosts_nuke_tut.md b/website/docs/artist_hosts_nuke_tut.md index 77d9d27d1b..296fdf44d5 100644 --- a/website/docs/artist_hosts_nuke_tut.md +++ b/website/docs/artist_hosts_nuke_tut.md @@ -89,6 +89,8 @@ This menu item will set correct Colorspace definitions for you. All has to be co - set preview LUT to your viewers - set correct colorspace to all discovered Read nodes (following expression set in settings) +See [Nuke Color Management](artist_hosts_nuke_tut.md#nuke-color-management) +
@@ -144,7 +146,7 @@ This tool will append all available subsets into an actual node graph. It will l This QuickStart is short introduction to what OpenPype can do for you. It attempts to make an overview for compositing artists, and simplifies processes that are better described in specific parts of the documentation. - + ### Launch Nuke - Shot and Task Context OpenPype has to know what shot and task you are working on. You need to run Nuke in context of the task, using Ftrack Action or OpenPype Launcher to select the task and run Nuke. @@ -228,6 +230,11 @@ This will create a Group with a Write node inside. You can configure write node parameters in **Studio Settings → Project → Anatomy → Color Management and Output Formats → Nuke → Nodes** ::: +### Create Prerender Node +Creating Prerender is very similar to creating OpenPype managed Write node. + + + #### What Nuke Publish Does From Artist perspective, Nuke publish gathers all the stuff found in the Nuke script with Publish checkbox set to on, exports stuff and raises the Nuke script (workfile) version. @@ -317,7 +324,7 @@ Main disadvantage of this approach is that you can render only one version of yo When making quick farm publishes, like making two versions with different color correction, care must be taken to let the first job (first version) completely finish before the second version starts rendering. - + ### Managing Versions @@ -327,19 +334,30 @@ OpenPype checks all the assets loaded to Nuke on script open. All out of date as Use Manage to switch versions for loaded assets. +### Loading Effects +This video show how to publish effect from Hiero / Nuke Studio, and use the effect in Nuke. + + + + + +### Nuke Color Management + + + ## Troubleshooting ### Fixing Validate Containers -![Versionless](assets/nuke_tut/nuke_ValidateContainers.png) - If your Pyblish dialog fails on Validate Containers, you might have an old asset loaded. Use OpenPype - Manage... to switch the asset(s) to the latest version. - +![Versionless](assets/nuke_tut/nuke_ValidateContainers.png) + + ### Fixing Validate Version If your Pyblish dialog fails on Validate Version, you might be trying to publish already published version. Rise your version in the OpenPype WorkFiles SaveAs. Or maybe you accidentally copied write node from different shot to your current one. Check the write publishes on the left side of the Pyblish dialog. Typically you publish only one write. Locate and delete the stray write from other shot. - + From 9306314a1bd805ce8d64937e70526cfbc8c91d1e Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 12 Apr 2022 17:48:20 +0100 Subject: [PATCH 29/39] Update collect_render.py Better error message for non selected render camera edge case. --- openpype/hosts/maya/plugins/publish/collect_render.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index a525b562f3..7791169791 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -194,11 +194,13 @@ class CollectMayaRender(pyblish.api.ContextPlugin): assert render_products, "no render products generated" exp_files = [] multipart = False + render_cameras = [] for product in render_products: if product.multipart: multipart = True product_name = product.productName if product.camera and layer_render_products.has_camera_token(): + render_cameras.append(product.camera) product_name = "{}{}".format( product.camera, "_" + product_name if product_name else "") @@ -208,6 +210,8 @@ class CollectMayaRender(pyblish.api.ContextPlugin): product) }) + assert render_cameras, "No render cameras found." + self.log.info("multipart: {}".format( multipart)) assert exp_files, "no file names were generated, this is bug" From 432f1264066f7286ec1dd4a3d1e3ccfbf2903046 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 12 Apr 2022 17:51:51 +0100 Subject: [PATCH 30/39] Update collect_render.py Hound --- openpype/hosts/maya/plugins/publish/collect_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index 7791169791..154f0376ae 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -211,7 +211,7 @@ class CollectMayaRender(pyblish.api.ContextPlugin): }) assert render_cameras, "No render cameras found." - + self.log.info("multipart: {}".format( multipart)) assert exp_files, "no file names were generated, this is bug" From a5dd9f4e0e1822b2314dbf9c13a0cd2e1abb034b Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Tue, 12 Apr 2022 18:55:57 +0200 Subject: [PATCH 31/39] renamed process_context to context_tools --- openpype/hosts/celaction/api/cli.py | 2 +- openpype/pipeline/__init__.py | 2 +- openpype/pipeline/{process_context.py => context_tools.py} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename openpype/pipeline/{process_context.py => context_tools.py} (100%) diff --git a/openpype/hosts/celaction/api/cli.py b/openpype/hosts/celaction/api/cli.py index ef73c7457a..8c7b3a2e74 100644 --- a/openpype/hosts/celaction/api/cli.py +++ b/openpype/hosts/celaction/api/cli.py @@ -11,7 +11,7 @@ import openpype import openpype.hosts.celaction from openpype.hosts.celaction import api as celaction from openpype.tools.utils import host_tools -from openpype.pipeline.process_context import install_openpype_plugins +from openpype.pipeline import install_openpype_plugins log = Logger().get_logger("Celaction_cli_publisher") diff --git a/openpype/pipeline/__init__.py b/openpype/pipeline/__init__.py index de04548616..308be6da64 100644 --- a/openpype/pipeline/__init__.py +++ b/openpype/pipeline/__init__.py @@ -69,7 +69,7 @@ from .actions import ( deregister_inventory_action_path, ) -from .process_context import ( +from .context_tools import ( install_openpype_plugins, install_host, uninstall_host, diff --git a/openpype/pipeline/process_context.py b/openpype/pipeline/context_tools.py similarity index 100% rename from openpype/pipeline/process_context.py rename to openpype/pipeline/context_tools.py From e4fe82914f2dcb20790f37e13e037f8585984c7d Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Tue, 12 Apr 2022 18:17:36 -0700 Subject: [PATCH 32/39] Add IGG logo to index page. --- website/src/pages/index.js | 5 +++++ website/static/img/igg-logo.png | Bin 0 -> 80982 bytes 2 files changed, 5 insertions(+) create mode 100644 website/static/img/igg-logo.png diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 791b309bbc..d9bbc3eaa0 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -144,6 +144,11 @@ const studios = [ title: "Ember Light", image: "/img/EmberLight_black.png", infoLink: "https://emberlight.se/", + }, + { + title: "IGG Canada", + image: "/img/igg-logo.png", + infoLink: "https://www.igg.com/", } ]; diff --git a/website/static/img/igg-logo.png b/website/static/img/igg-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a169600b758f1486a2f25698341acd8425252d1d GIT binary patch literal 80982 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 W~yss-9u~Hzxp4o=_|1S literal 0 HcmV?d00001 From 4ceaa605c3522dcfadfb8926b6aea31b80a7be62 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Wed, 13 Apr 2022 13:50:31 +0200 Subject: [PATCH 33/39] fix tray publisher installation --- openpype/tools/traypublisher/window.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/tools/traypublisher/window.py b/openpype/tools/traypublisher/window.py index d0453c4f23..a550c88ead 100644 --- a/openpype/tools/traypublisher/window.py +++ b/openpype/tools/traypublisher/window.py @@ -8,8 +8,8 @@ publishing plugins. from Qt import QtWidgets, QtCore -import avalon.api from avalon.api import AvalonMongoDB +from openpype.pipeline import install_host from openpype.hosts.traypublisher import ( api as traypublisher ) @@ -163,7 +163,7 @@ class TrayPublishWindow(PublisherWindow): def main(): - avalon.api.install(traypublisher) + install_host(traypublisher) app = QtWidgets.QApplication([]) window = TrayPublishWindow() window.show() From 2b031ada8aa52c8a924800a84c6dd5b2aeb6440e Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 13 Apr 2022 10:38:03 -0700 Subject: [PATCH 34/39] Update icon to be B/W --- website/static/img/igg-logo.png | Bin 80982 -> 80331 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/website/static/img/igg-logo.png b/website/static/img/igg-logo.png index a169600b758f1486a2f25698341acd8425252d1d..3c7f7718f79ae866bd9f07bd51878f5d2a6eceea 100644 GIT binary patch literal 80331 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 z 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 CA{hw) literal 80982 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 W~yss-9u~Hzxp4o=_|1S From 654d0e3ada68e38cf01f2b5df680be73226b26d8 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 14 Apr 2022 11:30:01 +0200 Subject: [PATCH 35/39] Update tests/unit/openpype/modules/sync_server/test_module_api.py Co-authored-by: Roy Nieterau --- tests/unit/openpype/modules/sync_server/test_module_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/openpype/modules/sync_server/test_module_api.py b/tests/unit/openpype/modules/sync_server/test_module_api.py index b6ba2a01b6..14613604dd 100644 --- a/tests/unit/openpype/modules/sync_server/test_module_api.py +++ b/tests/unit/openpype/modules/sync_server/test_module_api.py @@ -33,7 +33,7 @@ class TestModuleApi(ModuleUnitTest): yield sync_server def test_get_alt_site_pairs(self, setup_sync_server_module): - conf_sites = {'SFTP': {"alternative_sites": ["studio"]}, + conf_sites = {"SFTP": {"alternative_sites": ["studio"]}, "studio2": {"alternative_sites": ["studio"]}} ret = setup_sync_server_module._get_alt_site_pairs(conf_sites) From 8469ac561c0ee651a592119558e97b5fc5a17226 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 14 Apr 2022 12:39:34 +0200 Subject: [PATCH 36/39] fix host install in fusion script --- openpype/scripts/fusion_switch_shot.py | 27 ++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/openpype/scripts/fusion_switch_shot.py b/openpype/scripts/fusion_switch_shot.py index 85a5821c6e..3ba150902e 100644 --- a/openpype/scripts/fusion_switch_shot.py +++ b/openpype/scripts/fusion_switch_shot.py @@ -4,13 +4,16 @@ import sys import logging # Pipeline imports -from avalon import api, io -import avalon.fusion +from avalon import io +from openpype.hosts.fusion import api +import openpype.hosts.fusion.api.lib as fusion_lib # Config imports -import openpype.lib as pype -from openpype.pipeline import registered_host -import openpype.hosts.fusion.lib as fusion_lib +from openpype.lib import version_up +from openpype.pipeline import ( + install_host, + registered_host, +) from openpype.lib.avalon_context import get_workdir_from_session @@ -80,7 +83,7 @@ def _format_filepath(session): # Create new unqiue filepath if os.path.exists(new_filepath): - new_filepath = pype.version_up(new_filepath) + new_filepath = version_up(new_filepath) return new_filepath @@ -103,7 +106,7 @@ def _update_savers(comp, session): comp.Print("New renders to: %s\n" % renders) - with avalon.fusion.comp_lock_and_undo_chunk(comp): + with api.comp_lock_and_undo_chunk(comp): savers = comp.GetToolList(False, "Saver").values() for saver in savers: filepath = saver.GetAttrs("TOOLST_Clip_Name")[1.0] @@ -165,12 +168,12 @@ def switch(asset_name, filepath=None, new=True): # Get current project self._project = io.find_one({ "type": "project", - "name": api.Session["AVALON_PROJECT"] + "name": io.Session["AVALON_PROJECT"] }) # Go to comp if not filepath: - current_comp = avalon.fusion.get_current_comp() + current_comp = api.get_current_comp() assert current_comp is not None, "Could not find current comp" else: fusion = _get_fusion_instance() @@ -195,7 +198,7 @@ def switch(asset_name, filepath=None, new=True): current_comp.Print(message) # Build the session to switch to - switch_to_session = api.Session.copy() + switch_to_session = io.Session.copy() switch_to_session["AVALON_ASSET"] = asset['name'] if new: @@ -204,7 +207,7 @@ def switch(asset_name, filepath=None, new=True): # Update savers output based on new session _update_savers(current_comp, switch_to_session) else: - comp_path = pype.version_up(filepath) + comp_path = version_up(filepath) current_comp.Print(comp_path) @@ -235,7 +238,7 @@ if __name__ == '__main__': args, unknown = parser.parse_args() - api.install(avalon.fusion) + install_host(api) switch(args.asset_name, args.file_path) sys.exit(0) From 0882589209344b672e03b22c87a80b1a9ae64c2c Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 14 Apr 2022 12:41:27 +0200 Subject: [PATCH 37/39] fixed imports --- .../modules/clockify/launcher_actions/ClockifyStart.py | 8 +++++--- .../modules/clockify/launcher_actions/ClockifySync.py | 9 ++++++--- openpype/scripts/non_python_host_launch.py | 2 +- openpype/tools/stdout_broker/window.py | 8 +++++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/openpype/modules/clockify/launcher_actions/ClockifyStart.py b/openpype/modules/clockify/launcher_actions/ClockifyStart.py index db51964eb7..6428d5e7aa 100644 --- a/openpype/modules/clockify/launcher_actions/ClockifyStart.py +++ b/openpype/modules/clockify/launcher_actions/ClockifyStart.py @@ -1,12 +1,14 @@ -from avalon import api, io +from avalon import io + from openpype.api import Logger +from openpype.pipeline import LauncherAction from openpype_modules.clockify.clockify_api import ClockifyAPI -log = Logger().get_logger(__name__) +log = Logger.get_logger(__name__) -class ClockifyStart(api.Action): +class ClockifyStart(LauncherAction): name = "clockify_start_timer" label = "Clockify - Start Timer" diff --git a/openpype/modules/clockify/launcher_actions/ClockifySync.py b/openpype/modules/clockify/launcher_actions/ClockifySync.py index 02982d373a..3c81e2766c 100644 --- a/openpype/modules/clockify/launcher_actions/ClockifySync.py +++ b/openpype/modules/clockify/launcher_actions/ClockifySync.py @@ -1,10 +1,13 @@ -from avalon import api, io +from avalon import io + from openpype_modules.clockify.clockify_api import ClockifyAPI from openpype.api import Logger -log = Logger().get_logger(__name__) +from openpype.pipeline import LauncherAction + +log = Logger.get_logger(__name__) -class ClockifySync(api.Action): +class ClockifySync(LauncherAction): name = "sync_to_clockify" label = "Sync to Clockify" diff --git a/openpype/scripts/non_python_host_launch.py b/openpype/scripts/non_python_host_launch.py index 43921f0483..f795af7bb3 100644 --- a/openpype/scripts/non_python_host_launch.py +++ b/openpype/scripts/non_python_host_launch.py @@ -15,7 +15,7 @@ CURRENT_FILE = os.path.abspath(__file__) def show_error_messagebox(title, message, detail_message=None): """Function will show message and process ends after closing it.""" from Qt import QtWidgets, QtCore - from avalon import style + from openpype import style app = QtWidgets.QApplication([]) app.setStyleSheet(style.load_stylesheet()) diff --git a/openpype/tools/stdout_broker/window.py b/openpype/tools/stdout_broker/window.py index a2190e0491..f5720ca05b 100644 --- a/openpype/tools/stdout_broker/window.py +++ b/openpype/tools/stdout_broker/window.py @@ -1,7 +1,9 @@ -from avalon import style -from Qt import QtWidgets, QtCore -import collections import re +import collections + +from Qt import QtWidgets + +from openpype import style class ConsoleDialog(QtWidgets.QDialog): From 2c1114706721bad0465c7a76a046751c9665b5ff Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Apr 2022 10:15:16 +0200 Subject: [PATCH 38/39] Changed list to set --- openpype/modules/sync_server/sync_server_module.py | 8 ++++---- .../unit/openpype/modules/sync_server/test_module_api.py | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openpype/modules/sync_server/sync_server_module.py b/openpype/modules/sync_server/sync_server_module.py index 596aeb8b39..3744a21b43 100644 --- a/openpype/modules/sync_server/sync_server_module.py +++ b/openpype/modules/sync_server/sync_server_module.py @@ -300,13 +300,13 @@ class SyncServerModule(OpenPypeModule, ITrayModule): Returns: (dict): {'site': [alternative sites]...} """ - alt_site_pairs = defaultdict(list) + alt_site_pairs = defaultdict(set) for site_name, site_info in conf_sites.items(): alt_sites = set(site_info.get("alternative_sites", [])) - alt_site_pairs[site_name].extend(alt_sites) + alt_site_pairs[site_name].update(alt_sites) for alt_site in alt_sites: - alt_site_pairs[alt_site].append(site_name) + alt_site_pairs[alt_site].add(site_name) for site_name, alt_sites in alt_site_pairs.items(): sites_queue = deque(alt_sites) @@ -323,7 +323,7 @@ class SyncServerModule(OpenPypeModule, ITrayModule): alt_alt_site != site_name and alt_alt_site not in alt_sites ): - alt_sites.append(alt_alt_site) + alt_sites.add(alt_alt_site) sites_queue.append(alt_alt_site) return alt_site_pairs diff --git a/tests/unit/openpype/modules/sync_server/test_module_api.py b/tests/unit/openpype/modules/sync_server/test_module_api.py index 14613604dd..b7d3383c0b 100644 --- a/tests/unit/openpype/modules/sync_server/test_module_api.py +++ b/tests/unit/openpype/modules/sync_server/test_module_api.py @@ -37,9 +37,9 @@ class TestModuleApi(ModuleUnitTest): "studio2": {"alternative_sites": ["studio"]}} ret = setup_sync_server_module._get_alt_site_pairs(conf_sites) - expected = {"SFTP": ["studio", "studio2"], - "studio": ["SFTP", "studio2"], - "studio2": ["studio", "SFTP"]} + expected = {"SFTP": {"studio", "studio2"}, + "studio": {"SFTP", "studio2"}, + "studio2": {"studio", "SFTP"}} assert ret == expected, "Not matching result" From 687f769242025413e56908a47611b681186f8162 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 19 Apr 2022 10:23:59 +0200 Subject: [PATCH 39/39] Added more complex test for deeper alternative site tree --- .../modules/sync_server/test_module_api.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/unit/openpype/modules/sync_server/test_module_api.py b/tests/unit/openpype/modules/sync_server/test_module_api.py index b7d3383c0b..a484977758 100644 --- a/tests/unit/openpype/modules/sync_server/test_module_api.py +++ b/tests/unit/openpype/modules/sync_server/test_module_api.py @@ -42,5 +42,23 @@ class TestModuleApi(ModuleUnitTest): "studio2": {"studio", "SFTP"}} assert ret == expected, "Not matching result" + def test_get_alt_site_pairs_deep(self, setup_sync_server_module): + conf_sites = {"A": {"alternative_sites": ["C"]}, + "B": {"alternative_sites": ["C"]}, + "C": {"alternative_sites": ["D"]}, + "D": {"alternative_sites": ["A"]}, + "F": {"alternative_sites": ["G"]}, + "G": {"alternative_sites": ["F"]}, + } + + ret = setup_sync_server_module._get_alt_site_pairs(conf_sites) + expected = {"A": {"B", "C", "D"}, + "B": {"A", "C", "D"}, + "C": {"A", "B", "D"}, + "D": {"A", "B", "C"}, + "F": {"G"}, + "G": {"F"}} + assert ret == expected, "Not matching result" + test_case = TestModuleApi()