From c2167056720a93764eb3f4409350820fba476330 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 16:59:48 +0100 Subject: [PATCH 001/469] Blender: Implement USD extractor and loader --- client/ayon_core/hosts/blender/api/lib.py | 59 ++++++++++++++ client/ayon_core/hosts/blender/api/plugin.py | 3 +- .../blender/plugins/create/create_usd.py | 30 +++++++ .../hosts/blender/plugins/load/load_abc.py | 27 +++++-- .../plugins/publish/collect_instance.py | 2 +- .../blender/plugins/publish/extract_usd.py | 79 +++++++++++++++++++ 6 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 client/ayon_core/hosts/blender/plugins/create/create_usd.py create mode 100644 client/ayon_core/hosts/blender/plugins/publish/extract_usd.py diff --git a/client/ayon_core/hosts/blender/api/lib.py b/client/ayon_core/hosts/blender/api/lib.py index 458a275b51..031a25e791 100644 --- a/client/ayon_core/hosts/blender/api/lib.py +++ b/client/ayon_core/hosts/blender/api/lib.py @@ -365,3 +365,62 @@ def maintained_time(): yield finally: bpy.context.scene.frame_current = current_time + + +def get_all_parents(obj): + """Get all recursive parents of object. + + Arguments: + obj (bpy.types.Object): Object to get all parents for. + + Returns: + List[bpy.types.Object]: All parents of object + + """ + result = [] + while True: + obj = obj.parent + if not obj: + break + result.append(obj) + return result + + +def get_highest_root(objects): + """Get the highest object (the least parents) among the objects. + + If multiple objects have the same amount of parents (or no parents) the + first object found in the input iterable will be returned. + + Note that this will *not* return objects outside of the input list, as + such it will not return the root of node from a child node. It is purely + intended to find the highest object among a list of objects. To instead + get the root from one object use, e.g. `get_all_parents(obj)[-1]` + + Arguments: + objects (List[bpy.types.Object]): Objects to find the highest root in. + + Returns: + Optional[bpy.types.Object]: First highest root found or None if no + `bpy.types.Object` found in input list. + + """ + included_objects = {obj.name_full for obj in objects} + num_parents_to_obj = {} + for obj in objects: + if isinstance(obj, bpy.types.Object): + parents = get_all_parents(obj) + # included parents + parents = [parent for parent in parents if + parent.name_full in included_objects] + if not parents: + # A node without parents must be a highest root + return obj + + num_parents_to_obj.setdefault(len(parents), obj) + + if not num_parents_to_obj: + return + + minimum_parent = min(num_parents_to_obj) + return num_parents_to_obj[minimum_parent] diff --git a/client/ayon_core/hosts/blender/api/plugin.py b/client/ayon_core/hosts/blender/api/plugin.py index 6c9bfb6569..383dd1e5c6 100644 --- a/client/ayon_core/hosts/blender/api/plugin.py +++ b/client/ayon_core/hosts/blender/api/plugin.py @@ -26,7 +26,8 @@ from .ops import ( ) from .lib import imprint -VALID_EXTENSIONS = [".blend", ".json", ".abc", ".fbx"] +VALID_EXTENSIONS = [".blend", ".json", ".abc", ".fbx", + ".usd", ".usdc", ".usda"] def prepare_scene_name( diff --git a/client/ayon_core/hosts/blender/plugins/create/create_usd.py b/client/ayon_core/hosts/blender/plugins/create/create_usd.py new file mode 100644 index 0000000000..2c2d0c46c6 --- /dev/null +++ b/client/ayon_core/hosts/blender/plugins/create/create_usd.py @@ -0,0 +1,30 @@ +"""Create a USD Export.""" + +from ayon_core.hosts.blender.api import plugin, lib + + +class CreateUSD(plugin.BaseCreator): + """Create USD Export""" + + identifier = "io.openpype.creators.blender.usd" + name = "usdMain" + label = "USD" + product_type = "usd" + icon = "gears" + + def create( + self, product_name: str, instance_data: dict, pre_create_data: dict + ): + # Run parent create method + collection = super().create( + product_name, instance_data, pre_create_data + ) + + if pre_create_data.get("use_selection"): + objects = lib.get_selection() + for obj in objects: + collection.objects.link(obj) + if obj.type == 'EMPTY': + objects.extend(obj.children) + + return collection diff --git a/client/ayon_core/hosts/blender/plugins/load/load_abc.py b/client/ayon_core/hosts/blender/plugins/load/load_abc.py index 938ae6106b..877cf0ca49 100644 --- a/client/ayon_core/hosts/blender/plugins/load/load_abc.py +++ b/client/ayon_core/hosts/blender/plugins/load/load_abc.py @@ -26,10 +26,11 @@ class CacheModelLoader(plugin.AssetLoader): Note: At least for now it only supports Alembic files. """ - product_types = {"model", "pointcache", "animation"} - representations = ["abc"] + product_types = {"model", "pointcache", "animation", "usd"} + representations = ["abc", "usd"] - label = "Load Alembic" + # TODO: Should USD loader be a separate loader instead? + label = "Load Alembic/USD" icon = "code-fork" color = "orange" @@ -53,10 +54,21 @@ class CacheModelLoader(plugin.AssetLoader): plugin.deselect_all() relative = bpy.context.preferences.filepaths.use_relative_paths - bpy.ops.wm.alembic_import( - filepath=libpath, - relative_path=relative - ) + + if any(libpath.lower().endswith(ext) + for ext in [".usd", ".usda", ".usdc"]): + # USD + bpy.ops.wm.usd_import( + filepath=libpath, + relative_path=relative + ) + + else: + # Alembic + bpy.ops.wm.alembic_import( + filepath=libpath, + relative_path=relative + ) imported = lib.get_selection() @@ -161,7 +173,6 @@ class CacheModelLoader(plugin.AssetLoader): self._link_objects(objects, asset_group, containers, asset_group) - product_type = context["product"]["productType"] asset_group[AVALON_PROPERTY] = { "schema": "openpype:container-2.0", "id": AVALON_CONTAINER_ID, diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_instance.py b/client/ayon_core/hosts/blender/plugins/publish/collect_instance.py index d47c69a270..314ffd368a 100644 --- a/client/ayon_core/hosts/blender/plugins/publish/collect_instance.py +++ b/client/ayon_core/hosts/blender/plugins/publish/collect_instance.py @@ -12,7 +12,7 @@ class CollectBlenderInstanceData(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder hosts = ["blender"] families = ["model", "pointcache", "animation", "rig", "camera", "layout", - "blendScene"] + "blendScene", "usd"] label = "Collect Instance" def process(self, instance): diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py new file mode 100644 index 0000000000..74d0756133 --- /dev/null +++ b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py @@ -0,0 +1,79 @@ +import os + +import bpy + +from ayon_core.pipeline import publish +from ayon_core.hosts.blender.api import plugin, lib + + +class ExtractUSD(publish.Extractor): + """Extract as USD.""" + + label = "Extract USD" + hosts = ["blender"] + families = ["usd"] + + def process(self, instance): + + # Ignore runtime instances (e.g. USD layers) + # TODO: This is better done via more specific `families` + if not instance.data.get("transientData", {}).get("instance_node"): + return + + # Define extract output file path + stagingdir = self.staging_dir(instance) + filename = f"{instance.name}.usd" + filepath = os.path.join(stagingdir, filename) + + # Perform extraction + self.log.debug("Performing extraction..") + + # Select all members to "export selected" + plugin.deselect_all() + + selected = [] + for obj in instance: + if isinstance(obj, bpy.types.Object): + obj.select_set(True) + selected.append(obj) + + root = lib.get_highest_root(objects=instance[:]) + if not root: + instance_node = instance.data["transientData"]["instance_node"] + raise publish.KnownPublishError( + f"No root object found in instance: {instance_node.name}" + ) + self.log.debug(f"Exporting using active root: {root.name}") + + context = plugin.create_blender_context( + active=root, selected=selected) + + # Export USD + bpy.ops.wm.usd_export( + context, + filepath=filepath, + selected_objects_only=True, + export_textures=False, + relative_paths=False, + export_animation=False, + export_hair=False, + export_uvmaps=True, + # TODO: add for new version of Blender (4+?) + # export_mesh_colors=True, + export_normals=True, + export_materials=True, + use_instancing=True + ) + + plugin.deselect_all() + + # Add representation + representation = { + 'name': 'usd', + 'ext': 'usd', + 'files': filename, + "stagingDir": stagingdir, + } + instance.data.setdefault("representations", []).append(representation) + self.log.debug("Extracted instance '%s' to: %s", + instance.name, representation) From f856f5237c2735eb04663e857ca81677a517f0cd Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 17:07:14 +0100 Subject: [PATCH 002/469] Fix export for recent blender versions --- .../blender/plugins/publish/extract_usd.py | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py index 74d0756133..70092ded7b 100644 --- a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py +++ b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py @@ -49,21 +49,21 @@ class ExtractUSD(publish.Extractor): active=root, selected=selected) # Export USD - bpy.ops.wm.usd_export( - context, - filepath=filepath, - selected_objects_only=True, - export_textures=False, - relative_paths=False, - export_animation=False, - export_hair=False, - export_uvmaps=True, - # TODO: add for new version of Blender (4+?) - # export_mesh_colors=True, - export_normals=True, - export_materials=True, - use_instancing=True - ) + with bpy.context.temp_override(**context): + bpy.ops.wm.usd_export( + filepath=filepath, + selected_objects_only=True, + export_textures=False, + relative_paths=False, + export_animation=False, + export_hair=False, + export_uvmaps=True, + # TODO: add for new version of Blender (4+?) + # export_mesh_colors=True, + export_normals=True, + export_materials=True, + use_instancing=True + ) plugin.deselect_all() From 5660ed58d39ff4755b2db97511c65aaabfe147f7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 17:08:35 +0100 Subject: [PATCH 003/469] Fix refactor --- client/ayon_core/hosts/blender/plugins/load/load_abc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/blender/plugins/load/load_abc.py b/client/ayon_core/hosts/blender/plugins/load/load_abc.py index 877cf0ca49..2fec4cc78b 100644 --- a/client/ayon_core/hosts/blender/plugins/load/load_abc.py +++ b/client/ayon_core/hosts/blender/plugins/load/load_abc.py @@ -173,6 +173,7 @@ class CacheModelLoader(plugin.AssetLoader): self._link_objects(objects, asset_group, containers, asset_group) + product_type = context["product"]["productType"] asset_group[AVALON_PROPERTY] = { "schema": "openpype:container-2.0", "id": AVALON_CONTAINER_ID, From c60bd1cb2df44735ed1ce719f88449928f8d4e4e Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 17:56:29 +0100 Subject: [PATCH 004/469] Fusion: Add Validate Instance in Context validator --- client/ayon_core/hosts/fusion/api/action.py | 52 ++++++++++++ .../publish/validate_instance_in_context.py | 80 +++++++++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py diff --git a/client/ayon_core/hosts/fusion/api/action.py b/client/ayon_core/hosts/fusion/api/action.py index 1643f1ce03..a0c6aafcb5 100644 --- a/client/ayon_core/hosts/fusion/api/action.py +++ b/client/ayon_core/hosts/fusion/api/action.py @@ -58,3 +58,55 @@ class SelectInvalidAction(pyblish.api.Action): self.log.info( "Selecting invalid tools: %s" % ", ".join(sorted(names)) ) + + +class SelectToolAction(pyblish.api.Action): + """Select invalid output tool in Fusion when plug-in failed. + + """ + + label = "Select saver" + on = "failed" # This action is only available on a failed plug-in + icon = "search" # Icon from Awesome Icon + + def process(self, context, plugin): + errored_instances = get_errored_instances_from_context( + context, + plugin=plugin, + ) + + # Get the invalid nodes for the plug-ins + self.log.info("Finding invalid nodes..") + tools = [] + for instance in errored_instances: + + tool = instance.data.get("tool") + if tool is not None: + tools.append(tool) + else: + self.log.warning( + "Plug-in returned to be invalid, " + f"but has no saver for instance {instance.name}." + ) + + if not tools: + # Assume relevant comp is current comp and clear selection + self.log.info("No invalid tools found.") + comp = get_current_comp() + flow = comp.CurrentFrame.FlowView + flow.Select() # No args equals clearing selection + return + + # Assume a single comp + first_tool = tools[0] + comp = first_tool.Comp() + flow = comp.CurrentFrame.FlowView + flow.Select() # No args equals clearing selection + names = set() + for tool in tools: + flow.Select(tool, True) + comp.SetActiveTool(tool) + names.add(tool.Name) + self.log.info( + "Selecting invalid tools: %s" % ", ".join(sorted(names)) + ) diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py b/client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py new file mode 100644 index 0000000000..3aa6fb452f --- /dev/null +++ b/client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +"""Validate if instance context is the same as publish context.""" + +import pyblish.api +from ayon_core.hosts.fusion.api.action import SelectToolAction +from ayon_core.pipeline.publish import ( + RepairAction, + ValidateContentsOrder, + PublishValidationError, + OptionalPyblishPluginMixin +) + + +class ValidateInstanceInContextFusion(pyblish.api.InstancePlugin, + OptionalPyblishPluginMixin): + """Validator to check if instance context matches context of publish. + + When working in per-shot style you always publish data in context of + current asset (shot). This validator checks if this is so. It is optional + so it can be disabled when needed. + """ + # Similar to maya and houdini-equivalent `ValidateInstanceInContext` + + order = ValidateContentsOrder + label = "Instance in same Context" + optional = True + hosts = ["fusion"] + actions = [SelectToolAction, RepairAction] + + def process(self, instance): + if not self.is_active(instance.data): + return + + instance_context = self.get_context(instance.data) + context = self.get_context(instance.context.data) + if instance_context != context: + context_label = "{} > {}".format(*context) + instance_label = "{} > {}".format(*instance_context) + + raise PublishValidationError( + message=( + "Instance '{}' publishes to different asset than current " + "context: {}. Current context: {}".format( + instance.name, instance_label, context_label + ) + ), + description=( + "## Publishing to a different asset\n" + "There are publish instances present which are publishing " + "into a different asset than your current context.\n\n" + "Usually this is not what you want but there can be cases " + "where you might want to publish into another asset or " + "shot. If that's the case you can disable the validation " + "on the instance to ignore it." + ) + ) + + @classmethod + def repair(cls, instance): + + create_context = instance.context.data["create_context"] + instance_id = instance.data.get("instance_id") + created_instance = create_context.get_instance_by_id( + instance_id + ) + if created_instance is None: + raise RuntimeError( + f"No CreatedInstances found with id '{instance_id} " + f"in {create_context.instances_by_id}" + ) + + context_asset, context_task = cls.get_context(instance.context.data) + created_instance["folderPath"] = context_asset + created_instance["task"] = context_task + create_context.save_changes() + + @staticmethod + def get_context(data): + """Return asset, task from publishing context data""" + return data["folderPath"], data["task"] From 7d9ff383096a262bb03b66009802945c974dad8a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 17:57:02 +0100 Subject: [PATCH 005/469] Correctly preserve the instance's task instead of forcing current context task --- client/ayon_core/hosts/fusion/plugins/publish/collect_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py index 36102d02cb..b1ecce728b 100644 --- a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py +++ b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py @@ -53,7 +53,7 @@ class CollectFusionRender( if product_type not in ["render", "image"]: continue - task_name = context.data["task"] + task_name = inst.data["task"] tool = inst.data["transientData"]["tool"] instance_families = inst.data.get("families", []) From d2503fae073113374da76bde5d11a902a055cf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Tue, 26 Mar 2024 11:01:08 +0100 Subject: [PATCH 006/469] :recycle: remove explicit list --- client/ayon_core/plugins/publish/integrate.py | 64 +------------------ 1 file changed, 1 insertion(+), 63 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index ce34f2e88b..5b91d9afb8 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -42,7 +42,7 @@ def prepare_changes(old_entity, new_entity): Returns: dict[str, Any]: Changes that have new entity. - + """ changes = {} for key in set(new_entity.keys()): @@ -108,68 +108,6 @@ class IntegrateAsset(pyblish.api.InstancePlugin): label = "Integrate Asset" order = pyblish.api.IntegratorOrder - families = ["workfile", - "pointcache", - "pointcloud", - "proxyAbc", - "camera", - "animation", - "model", - "maxScene", - "mayaAscii", - "mayaScene", - "setdress", - "layout", - "ass", - "vdbcache", - "scene", - "vrayproxy", - "vrayscene_layer", - "render", - "prerender", - "imagesequence", - "review", - "rendersetup", - "rig", - "plate", - "look", - "ociolook", - "audio", - "yetiRig", - "yeticache", - "nukenodes", - "gizmo", - "source", - "matchmove", - "image", - "assembly", - "fbx", - "gltf", - "textures", - "action", - "harmony.template", - "harmony.palette", - "editorial", - "background", - "camerarig", - "redshiftproxy", - "effect", - "xgen", - "hda", - "usd", - "staticMesh", - "skeletalMesh", - "mvLook", - "mvUsd", - "mvUsdComposition", - "mvUsdOverride", - "online", - "uasset", - "blendScene", - "yeticacheUE", - "tycache" - ] - default_template_name = "publish" # Representation context keys that should always be written to From 4c51f3a560109fa75c50f4104e609f93b4c8f28b Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 26 Mar 2024 17:44:31 +0100 Subject: [PATCH 007/469] Implement fix for losing instance id and disconnected logs in publisher UI --- .../fusion/plugins/publish/collect_render.py | 7 +++++++ .../publish/abstract_collect_render.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py index b1ecce728b..3f5e2837bc 100644 --- a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py +++ b/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py @@ -119,6 +119,13 @@ class CollectFusionRender( instances.append(instance) instances_to_remove.append(inst) + # TODO: Avoid this transfer instance id hack + # pass on the `id` of the original instance so any artist + # facing logs transfer as if they were made on the new instance + # instead, see `AbstractCollectRender.process()` + instance.id = inst.id + instance.instance_id = inst.data.get("instance_id") + for instance in instances_to_remove: context.remove(instance) diff --git a/client/ayon_core/pipeline/publish/abstract_collect_render.py b/client/ayon_core/pipeline/publish/abstract_collect_render.py index 745632ca0a..8b98cb678e 100644 --- a/client/ayon_core/pipeline/publish/abstract_collect_render.py +++ b/client/ayon_core/pipeline/publish/abstract_collect_render.py @@ -215,6 +215,25 @@ class AbstractCollectRender(pyblish.api.ContextPlugin): render_instance_dict = attr.asdict(render_instance) instance = context.create_instance(render_instance.name) + + # TODO: Avoid this transfer instance id hack + # Transfer the id from another instance, e.g. when the render + # instance is intended to "replace" an existing instance like + # fusion does in `CollectRender`. Without matching the ids any + # logs produced for the instance prior to the "replacement" will + # not show artist-facing logs in reports + transfer_id = getattr(render_instance, "id") + if transfer_id: + instance._id = transfer_id + # The `instance_id` data may be overridden on the Creator + # to e.g. maybe make unique by node name instead of uuid, + # like in Maya, Fusion, Houdini integration. + # This transfers that unique (named) instance id. + # This transfer logic is currently (only?) used in Fusion. + transfer_instance_id = getattr(render_instance, "instance_id") + if transfer_instance_id: + instance.data["instance_id"] = transfer_instance_id + instance.data["label"] = render_instance.label instance.data.update(render_instance_dict) instance.data.update(data) From c6d72a6488b1c1588cc753ac831906a41892f067 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 28 Mar 2024 19:01:23 +0000 Subject: [PATCH 008/469] Add render farm button on write nodes. --- client/ayon_core/hosts/nuke/api/lib.py | 26 ++++ client/ayon_core/hosts/nuke/api/utils.py | 166 ++++++++++++++++++++++- 2 files changed, 191 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index 4fcba8d2d4..22428fd657 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1022,6 +1022,16 @@ def script_name(): return nuke.root().knob("name").value() +def add_button_render_farm(node): + name = "renderFarm" + label = "Render Farm" + value = "from ayon_core.hosts.nuke.api.utils import submit_headless_farm;" + value += "submit_headless_farm(nuke.thisNode())" + knob = nuke.PyScript_Knob(name, label, value) + knob.clearFlag(nuke.STARTLINE) + node.addKnob(knob) + + def add_button_write_to_read(node): name = "createReadNode" label = "Read From Rendered" @@ -1144,6 +1154,19 @@ def create_write_node( Return: node (obj): group node with avalon data as Knobs ''' + # Ensure name does not contain any invalid characters. + special_characters = set("!@#$%^&*()=[]{}|\\;',.<>/?~+-") + found_special_characters = [] + + # Check each character in the node name + for char in name: + if char in special_characters: + found_special_characters.append(char) + + msg = f"Special characters found in name \"{name}\": " + msg += f"{' '.join(found_special_characters)}" + assert not found_special_characters, msg + prenodes = prenodes or [] # filtering variables @@ -1268,6 +1291,9 @@ def create_write_node( link.setFlag(0x1000) GN.addKnob(link) + # Adding render farm submission button. + add_button_render_farm(GN) + # adding write to read button add_button_write_to_read(GN) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 1bfc1919fa..5a643d05d8 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -1,11 +1,18 @@ import os import re +import traceback +from datetime import datetime +import shutil import nuke -from ayon_core import resources +from pyblish import util from qtpy import QtWidgets +from ayon_core import resources +from ayon_core.pipeline import registered_host +from ayon_core.tools.utils import show_message_dialog + def set_context_favorites(favorites=None): """ Adding favorite folders to nuke's browser @@ -142,3 +149,160 @@ def is_headless(): bool: headless """ return QtWidgets.QApplication.instance() is None + + +def create_error_report(context): + error_message = "" + success = True + for result in context.data["results"]: + if result["success"]: + continue + + success = False + + err = result["error"] + formatted_traceback = "".join( + traceback.format_exception( + type(err), + err, + err.__traceback__ + ) + ) + fname = result["plugin"].__module__ + if 'File "", line' in formatted_traceback: + _, lineno, func, msg = err.traceback + fname = os.path.abspath(fname) + formatted_traceback = formatted_traceback.replace( + 'File "", line', + 'File "{0}", line'.format(fname) + ) + + err = result["error"] + error_message += "\n" + error_message += formatted_traceback + + return success, error_message + + +def submit_headless_farm(node): + # Ensure code is executed in root context. + if nuke.root() == nuke.thisNode(): + _submit_headless_farm(node) + else: + # If not in root context, move to the root context and then execute the + # code. + with nuke.root(): + _submit_headless_farm(node) + + +def _submit_headless_farm(node): + context = util.collect() + + success, error_report = create_error_report(context) + + if not success: + show_message_dialog( + "Collection Errors", error_report, level="critical" + ) + return + + # Find instance for node and workfile. + instance = None + instance_workfile = None + indexes_to_remove = [] + for count, Instance in enumerate(context): + if Instance.data["family"] == "workfile": + instance_workfile = Instance + continue + + instance_node = Instance.data["transientData"]["node"] + if node.name() == instance_node.name(): + instance = Instance + else: + indexes_to_remove.append(count) + + if instance is None: + show_message_dialog( + "Collection Error", + "Could not find the instance from the node.", + level="critical" + ) + return + + # Enable for farm publishing. + instance.data["farm"] = True + instance.data["transfer"] = False + + # Clear the families as we only want the main family, ei. no review etc. + instance.data["families"] = [] + + # Use the workfile instead of published. + publish_attributes = instance.data["publish_attributes"] + publish_attributes["NukeSubmitDeadline"]["use_published_workfile"] = False + + # Disable version validation. + instance.data.pop("latestVersion") + instance_workfile.data.pop("latestVersion") + + # Remove all other instances. + indexes_to_remove.sort(reverse=True) + for i in indexes_to_remove: + if 0 <= i < len(context): + del context[i] + + # Validate + util.validate(context) + + success, error_report = create_error_report(context) + + if not success: + show_message_dialog( + "Validation Errors", error_report, level="critical" + ) + return + + # Extraction. + util.extract(context) + + success, error_report = create_error_report(context) + + if not success: + show_message_dialog( + "Extraction Errors", error_report, level="critical" + ) + return + + # Save the workfile. + host = registered_host() + host.save_file(host.current_file()) + + # Copy the workfile to a timestamped copy. + current_datetime = datetime.now() + formatted_timestamp = current_datetime.strftime("%Y%m%d%H%M%S") + base, ext = os.path.splitext(host.current_file()) + + directory = os.path.join(os.path.dirname(base), "farm_submissions") + if not os.path.exists(directory): + os.makedirs(directory) + + filename = "{}_{}{}".format( + os.path.basename(base), formatted_timestamp, ext + ) + path = os.path.join(directory, filename).replace("\\", "/") + context.data["currentFile"] = path + shutil.copy(host.current_file(), path) + + # Continue to submission. + util.integrate(context) + + success, error_report = create_error_report(context) + + if not success: + show_message_dialog( + "Extraction Errors", error_report, level="critical" + ) + return + + show_message_dialog( + "Submission Successful", "Submission to the farm was successful." + ) From 941e80dd952864adcd4ba4386d5883434f5cd338 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 15:25:41 +0200 Subject: [PATCH 009/469] Use a general family for houdini farm rendering --- .../plugins/publish/collect_farm_instances.py | 23 +++++++++++++++++++ .../plugins/publish/increment_current_file.py | 4 ++-- .../deadline/plugins/publish/collect_pools.py | 2 +- .../publish/submit_houdini_render_deadline.py | 13 +++++++---- .../plugins/publish/submit_publish_job.py | 2 +- 5 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py new file mode 100644 index 0000000000..9a05ff75dd --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -0,0 +1,23 @@ +import pyblish.api + + +class CollectFarmInstances(pyblish.api.InstancePlugin): + """Collect instances for farm render.""" + + order = pyblish.api.CollectorOrder + families = ["mantra_rop"] + + hosts = ["houdini"] + targets = ["local", "remote"] + label = "Collect farm instances" + + def process(self, instance): + creator_attribute = instance.data["creator_attributes"] + farm_enabled = creator_attribute["farm"] + instance.data["farm"] = farm_enabled + if not farm_enabled: + self.log.debug("Render on farm is disabled. " + "Skipping farm collecting.") + return + + instance.data["families"].append("render.farm.hou") diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index 73145b211a..f94d1f10ed 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.lib import version_up from ayon_core.pipeline import registered_host from ayon_core.pipeline.publish import get_errored_plugins_from_context -from ayon_core.hosts.houdini.api import HoudiniHost + from ayon_core.pipeline.publish import KnownPublishError @@ -20,9 +20,9 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): families = ["workfile", "redshift_rop", "arnold_rop", - "mantra_rop", "karma_rop", "usdrender", + "render.farm.hou", "publish.hou"] optional = True diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 6923c2b16b..62d997eb2c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -43,9 +43,9 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "usdrender", "redshift_rop", "arnold_rop", - "mantra_rop", "karma_rop", "vray_rop", + "render.farm.hou", "publish.hou"] primary_pool = None diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 6952604293..d91fd895ad 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -73,9 +73,9 @@ class HoudiniSubmitDeadline( families = ["usdrender", "redshift_rop", "arnold_rop", - "mantra_rop", "karma_rop", - "vray_rop"] + "vray_rop", + "render.farm.hou"] targets = ["local"] use_published = True @@ -86,7 +86,7 @@ class HoudiniSubmitDeadline( priority = 50 chunk_size = 1 group = "" - + @classmethod def get_attribute_defs(cls): return [ @@ -194,7 +194,7 @@ class HoudiniSubmitDeadline( job_info.Pool = instance.data.get("primaryPool") job_info.SecondaryPool = instance.data.get("secondaryPool") - + if split_render_job and is_export_job: job_info.Priority = attribute_values.get( "export_priority", self.export_priority @@ -265,11 +265,14 @@ class HoudiniSubmitDeadline( # Output driver to render if job_type == "render": product_type = instance.data.get("productType") + rop_node = hou.node(instance.data.get("instance_node")) + node_type = rop_node.type().name() + if product_type == "arnold_rop": plugin_info = ArnoldRenderDeadlinePluginInfo( InputFile=instance.data["ifdFile"] ) - elif product_type == "mantra_rop": + elif node_type == "ifd": plugin_info = MantraRenderDeadlinePluginInfo( SceneFile=instance.data["ifdFile"], Version=hou_major_minor, diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 84bac6d017..82232c70c0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -92,7 +92,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "prerender.farm", "prerender.frames_farm", "renderlayer", "imagesequence", "vrayscene", "maxrender", - "arnold_rop", "mantra_rop", + "arnold_rop", "render.farm.hou", "karma_rop", "vray_rop", "redshift_rop"] From 37cecde8869dc273b1e783efe529b82b570a7794 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:08:03 +0200 Subject: [PATCH 010/469] add few keywords related to Houdini --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ee124ddc2d..5bc11031e2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,7 +92,7 @@ line-ending = "auto" [tool.codespell] # Ignore words that are not in the dictionary. -ignore-words-list = "ayon,ynput" +ignore-words-list = "ayon,ynput,hda,parms" skip = "./.*,./package/*,*/vendor/*,*/unreal/integration/*,*/aftereffects/api/extension/js/libs/*" count = true quiet-level = 3 From 71bf18910c8955523313a947f9be5b8adc5b9ad4 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:09:45 +0200 Subject: [PATCH 011/469] make codespell happy about integrate.py --- client/ayon_core/plugins/publish/integrate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index ce34f2e88b..38169ca2c3 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -42,7 +42,7 @@ def prepare_changes(old_entity, new_entity): Returns: dict[str, Any]: Changes that have new entity. - + """ changes = {} for key in set(new_entity.keys()): @@ -358,7 +358,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): # Compute the resource file infos once (files belonging to the # version instance instead of an individual representation) so - # we can re-use those file infos per representation + # we can reuse those file infos per representation resource_file_infos = self.get_files_info( resource_destinations, anatomy ) From 620538330c10e83ec95a90ec0a59b587ba09b7df Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:10:48 +0200 Subject: [PATCH 012/469] support local rendering for mantra_rop and add dedicated plugins --- .../plugins/create/create_mantra_rop.py | 43 +++++---- .../publish/collect_local_render_instances.py | 88 +++++++++++++++++++ .../publish/extract_mantra_local_render.py | 29 ++++++ .../plugins/publish/increment_current_file.py | 1 + .../validate_split_render_is_disabled.py | 65 ++++++++++++++ client/ayon_core/plugins/publish/integrate.py | 3 +- 6 files changed, 213 insertions(+), 16 deletions(-) create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index f15f49f463..6dac3ff02a 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin to create Mantra ROP.""" from ayon_core.hosts.houdini.api import plugin -from ayon_core.pipeline import CreatedInstance -from ayon_core.lib import EnumDef, BoolDef +from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef class CreateMantraROP(plugin.HoudiniCreator): @@ -23,12 +22,14 @@ class CreateMantraROP(plugin.HoudiniCreator): # Add chunk size attribute instance_data["chunkSize"] = 10 # Submit for job publishing - instance_data["farm"] = pre_create_data.get("farm") + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + creator_attributes["farm"] = pre_create_data.get("farm") instance = super(CreateMantraROP, self).create( product_name, instance_data, - pre_create_data) # type: CreatedInstance + pre_create_data) instance_node = hou.node(instance.get("instance_node")) @@ -78,21 +79,14 @@ class CreateMantraROP(plugin.HoudiniCreator): to_lock = ["productType", "id"] self.lock_parameters(instance_node, to_lock) - def get_pre_create_attr_defs(self): - attrs = super(CreateMantraROP, self).get_pre_create_attr_defs() - + def get_instance_attr_defs(self): image_format_enum = [ "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] - return attrs + [ - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("export_job", - label="Split export and render jobs", - default=self.export_job), + return [ + UILabelDef(label="Mantra Render Settings:"), EnumDef("image_format", image_format_enum, default="exr", @@ -101,5 +95,24 @@ class CreateMantraROP(plugin.HoudiniCreator): label="Override Camera Resolution", tooltip="Override the current camera " "resolution, recommended for IPR.", - default=False) + default=False), + UISeparatorDef(key="1"), + UILabelDef(label="Farm Render Options:"), + BoolDef("farm", + label="Submitting to Farm", + default=True), + BoolDef("export_job", + label="Split export and render jobs", + default=self.export_job), + UISeparatorDef(key="2"), + UILabelDef(label="Local Render Options:"), + BoolDef("skip_render", + label="Skip Render", + tooltip="Enable this option to skip render which publish existing frames.", + default=False), ] + + def get_pre_create_attr_defs(self): + attrs = super(CreateMantraROP, self).get_pre_create_attr_defs() + + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py new file mode 100644 index 0000000000..6b55bfffa4 --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -0,0 +1,88 @@ +import os +import pyblish.api + + +class CollectLocalRenderInstances(pyblish.api.InstancePlugin): + """Collect instances for local render. + + Agnostic Local Render Collector. + """ + + # this plugin runs after Collect Render Products + order = pyblish.api.CollectorOrder + 0.12 + families = ["mantra_rop"] + + hosts = ["houdini"] + targets = ["local", "remote"] + label = "Collect local render instances" + + def process(self, instance): + creator_attribute = instance.data["creator_attributes"] + farm_enabled = creator_attribute["farm"] + instance.data["farm"] = farm_enabled + if farm_enabled: + self.log.debug("Render on farm is enabled. " + "Skipping local render collecting.") + return + + # Create Instance for each AOV. + context = instance.context + expectedFiles = next(iter(instance.data["expectedFiles"]), {}) + + product_type = "render" # is always render + product_group = "render{Task}{productName}".format( + Task=self._capitalize(instance.data["task"]), + productName=self._capitalize(instance.data["productName"]) + ) # is always the group + + for aov_name, aov_filepaths in expectedFiles.items(): + # Some AOV instance data + # label = "{productName}_{AOV}".format( + # AOV=aov_name, + # productName=instance.data["productName"] + # ) + product_name = "render{Task}{productName}_{AOV}".format( + Task=self._capitalize(instance.data["task"]), + productName=self._capitalize(instance.data["productName"]), + AOV=aov_name + ) + + # Create instance for each AOV + aov_instance = context.create_instance(product_name) + + # Prepare Representation for each AOV + aov_filenames = [os.path.basename(path) for path in aov_filepaths] + staging_dir = os.path.dirname(aov_filepaths[0]) + ext = aov_filepaths[0].split(".")[-1] + + aov_instance.data.update({ + # 'label': label, + "task": instance.data["task"], + "folderPath": instance.data["folderPath"], + "frameStart": instance.data["frameStartHandle"], + "frameEnd": instance.data["frameEndHandle"], + "productType": product_type, + "productName": product_name, + "productGroup": product_group, + "tags": [], + "families": ["render.local.hou"], + "instance_node": instance.data["instance_node"], + "representations": [ + { + "stagingDir": staging_dir, + "ext": ext, + "name": ext, + "files": aov_filenames, + "frameStart": instance.data["frameStartHandle"], + "frameEnd": instance.data["frameEndHandle"] + } + ] + }) + + # Remove Mantra instance + # I can't remove it here as I still need it to trigger the render. + # context.remove(instance) + + @staticmethod + def _capitalize(word): + return word[:1].upper() + word[1:] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py new file mode 100644 index 0000000000..bb78f6b1ee --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py @@ -0,0 +1,29 @@ +import pyblish.api + +from ayon_core.pipeline import publish +from ayon_core.hosts.houdini.api.lib import render_rop +import hou + + +class ExtractMantraLocalRender(publish.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract Mantra Local Render" + hosts = ["houdini"] + families = ["mantra_rop"] + targets = ["local", "remote"] + + def process(self, instance): + if instance.data.get("farm"): + self.log.debug("Should be processed on farm, skipping.") + return + + creator_attribute = instance.data["creator_attributes"] + skip_render = creator_attribute["skip_render"] + + if skip_render: + self.log.debug("Skip render is enabled, skipping rendering.") + return + + ropnode = hou.node(instance.data.get("instance_node")) + render_rop(ropnode) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index f94d1f10ed..199843bc14 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -23,6 +23,7 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): "karma_rop", "usdrender", "render.farm.hou", + "render.local.hou", "publish.hou"] optional = True diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py new file mode 100644 index 0000000000..2d7a95e817 --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +import pyblish.api +import hou +from ayon_core.pipeline import PublishValidationError +from ayon_core.pipeline.publish import RepairAction + + +class DisableSplitExportAction(RepairAction): + label = "Disable Split Export" + + +class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): + """Validate the Instance has no current cooking errors.""" + + order = pyblish.api.ValidatorOrder + hosts = ["houdini"] + families = ["mantra_rop"] + label = "Validate Split Export Is Disabled" + actions = [DisableSplitExportAction] + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + nodes = [n.path() for n in invalid] + raise PublishValidationError( + "See log for details. " + "Invalid nodes: {0}".format(nodes) + ) + + + @classmethod + def get_invalid(cls, instance): + + invalid = [] + rop_node = hou.node(instance.data["instance_node"]) + + creator_attribute = instance.data["creator_attributes"] + farm_enabled = creator_attribute["farm"] + if farm_enabled: + cls.log.debug( + "Farm is enabled, skipping validation." + ) + return + + + split_enabled = creator_attribute["export_job"] + if split_enabled: + invalid.append(rop_node) + cls.log.error( + "Split Export must be disabled in local render instances." + ) + + return invalid + + @classmethod + def repair(cls, instance): + + create_context = instance.context.data["create_context"] + created_instance = create_context.get_instance_by_id( + instance.data["instance_id"]) + creator_attributes = created_instance["creator_attributes"] + # Disable export_job + creator_attributes["export_job"] = False + create_context.save_changes() diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index 38169ca2c3..ea24112831 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -167,7 +167,8 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "uasset", "blendScene", "yeticacheUE", - "tycache" + "tycache", + "render.local.hou" ] default_template_name = "publish" From b35bc8c9d55b7b064f9d9b81cb0184c37925705a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:18:15 +0200 Subject: [PATCH 013/469] remove redundant code --- .../ayon_core/hosts/houdini/plugins/create/create_karma_rop.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index 9eb9d80cd3..e91ddbc0ac 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin to create Karma ROP.""" from ayon_core.hosts.houdini.api import plugin -from ayon_core.pipeline import CreatedInstance from ayon_core.lib import BoolDef, EnumDef, NumberDef @@ -25,7 +24,7 @@ class CreateKarmaROP(plugin.HoudiniCreator): instance = super(CreateKarmaROP, self).create( product_name, instance_data, - pre_create_data) # type: CreatedInstance + pre_create_data) instance_node = hou.node(instance.get("instance_node")) From 068b9c3f4ec721d6404c5c26e78b6d03f5ae40aa Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:32:43 +0200 Subject: [PATCH 014/469] support local rendering for karma_rop --- .../plugins/create/create_karma_rop.py | 24 ++++++++++++------- .../plugins/publish/collect_farm_instances.py | 3 ++- .../publish/collect_local_render_instances.py | 3 ++- .../publish/extract_mantra_local_render.py | 7 +++--- .../plugins/publish/increment_current_file.py | 1 - .../deadline/plugins/publish/collect_pools.py | 1 - .../publish/submit_houdini_render_deadline.py | 1 - .../plugins/publish/submit_publish_job.py | 2 +- 8 files changed, 25 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index e91ddbc0ac..c791cfe647 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin to create Karma ROP.""" from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import BoolDef, EnumDef, NumberDef +from ayon_core.lib import BoolDef, EnumDef, NumberDef, UISeparatorDef, UILabelDef class CreateKarmaROP(plugin.HoudiniCreator): @@ -18,8 +18,6 @@ class CreateKarmaROP(plugin.HoudiniCreator): instance_data.update({"node_type": "karma"}) # Add chunk size attribute instance_data["chunkSize"] = 10 - # Submit for job publishing - instance_data["farm"] = pre_create_data.get("farm") instance = super(CreateKarmaROP, self).create( product_name, @@ -86,15 +84,13 @@ class CreateKarmaROP(plugin.HoudiniCreator): to_lock = ["productType", "id"] self.lock_parameters(instance_node, to_lock) - def get_pre_create_attr_defs(self): - attrs = super(CreateKarmaROP, self).get_pre_create_attr_defs() - + def get_instance_attr_defs(self): image_format_enum = [ "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] - return attrs + [ + return [ BoolDef("farm", label="Submitting to Farm", default=True), @@ -112,5 +108,17 @@ class CreateKarmaROP(plugin.HoudiniCreator): decimals=0), BoolDef("cam_res", label="Camera Resolution", - default=False) + default=False), + UISeparatorDef(key="2"), + UILabelDef(label="Local Render Options:"), + BoolDef("skip_render", + label="Skip Render", + tooltip="Enable this option to skip render which publish existing frames.", + default=False), ] + + + def get_pre_create_attr_defs(self): + attrs = super(CreateKarmaROP, self).get_pre_create_attr_defs() + + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index 9a05ff75dd..61894da98e 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -5,7 +5,8 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): """Collect instances for farm render.""" order = pyblish.api.CollectorOrder - families = ["mantra_rop"] + families = ["mantra_rop", + "karma_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 6b55bfffa4..e94e1187d7 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -10,7 +10,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # this plugin runs after Collect Render Products order = pyblish.api.CollectorOrder + 0.12 - families = ["mantra_rop"] + families = ["mantra_rop", + "karma_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py index bb78f6b1ee..a7967435c9 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py @@ -5,12 +5,13 @@ from ayon_core.hosts.houdini.api.lib import render_rop import hou -class ExtractMantraLocalRender(publish.Extractor): +class ExtractLocalRender(publish.Extractor): order = pyblish.api.ExtractorOrder - label = "Extract Mantra Local Render" + label = "Extract Local Render" hosts = ["houdini"] - families = ["mantra_rop"] + families = ["mantra_rop", + "karma_rop"] targets = ["local", "remote"] def process(self, instance): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index 199843bc14..5885fd8643 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -20,7 +20,6 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): families = ["workfile", "redshift_rop", "arnold_rop", - "karma_rop", "usdrender", "render.farm.hou", "render.local.hou", diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 62d997eb2c..bb556c2b9d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -43,7 +43,6 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "usdrender", "redshift_rop", "arnold_rop", - "karma_rop", "vray_rop", "render.farm.hou", "publish.hou"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index d91fd895ad..b433151b34 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -73,7 +73,6 @@ class HoudiniSubmitDeadline( families = ["usdrender", "redshift_rop", "arnold_rop", - "karma_rop", "vray_rop", "render.farm.hou"] targets = ["local"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 82232c70c0..69f626b602 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -93,7 +93,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "renderlayer", "imagesequence", "vrayscene", "maxrender", "arnold_rop", "render.farm.hou", - "karma_rop", "vray_rop", + "vray_rop", "redshift_rop"] aov_filter = [ From 5dd571dc2140601823f6fdf3c9da6a875eaebcce Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 16:33:48 +0200 Subject: [PATCH 015/469] algin file name to class name --- .../{extract_mantra_local_render.py => extract_local_render.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/ayon_core/hosts/houdini/plugins/publish/{extract_mantra_local_render.py => extract_local_render.py} (100%) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_local_render.py rename to client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py From e8907b00c171a6c6d76ebff009335aeeb83ab026 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 17:02:13 +0200 Subject: [PATCH 016/469] add parm to cspell ignore list --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5bc11031e2..58f07f0fa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,7 +92,7 @@ line-ending = "auto" [tool.codespell] # Ignore words that are not in the dictionary. -ignore-words-list = "ayon,ynput,hda,parms" +ignore-words-list = "ayon,ynput,hda,parms,parm" skip = "./.*,./package/*,*/vendor/*,*/unreal/integration/*,*/aftereffects/api/extension/js/libs/*" count = true quiet-level = 3 From 313a7a2456a680b659999436924140afca18d2fc Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 17:02:26 +0200 Subject: [PATCH 017/469] support local rendering for redshift_rop --- .../plugins/create/create_redshift_rop.py | 38 ++++++++++++------- .../plugins/publish/collect_farm_instances.py | 3 +- .../publish/collect_local_render_instances.py | 3 +- .../plugins/publish/extract_local_render.py | 3 +- .../plugins/publish/increment_current_file.py | 1 - .../validate_split_render_is_disabled.py | 7 ++-- .../deadline/plugins/publish/collect_pools.py | 1 - .../publish/submit_houdini_render_deadline.py | 3 +- .../plugins/publish/submit_publish_job.py | 3 +- 9 files changed, 36 insertions(+), 26 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index 1cd239e929..f6d42419f9 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -4,7 +4,7 @@ import hou # noqa from ayon_core.pipeline import CreatorError from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef, BoolDef +from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef class CreateRedshiftROP(plugin.HoudiniCreator): @@ -26,8 +26,6 @@ class CreateRedshiftROP(plugin.HoudiniCreator): instance_data.update({"node_type": "Redshift_ROP"}) # Add chunk size attribute instance_data["chunkSize"] = 10 - # Submit for job publishing - instance_data["farm"] = pre_create_data.get("farm") instance = super(CreateRedshiftROP, self).create( product_name, @@ -118,8 +116,7 @@ class CreateRedshiftROP(plugin.HoudiniCreator): return super(CreateRedshiftROP, self).remove_instances(instances) - def get_pre_create_attr_defs(self): - attrs = super(CreateRedshiftROP, self).get_pre_create_attr_defs() + def get_instance_attr_defs(self): image_format_enum = [ "exr", "tif", "jpg", "png", ] @@ -128,14 +125,8 @@ class CreateRedshiftROP(plugin.HoudiniCreator): "Full Multi-Layered EXR File" ] - - return attrs + [ - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), + return [ + UILabelDef(label="RedShift Render Settings:"), EnumDef("image_format", image_format_enum, default=self.ext, @@ -143,5 +134,24 @@ class CreateRedshiftROP(plugin.HoudiniCreator): EnumDef("multi_layered_mode", multi_layered_mode, default=self.multi_layered_mode, - label="Multi-Layered EXR") + label="Multi-Layered EXR"), + UISeparatorDef(key="1"), + UILabelDef(label="Farm Render Options:"), + BoolDef("farm", + label="Submitting to Farm", + default=True), + BoolDef("split_render", + label="Split export and render jobs", + default=self.split_render), + UISeparatorDef(key="2"), + UILabelDef(label="Local Render Options:"), + BoolDef("skip_render", + label="Skip Render", + tooltip="Enable this option to skip render which publish existing frames.", + default=False), ] + + def get_pre_create_attr_defs(self): + attrs = super(CreateRedshiftROP, self).get_pre_create_attr_defs() + + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index 61894da98e..ffdce1df32 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -6,7 +6,8 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder families = ["mantra_rop", - "karma_rop"] + "karma_rop", + "redshift_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index e94e1187d7..0b8e004873 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -11,7 +11,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # this plugin runs after Collect Render Products order = pyblish.api.CollectorOrder + 0.12 families = ["mantra_rop", - "karma_rop"] + "karma_rop", + "redshift_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index a7967435c9..e2f51d0dff 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -11,7 +11,8 @@ class ExtractLocalRender(publish.Extractor): label = "Extract Local Render" hosts = ["houdini"] families = ["mantra_rop", - "karma_rop"] + "karma_rop", + "redshift_rop"] targets = ["local", "remote"] def process(self, instance): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index 5885fd8643..b33b9cc344 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -18,7 +18,6 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): order = pyblish.api.IntegratorOrder + 9.0 hosts = ["houdini"] families = ["workfile", - "redshift_rop", "arnold_rop", "usdrender", "render.farm.hou", diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py index 2d7a95e817..cbed59fa3f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py @@ -14,7 +14,8 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder hosts = ["houdini"] - families = ["mantra_rop"] + families = ["mantra_rop", + "redshift_rop"] label = "Validate Split Export Is Disabled" actions = [DisableSplitExportAction] @@ -44,7 +45,7 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): return - split_enabled = creator_attribute["export_job"] + split_enabled = creator_attribute["split_render"] if split_enabled: invalid.append(rop_node) cls.log.error( @@ -61,5 +62,5 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): instance.data["instance_id"]) creator_attributes = created_instance["creator_attributes"] # Disable export_job - creator_attributes["export_job"] = False + creator_attributes["split_render"] = False create_context.save_changes() diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index bb556c2b9d..05b0e55548 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -41,7 +41,6 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "renderlayer", "maxrender", "usdrender", - "redshift_rop", "arnold_rop", "vray_rop", "render.farm.hou", diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index b433151b34..39a150ab2d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -71,7 +71,6 @@ class HoudiniSubmitDeadline( order = pyblish.api.IntegratorOrder hosts = ["houdini"] families = ["usdrender", - "redshift_rop", "arnold_rop", "vray_rop", "render.farm.hou"] @@ -280,7 +279,7 @@ class HoudiniSubmitDeadline( plugin_info = VrayRenderPluginInfo( InputFilename=instance.data["ifdFile"], ) - elif product_type == "redshift_rop": + elif node_type == "Redshift_ROP": plugin_info = RedshiftRenderPluginInfo( SceneFile=instance.data["ifdFile"] ) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 69f626b602..d70bc925ed 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -93,8 +93,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "renderlayer", "imagesequence", "vrayscene", "maxrender", "arnold_rop", "render.farm.hou", - "vray_rop", - "redshift_rop"] + "vray_rop"] aov_filter = [ { From 2228279a2d6cee48f7e0ed18ea07a993d1d4d077 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 17:09:36 +0200 Subject: [PATCH 018/469] refactor 'export_job' variable name into 'split_render' --- .../hosts/houdini/plugins/create/create_arnold_rop.py | 8 ++++---- .../hosts/houdini/plugins/create/create_mantra_rop.py | 8 ++++---- .../hosts/houdini/plugins/create/create_vray_rop.py | 10 +++++----- .../publish/validate_split_render_is_disabled.py | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index b7c5910a4f..68c68c5a16 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -14,7 +14,7 @@ class CreateArnoldRop(plugin.HoudiniCreator): ext = "exr" # Default to split export and render jobs - export_job = True + split_render = True def create(self, product_name, instance_data, pre_create_data): import hou @@ -51,7 +51,7 @@ class CreateArnoldRop(plugin.HoudiniCreator): "ar_exr_half_precision": 1 # half precision } - if pre_create_data.get("export_job"): + if pre_create_data.get("split_render"): ass_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.ass".format( export_dir=hou.text.expandString("$HIP/pyblish/ass/"), @@ -78,9 +78,9 @@ class CreateArnoldRop(plugin.HoudiniCreator): BoolDef("farm", label="Submitting to Farm", default=True), - BoolDef("export_job", + BoolDef("split_render", label="Split export and render jobs", - default=self.export_job), + default=self.split_render), EnumDef("image_format", image_format_enum, default=self.ext, diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index 6dac3ff02a..58aadfd26c 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -12,7 +12,7 @@ class CreateMantraROP(plugin.HoudiniCreator): icon = "magic" # Default to split export and render jobs - export_job = True + split_render = True def create(self, product_name, instance_data, pre_create_data): import hou # noqa @@ -48,7 +48,7 @@ class CreateMantraROP(plugin.HoudiniCreator): "vm_picture": filepath, } - if pre_create_data.get("export_job"): + if pre_create_data.get("split_render"): ifd_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.ifd".format( export_dir=hou.text.expandString("$HIP/pyblish/ifd/"), @@ -101,9 +101,9 @@ class CreateMantraROP(plugin.HoudiniCreator): BoolDef("farm", label="Submitting to Farm", default=True), - BoolDef("export_job", + BoolDef("split_render", label="Split export and render jobs", - default=self.export_job), + default=self.split_render), UISeparatorDef(key="2"), UILabelDef(label="Local Render Options:"), BoolDef("skip_render", diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index 6b2396bffb..f7779cc67c 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -3,7 +3,7 @@ import hou from ayon_core.hosts.houdini.api import plugin -from ayon_core.pipeline import CreatedInstance, CreatorError +from ayon_core.pipeline import CreatorError from ayon_core.lib import EnumDef, BoolDef @@ -17,7 +17,7 @@ class CreateVrayROP(plugin.HoudiniCreator): ext = "exr" # Default to split export and render jobs - export_job = True + split_render = True def create(self, product_name, instance_data, pre_create_data): @@ -55,7 +55,7 @@ class CreateVrayROP(plugin.HoudiniCreator): "SettingsEXR_bits_per_channel": "16" # half precision } - if pre_create_data.get("export_job"): + if pre_create_data.get("split_render"): scene_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.vrscene".format( export_dir=hou.text.expandString("$HIP/pyblish/vrscene/"), @@ -154,9 +154,9 @@ class CreateVrayROP(plugin.HoudiniCreator): BoolDef("farm", label="Submitting to Farm", default=True), - BoolDef("export_job", + BoolDef("split_render", label="Split export and render jobs", - default=self.export_job), + default=self.split_render), EnumDef("image_format", image_format_enum, default=self.ext, diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py index cbed59fa3f..d54f10b29b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py @@ -61,6 +61,6 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): created_instance = create_context.get_instance_by_id( instance.data["instance_id"]) creator_attributes = created_instance["creator_attributes"] - # Disable export_job + # Disable split_render creator_attributes["split_render"] = False create_context.save_changes() From 0ba5fee7e259543b0c8df66d9f2e898b46089ccc Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 17:23:56 +0200 Subject: [PATCH 019/469] support local rendering for arnold_rop --- .../plugins/create/create_arnold_rop.py | 23 ++++++++++++------- .../plugins/publish/collect_farm_instances.py | 3 ++- .../publish/collect_local_render_instances.py | 3 ++- .../plugins/publish/extract_local_render.py | 3 ++- .../plugins/publish/increment_current_file.py | 1 - .../validate_split_render_is_disabled.py | 3 ++- .../deadline/plugins/publish/collect_pools.py | 1 - .../publish/submit_houdini_render_deadline.py | 3 +-- .../plugins/publish/submit_publish_job.py | 2 +- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index 68c68c5a16..c65c425a45 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -1,5 +1,5 @@ from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef, BoolDef +from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef class CreateArnoldRop(plugin.HoudiniCreator): @@ -25,8 +25,6 @@ class CreateArnoldRop(plugin.HoudiniCreator): # Add chunk size attribute instance_data["chunkSize"] = 1 - # Submit for job publishing - instance_data["farm"] = pre_create_data.get("farm") instance = super(CreateArnoldRop, self).create( product_name, @@ -66,15 +64,13 @@ class CreateArnoldRop(plugin.HoudiniCreator): to_lock = ["productType", "id"] self.lock_parameters(instance_node, to_lock) - def get_pre_create_attr_defs(self): - attrs = super(CreateArnoldRop, self).get_pre_create_attr_defs() - + def get_instance_attr_defs(self): image_format_enum = [ "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] - return attrs + [ + return [ BoolDef("farm", label="Submitting to Farm", default=True), @@ -84,5 +80,16 @@ class CreateArnoldRop(plugin.HoudiniCreator): EnumDef("image_format", image_format_enum, default=self.ext, - label="Image Format Options") + label="Image Format Options"), + UISeparatorDef(key="2"), + UILabelDef(label="Local Render Options:"), + BoolDef("skip_render", + label="Skip Render", + tooltip="Enable this option to skip render which publish existing frames.", + default=False), ] + + def get_pre_create_attr_defs(self): + attrs = super(CreateArnoldRop, self).get_pre_create_attr_defs() + + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index ffdce1df32..afe67279e1 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -7,7 +7,8 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder families = ["mantra_rop", "karma_rop", - "redshift_rop"] + "redshift_rop", + "arnold_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 0b8e004873..9b121a6894 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -12,7 +12,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.12 families = ["mantra_rop", "karma_rop", - "redshift_rop"] + "redshift_rop", + "arnold_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index e2f51d0dff..1fce9dc87f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -12,7 +12,8 @@ class ExtractLocalRender(publish.Extractor): hosts = ["houdini"] families = ["mantra_rop", "karma_rop", - "redshift_rop"] + "redshift_rop", + "arnold_rop"] targets = ["local", "remote"] def process(self, instance): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index b33b9cc344..acb66afa4e 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -18,7 +18,6 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): order = pyblish.api.IntegratorOrder + 9.0 hosts = ["houdini"] families = ["workfile", - "arnold_rop", "usdrender", "render.farm.hou", "render.local.hou", diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py index d54f10b29b..38912f434f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py @@ -15,7 +15,8 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder hosts = ["houdini"] families = ["mantra_rop", - "redshift_rop"] + "redshift_rop", + "arnold_rop"] label = "Validate Split Export Is Disabled" actions = [DisableSplitExportAction] diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 05b0e55548..c30c7fb0f2 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -41,7 +41,6 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "renderlayer", "maxrender", "usdrender", - "arnold_rop", "vray_rop", "render.farm.hou", "publish.hou"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 39a150ab2d..17a0b4ad32 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -71,7 +71,6 @@ class HoudiniSubmitDeadline( order = pyblish.api.IntegratorOrder hosts = ["houdini"] families = ["usdrender", - "arnold_rop", "vray_rop", "render.farm.hou"] targets = ["local"] @@ -266,7 +265,7 @@ class HoudiniSubmitDeadline( rop_node = hou.node(instance.data.get("instance_node")) node_type = rop_node.type().name() - if product_type == "arnold_rop": + if node_type == "arnold": plugin_info = ArnoldRenderDeadlinePluginInfo( InputFile=instance.data["ifdFile"] ) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index d70bc925ed..6171d7135f 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -92,7 +92,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "prerender.farm", "prerender.frames_farm", "renderlayer", "imagesequence", "vrayscene", "maxrender", - "arnold_rop", "render.farm.hou", + "render.farm.hou", "vray_rop"] aov_filter = [ From c7e0821ff57e046c8de87c37d0779d296c8ca407 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 29 Mar 2024 17:42:49 +0200 Subject: [PATCH 020/469] support local rendering for vray_rop --- .../houdini/plugins/create/create_vray_rop.py | 36 ++++++++++++------- .../plugins/publish/collect_farm_instances.py | 3 +- .../publish/collect_local_render_instances.py | 3 +- .../plugins/publish/extract_local_render.py | 3 +- .../validate_split_render_is_disabled.py | 3 +- .../deadline/plugins/publish/collect_pools.py | 1 - .../publish/submit_houdini_render_deadline.py | 3 +- .../plugins/publish/submit_publish_job.py | 3 +- 8 files changed, 33 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index f7779cc67c..682eec379e 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -4,7 +4,7 @@ import hou from ayon_core.hosts.houdini.api import plugin from ayon_core.pipeline import CreatorError -from ayon_core.lib import EnumDef, BoolDef +from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef class CreateVrayROP(plugin.HoudiniCreator): @@ -25,8 +25,6 @@ class CreateVrayROP(plugin.HoudiniCreator): instance_data.update({"node_type": "vray_renderer"}) # Add chunk size attribute instance_data["chunkSize"] = 10 - # Submit for job publishing - instance_data["farm"] = pre_create_data.get("farm") instance = super(CreateVrayROP, self).create( product_name, @@ -143,20 +141,13 @@ class CreateVrayROP(plugin.HoudiniCreator): return super(CreateVrayROP, self).remove_instances(instances) - def get_pre_create_attr_defs(self): - attrs = super(CreateVrayROP, self).get_pre_create_attr_defs() + def get_instance_attr_defs(self): image_format_enum = [ "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] - return attrs + [ - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), + return [ EnumDef("image_format", image_format_enum, default=self.ext, @@ -170,5 +161,24 @@ class CreateVrayROP(plugin.HoudiniCreator): label="Render Element", tooltip="Create Render Element Node " "if enabled", - default=False) + default=False), + UISeparatorDef(key="1"), + UILabelDef(label="Farm Render Options:"), + BoolDef("farm", + label="Submitting to Farm", + default=True), + BoolDef("split_render", + label="Split export and render jobs", + default=self.split_render), + UISeparatorDef(key="2"), + UILabelDef(label="Local Render Options:"), + BoolDef("skip_render", + label="Skip Render", + tooltip="Enable this option to skip render which publish existing frames.", + default=False), ] + + def get_pre_create_attr_defs(self): + attrs = super(CreateVrayROP, self).get_pre_create_attr_defs() + + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index afe67279e1..37a979d94b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -8,7 +8,8 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): families = ["mantra_rop", "karma_rop", "redshift_rop", - "arnold_rop"] + "arnold_rop", + "vray_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 9b121a6894..9ad44da978 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -13,7 +13,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): families = ["mantra_rop", "karma_rop", "redshift_rop", - "arnold_rop"] + "arnold_rop", + "vray_rop"] hosts = ["houdini"] targets = ["local", "remote"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index 1fce9dc87f..5e89e760ab 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -13,7 +13,8 @@ class ExtractLocalRender(publish.Extractor): families = ["mantra_rop", "karma_rop", "redshift_rop", - "arnold_rop"] + "arnold_rop", + "vray_rop"] targets = ["local", "remote"] def process(self, instance): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py index 38912f434f..72ccb90e86 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py @@ -16,7 +16,8 @@ class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): hosts = ["houdini"] families = ["mantra_rop", "redshift_rop", - "arnold_rop"] + "arnold_rop", + "vray_rop"] label = "Validate Split Export Is Disabled" actions = [DisableSplitExportAction] diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index c30c7fb0f2..76b397eee0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -41,7 +41,6 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "renderlayer", "maxrender", "usdrender", - "vray_rop", "render.farm.hou", "publish.hou"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 17a0b4ad32..404c7ade04 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -71,7 +71,6 @@ class HoudiniSubmitDeadline( order = pyblish.api.IntegratorOrder hosts = ["houdini"] families = ["usdrender", - "vray_rop", "render.farm.hou"] targets = ["local"] use_published = True @@ -274,7 +273,7 @@ class HoudiniSubmitDeadline( SceneFile=instance.data["ifdFile"], Version=hou_major_minor, ) - elif product_type == "vray_rop": + elif node_type == "vray_renderer": plugin_info = VrayRenderPluginInfo( InputFilename=instance.data["ifdFile"], ) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 6171d7135f..f8df1b4d4c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -92,8 +92,7 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "prerender.farm", "prerender.frames_farm", "renderlayer", "imagesequence", "vrayscene", "maxrender", - "render.farm.hou", - "vray_rop"] + "render.farm.hou"] aov_filter = [ { From bcb1c2a0ba3b49c43a08507ad52a9fdce07037ef Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 2 Apr 2024 21:42:56 +0200 Subject: [PATCH 021/469] Use render targets in a similar fashion to Nuke + set houdini parms according to render target value --- .../plugins/create/create_arnold_rop.py | 30 +++++++-------- .../plugins/create/create_karma_rop.py | 23 +++++++----- .../plugins/create/create_mantra_rop.py | 37 +++++++------------ .../plugins/create/create_redshift_rop.py | 33 +++++++---------- .../houdini/plugins/create/create_vray_rop.py | 32 +++++++--------- .../plugins/publish/collect_farm_instances.py | 34 +++++++++++++++-- .../publish/collect_local_render_instances.py | 14 ++++--- .../plugins/publish/extract_local_render.py | 21 ++++++++++- 8 files changed, 128 insertions(+), 96 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index c65c425a45..07c1c98a28 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -1,5 +1,5 @@ from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef +from ayon_core.lib import EnumDef class CreateArnoldRop(plugin.HoudiniCreator): @@ -13,8 +13,8 @@ class CreateArnoldRop(plugin.HoudiniCreator): # Default extension ext = "exr" - # Default to split export and render jobs - split_render = True + # Default render target + render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): import hou @@ -49,7 +49,7 @@ class CreateArnoldRop(plugin.HoudiniCreator): "ar_exr_half_precision": 1 # half precision } - if pre_create_data.get("split_render"): + if pre_create_data.get("render_target") == "farm_split": ass_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.ass".format( export_dir=hou.text.expandString("$HIP/pyblish/ass/"), @@ -69,24 +69,22 @@ class CreateArnoldRop(plugin.HoudiniCreator): "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + "farm_split": "Farm Rendering - Split export & render jobs", + } return [ - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target), EnumDef("image_format", image_format_enum, default=self.ext, label="Image Format Options"), - UISeparatorDef(key="2"), - UILabelDef(label="Local Render Options:"), - BoolDef("skip_render", - label="Skip Render", - tooltip="Enable this option to skip render which publish existing frames.", - default=False), ] def get_pre_create_attr_defs(self): diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index c791cfe647..5d56150df9 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin to create Karma ROP.""" from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import BoolDef, EnumDef, NumberDef, UISeparatorDef, UILabelDef +from ayon_core.lib import BoolDef, EnumDef, NumberDef class CreateKarmaROP(plugin.HoudiniCreator): @@ -11,6 +11,9 @@ class CreateKarmaROP(plugin.HoudiniCreator): product_type = "karma_rop" icon = "magic" + # Default render target + render_target = "farm" + def create(self, product_name, instance_data, pre_create_data): import hou # noqa @@ -89,11 +92,17 @@ class CreateKarmaROP(plugin.HoudiniCreator): "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + } return [ - BoolDef("farm", - label="Submitting to Farm", - default=True), + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target), EnumDef("image_format", image_format_enum, default="exr", @@ -109,12 +118,6 @@ class CreateKarmaROP(plugin.HoudiniCreator): BoolDef("cam_res", label="Camera Resolution", default=False), - UISeparatorDef(key="2"), - UILabelDef(label="Local Render Options:"), - BoolDef("skip_render", - label="Skip Render", - tooltip="Enable this option to skip render which publish existing frames.", - default=False), ] diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index 58aadfd26c..6705621f58 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Creator plugin to create Mantra ROP.""" from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef +from ayon_core.lib import EnumDef, BoolDef class CreateMantraROP(plugin.HoudiniCreator): @@ -11,8 +11,8 @@ class CreateMantraROP(plugin.HoudiniCreator): product_type = "mantra_rop" icon = "magic" - # Default to split export and render jobs - split_render = True + # Default render target + render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): import hou # noqa @@ -21,10 +21,6 @@ class CreateMantraROP(plugin.HoudiniCreator): instance_data.update({"node_type": "ifd"}) # Add chunk size attribute instance_data["chunkSize"] = 10 - # Submit for job publishing - creator_attributes = instance_data.setdefault( - "creator_attributes", dict()) - creator_attributes["farm"] = pre_create_data.get("farm") instance = super(CreateMantraROP, self).create( product_name, @@ -48,7 +44,7 @@ class CreateMantraROP(plugin.HoudiniCreator): "vm_picture": filepath, } - if pre_create_data.get("split_render"): + if pre_create_data.get("render_target") == "farm_split": ifd_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.ifd".format( export_dir=hou.text.expandString("$HIP/pyblish/ifd/"), @@ -84,9 +80,18 @@ class CreateMantraROP(plugin.HoudiniCreator): "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + "farm_split": "Farm Rendering - Split export & render jobs", + } return [ - UILabelDef(label="Mantra Render Settings:"), + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target), EnumDef("image_format", image_format_enum, default="exr", @@ -96,20 +101,6 @@ class CreateMantraROP(plugin.HoudiniCreator): tooltip="Override the current camera " "resolution, recommended for IPR.", default=False), - UISeparatorDef(key="1"), - UILabelDef(label="Farm Render Options:"), - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), - UISeparatorDef(key="2"), - UILabelDef(label="Local Render Options:"), - BoolDef("skip_render", - label="Skip Render", - tooltip="Enable this option to skip render which publish existing frames.", - default=False), ] def get_pre_create_attr_defs(self): diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index f6d42419f9..02c3ed2fc0 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -4,7 +4,7 @@ import hou # noqa from ayon_core.pipeline import CreatorError from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef +from ayon_core.lib import EnumDef class CreateRedshiftROP(plugin.HoudiniCreator): @@ -17,8 +17,8 @@ class CreateRedshiftROP(plugin.HoudiniCreator): ext = "exr" multi_layered_mode = "No Multi-Layered EXR File" - # Default to split export and render jobs - split_render = True + # Default render target + render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): @@ -97,7 +97,7 @@ class CreateRedshiftROP(plugin.HoudiniCreator): rs_filepath = f"{export_dir}{product_name}/{product_name}.$F4.rs" parms["RS_archive_file"] = rs_filepath - if pre_create_data.get("split_render", self.split_render): + if pre_create_data.get("render_target") == "farm_split": parms["RS_archive_enable"] = 1 instance_node.setParms(parms) @@ -124,9 +124,18 @@ class CreateRedshiftROP(plugin.HoudiniCreator): "No Multi-Layered EXR File", "Full Multi-Layered EXR File" ] + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + "farm_split": "Farm Rendering - Split export & render jobs", + } return [ - UILabelDef(label="RedShift Render Settings:"), + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target), EnumDef("image_format", image_format_enum, default=self.ext, @@ -135,20 +144,6 @@ class CreateRedshiftROP(plugin.HoudiniCreator): multi_layered_mode, default=self.multi_layered_mode, label="Multi-Layered EXR"), - UISeparatorDef(key="1"), - UILabelDef(label="Farm Render Options:"), - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), - UISeparatorDef(key="2"), - UILabelDef(label="Local Render Options:"), - BoolDef("skip_render", - label="Skip Render", - tooltip="Enable this option to skip render which publish existing frames.", - default=False), ] def get_pre_create_attr_defs(self): diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index 682eec379e..147a34191f 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -4,7 +4,7 @@ import hou from ayon_core.hosts.houdini.api import plugin from ayon_core.pipeline import CreatorError -from ayon_core.lib import EnumDef, BoolDef, UISeparatorDef, UILabelDef +from ayon_core.lib import EnumDef, BoolDef class CreateVrayROP(plugin.HoudiniCreator): @@ -16,8 +16,8 @@ class CreateVrayROP(plugin.HoudiniCreator): icon = "magic" ext = "exr" - # Default to split export and render jobs - split_render = True + # Default render target + render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): @@ -53,7 +53,7 @@ class CreateVrayROP(plugin.HoudiniCreator): "SettingsEXR_bits_per_channel": "16" # half precision } - if pre_create_data.get("split_render"): + if pre_create_data.get("render_target") == "farm_split": scene_filepath = \ "{export_dir}{product_name}/{product_name}.$F4.vrscene".format( export_dir=hou.text.expandString("$HIP/pyblish/vrscene/"), @@ -146,8 +146,18 @@ class CreateVrayROP(plugin.HoudiniCreator): "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", "rad", "rat", "rta", "sgi", "tga", "tif", ] + render_target_items = { + "local": "Local machine rendering", + "local_no_render": "Use existing frames (local)", + "farm": "Farm Rendering", + "farm_split": "Farm Rendering - Split export & render jobs", + } return [ + EnumDef("render_target", + items=render_target_items, + label="Render target", + default=self.render_target), EnumDef("image_format", image_format_enum, default=self.ext, @@ -162,20 +172,6 @@ class CreateVrayROP(plugin.HoudiniCreator): tooltip="Create Render Element Node " "if enabled", default=False), - UISeparatorDef(key="1"), - UILabelDef(label="Farm Render Options:"), - BoolDef("farm", - label="Submitting to Farm", - default=True), - BoolDef("split_render", - label="Split export and render jobs", - default=self.split_render), - UISeparatorDef(key="2"), - UILabelDef(label="Local Render Options:"), - BoolDef("skip_render", - label="Skip Render", - tooltip="Enable this option to skip render which publish existing frames.", - default=False), ] def get_pre_create_attr_defs(self): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index 37a979d94b..56a2b42940 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -16,12 +16,40 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): label = "Collect farm instances" def process(self, instance): + import hou + creator_attribute = instance.data["creator_attributes"] - farm_enabled = creator_attribute["farm"] - instance.data["farm"] = farm_enabled - if not farm_enabled: + product_type = instance.data["productType"] + rop_node = hou.node(instance.data.get("instance_node")) + + # Align split parameter value on rop node to the render target. + if creator_attribute.get("render_target") == "farm_split": + if product_type == "arnold_rop": + rop_node.setParms({"ar_ass_export_enable": 1}) + elif product_type == "mantra_rop": + rop_node.setParms({"soho_outputmode": 1}) + elif product_type == "redshift_rop": + rop_node.setParms({"RS_archive_enable": 1}) + elif product_type == "vray_rop": + rop_node.setParms({"render_export_mode": "2"}) + else: + if product_type == "arnold_rop": + rop_node.setParms({"ar_ass_export_enable": 0}) + elif product_type == "mantra_rop": + rop_node.setParms({"soho_outputmode": 0}) + elif product_type == "redshift_rop": + rop_node.setParms({"RS_archive_enable": 0}) + elif product_type == "vray_rop": + rop_node.setParms({"render_export_mode": "1"}) + + # Collect Render Target + if creator_attribute.get("render_target") not in { + "farm_split", "farm" + }: + instance.data["farm"] = False self.log.debug("Render on farm is disabled. " "Skipping farm collecting.") return + instance.data["farm"] = True instance.data["families"].append("render.farm.hou") diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 9ad44da978..194a05f42d 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -21,10 +21,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): label = "Collect local render instances" def process(self, instance): - creator_attribute = instance.data["creator_attributes"] - farm_enabled = creator_attribute["farm"] - instance.data["farm"] = farm_enabled - if farm_enabled: + + if instance.data["farm"]: self.log.debug("Render on farm is enabled. " "Skipping local render collecting.") return @@ -45,7 +43,13 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # AOV=aov_name, # productName=instance.data["productName"] # ) - product_name = "render{Task}{productName}_{AOV}".format( + name_template = "render{Task}{productName}_{AOV}" + if not aov_name: + # This is done to remove the trailing `_` + # if aov name is an empty string. + name_template = "render{Task}{productName}" + + product_name = name_template.format( Task=self._capitalize(instance.data["task"]), productName=self._capitalize(instance.data["productName"]), AOV=aov_name diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index 5e89e760ab..120e5563e9 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -23,11 +23,28 @@ class ExtractLocalRender(publish.Extractor): return creator_attribute = instance.data["creator_attributes"] - skip_render = creator_attribute["skip_render"] - if skip_render: + if creator_attribute.get("render_target") == "local_no_render": self.log.debug("Skip render is enabled, skipping rendering.") return + # Make sure split parameter is turned off. + # Otherwise, render nodes will generate intermediate + # render files instead of render. + product_type = instance.data["productType"] + rop_node = hou.node(instance.data.get("instance_node")) + + if product_type == "arnold_rop": + rop_node.setParms({"ar_ass_export_enable": 0}) + elif product_type == "mantra_rop": + rop_node.setParms({"soho_outputmode": 0}) + elif product_type == "redshift_rop": + rop_node.setParms({"RS_archive_enable": 0}) + elif product_type == "vray_rop": + rop_node.setParms({"render_export_mode": "1"}) + ropnode = hou.node(instance.data.get("instance_node")) render_rop(ropnode) + + # TODO: Check for missing frames. + # self.log.debug(instance.data["expectedFiles"]) From bca10c7c7d0d4d8457a2ba25730dd37ebd5bbff9 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 2 Apr 2024 21:43:36 +0200 Subject: [PATCH 022/469] remove unnecessary validator --- .../validate_split_render_is_disabled.py | 68 ------------------- 1 file changed, 68 deletions(-) delete mode 100644 client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py deleted file mode 100644 index 72ccb90e86..0000000000 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_split_render_is_disabled.py +++ /dev/null @@ -1,68 +0,0 @@ -# -*- coding: utf-8 -*- -import pyblish.api -import hou -from ayon_core.pipeline import PublishValidationError -from ayon_core.pipeline.publish import RepairAction - - -class DisableSplitExportAction(RepairAction): - label = "Disable Split Export" - - -class ValidateSplitExportIsDisabled(pyblish.api.InstancePlugin): - """Validate the Instance has no current cooking errors.""" - - order = pyblish.api.ValidatorOrder - hosts = ["houdini"] - families = ["mantra_rop", - "redshift_rop", - "arnold_rop", - "vray_rop"] - label = "Validate Split Export Is Disabled" - actions = [DisableSplitExportAction] - - def process(self, instance): - - invalid = self.get_invalid(instance) - if invalid: - nodes = [n.path() for n in invalid] - raise PublishValidationError( - "See log for details. " - "Invalid nodes: {0}".format(nodes) - ) - - - @classmethod - def get_invalid(cls, instance): - - invalid = [] - rop_node = hou.node(instance.data["instance_node"]) - - creator_attribute = instance.data["creator_attributes"] - farm_enabled = creator_attribute["farm"] - if farm_enabled: - cls.log.debug( - "Farm is enabled, skipping validation." - ) - return - - - split_enabled = creator_attribute["split_render"] - if split_enabled: - invalid.append(rop_node) - cls.log.error( - "Split Export must be disabled in local render instances." - ) - - return invalid - - @classmethod - def repair(cls, instance): - - create_context = instance.context.data["create_context"] - created_instance = create_context.get_instance_by_id( - instance.data["instance_id"]) - creator_attributes = created_instance["creator_attributes"] - # Disable split_render - creator_attributes["split_render"] = False - create_context.save_changes() From 4a5f0ebc92113f2dafd263ac3b771fb2f194563b Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 2 Apr 2024 21:44:54 +0200 Subject: [PATCH 023/469] set rsnode parms according to render target value before collecting expected files --- .../plugins/publish/collect_redshift_rop.py | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py index 55a55bb12a..191a9c1ebc 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -60,11 +60,27 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): instance.data["ifdFile"] = beauty_export_product instance.data["exportFiles"] = list(export_products) - full_exr_mode = (rop.evalParm("RS_outputMultilayerMode") == "2") - if full_exr_mode: - # Ignore beauty suffix if full mode is enabled - # As this is what the rop does. - beauty_suffix = "" + # Set MultiLayer Mode. + creator_attribute = instance.data["creator_attributes"] + ext = creator_attribute.get("image_format") + multi_layered_mode = creator_attribute.get("multi_layered_mode") + full_exr_mode = False + if ext == "exr": + if multi_layered_mode == "No Multi-Layered EXR File": + rop.setParms({ + "RS_outputMultilayerMode": "1", + "RS_aovMultipart": False + }) + full_exr_mode = True + # Ignore beauty suffix if full mode is enabled + # As this is what the rop does. + beauty_suffix = "" + + elif multi_layered_mode == "Full Multi-Layered EXR File": + rop.setParms({ + "RS_outputMultilayerMode": "2", + "RS_aovMultipart": True + }) # Default beauty/main layer AOV beauty_product = self.get_render_product_name( @@ -75,7 +91,7 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): beauty_suffix: self.generate_expected_files(instance, beauty_product) } - + aovs_rop = rop.parm("RS_aovGetFromNode").evalAsNode() if aovs_rop: rop = aovs_rop @@ -98,7 +114,7 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): if rop.parm(f"RS_aovID_{i}").evalAsString() == "CRYPTOMATTE" or \ not full_exr_mode: - + aov_product = self.get_render_product_name(aov_prefix, aov_suffix) render_products.append(aov_product) From 7f703585f12d47bc7d6044faf3641fc61cbdab55 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Thu, 4 Apr 2024 10:51:51 +0200 Subject: [PATCH 024/469] remove targets class attribute. Co-authored-by: Kayla Man <64118225+moonyuet@users.noreply.github.com> --- .../houdini/plugins/publish/collect_local_render_instances.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 194a05f42d..1fd4129ee1 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -17,7 +17,6 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): "vray_rop"] hosts = ["houdini"] - targets = ["local", "remote"] label = "Collect local render instances" def process(self, instance): From 4e6bd3d3361708fa7cf84ef69e0e5715ed451df2 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 4 Apr 2024 12:32:57 +0200 Subject: [PATCH 025/469] remove the un-necessary 'render.farm.hou' intermidate family --- .../plugins/publish/collect_farm_instances.py | 1 - .../plugins/publish/increment_current_file.py | 6 +++++- .../deadline/plugins/publish/collect_pools.py | 6 +++++- .../publish/submit_houdini_render_deadline.py | 12 +++++++++++- .../deadline/plugins/publish/submit_publish_job.py | 6 +++++- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index 56a2b42940..391afe7387 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -52,4 +52,3 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): return instance.data["farm"] = True - instance.data["families"].append("render.farm.hou") diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py index acb66afa4e..ffd9a75620 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py @@ -19,7 +19,11 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin): hosts = ["houdini"] families = ["workfile", "usdrender", - "render.farm.hou", + "mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop", "render.local.hou", "publish.hou"] optional = True diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 76b397eee0..6b7449b8f8 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -41,7 +41,11 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "renderlayer", "maxrender", "usdrender", - "render.farm.hou", + "mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop", "publish.hou"] primary_pool = None diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 404c7ade04..b562e2848b 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -71,7 +71,12 @@ class HoudiniSubmitDeadline( order = pyblish.api.IntegratorOrder hosts = ["houdini"] families = ["usdrender", - "render.farm.hou"] + "mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop"] + targets = ["local"] use_published = True @@ -314,6 +319,11 @@ class HoudiniSubmitDeadline( return attr.asdict(plugin_info) def process(self, instance): + if not instance.data["farm"]: + self.log.debug("Render on farm is disabled. " + "Skipping deadline submission.") + return + super(HoudiniSubmitDeadline, self).process(instance) # TODO: Avoid the need for this logic here, needed for submit publish diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index f8df1b4d4c..773532e5c0 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -92,7 +92,11 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "prerender.farm", "prerender.frames_farm", "renderlayer", "imagesequence", "vrayscene", "maxrender", - "render.farm.hou"] + "mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop"] aov_filter = [ { From 05bdbb2aa6ff99eed01848ce2e53a3fbe3ff9341 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 4 Apr 2024 12:58:29 +0200 Subject: [PATCH 026/469] Abort publishing if there are missing frames. --- .../plugins/publish/extract_local_render.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index 120e5563e9..23a64945aa 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -3,6 +3,7 @@ import pyblish.api from ayon_core.pipeline import publish from ayon_core.hosts.houdini.api.lib import render_rop import hou +import os class ExtractLocalRender(publish.Extractor): @@ -46,5 +47,17 @@ class ExtractLocalRender(publish.Extractor): ropnode = hou.node(instance.data.get("instance_node")) render_rop(ropnode) - # TODO: Check for missing frames. - # self.log.debug(instance.data["expectedFiles"]) + # Check missing frames. + # Frames won't exist if user cancels the render. + expected_files = next(iter(instance.data["expectedFiles"]), {}) + expected_files = sum(expected_files.values(), []) + missing_frames = [ + frame + for frame in expected_files + if not os.path.exists(frame) + ] + if missing_frames: + # TODO: Use user friendly error reporting. + raise RuntimeError("Failed to complete render extraction. " + "Missing output files: {}".format( + missing_frames)) From 78da85398d2ffb86673acf0f88dba94c54ad140a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 4 Apr 2024 15:39:04 +0200 Subject: [PATCH 027/469] Refactor filename since it's now not only Alembic but also USD --- .../hosts/blender/plugins/load/{load_abc.py => load_cache.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename client/ayon_core/hosts/blender/plugins/load/{load_abc.py => load_cache.py} (100%) diff --git a/client/ayon_core/hosts/blender/plugins/load/load_abc.py b/client/ayon_core/hosts/blender/plugins/load/load_cache.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_abc.py rename to client/ayon_core/hosts/blender/plugins/load/load_cache.py From fe6c1fc9f5efa2c0e5c73d397c8584443ae7cd94 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Thu, 4 Apr 2024 15:54:38 +0200 Subject: [PATCH 028/469] remove targets class attribute. Co-authored-by: Kayla Man <64118225+moonyuet@users.noreply.github.com> --- .../hosts/houdini/plugins/publish/extract_local_render.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index 23a64945aa..cf94019947 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -16,7 +16,6 @@ class ExtractLocalRender(publish.Extractor): "redshift_rop", "arnold_rop", "vray_rop"] - targets = ["local", "remote"] def process(self, instance): if instance.data.get("farm"): From eca60b00068b891d0f5c9a80d632f7854a454e43 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 5 Apr 2024 17:34:28 +0100 Subject: [PATCH 029/469] Review feedback --- client/ayon_core/hosts/nuke/api/lib.py | 9 +++++---- client/ayon_core/hosts/nuke/api/utils.py | 16 +++------------- .../nuke/plugins/create/create_write_image.py | 5 ++++- .../plugins/create/create_write_prerender.py | 6 +++++- .../nuke/plugins/create/create_write_render.py | 6 +++++- .../nuke/server/settings/create_plugins.py | 6 +++++- server_addon/nuke/server/version.py | 2 +- 7 files changed, 28 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index 22428fd657..63e6ddef0f 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1022,9 +1022,9 @@ def script_name(): return nuke.root().knob("name").value() -def add_button_render_farm(node): - name = "renderFarm" - label = "Render Farm" +def add_button_headless_farm_submission(node): + name = "headlessFarmSubmission" + label = "Headless Farm Submission" value = "from ayon_core.hosts.nuke.api.utils import submit_headless_farm;" value += "submit_headless_farm(nuke.thisNode())" knob = nuke.PyScript_Knob(name, label, value) @@ -1292,7 +1292,8 @@ def create_write_node( GN.addKnob(link) # Adding render farm submission button. - add_button_render_farm(GN) + if data.get("headless_farm_submission", False): + add_button_headless_farm_submission(GN) # adding write to read button add_button_write_to_read(GN) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 5a643d05d8..9528ad3d4c 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -209,8 +209,7 @@ def _submit_headless_farm(node): # Find instance for node and workfile. instance = None instance_workfile = None - indexes_to_remove = [] - for count, Instance in enumerate(context): + for Instance in context: if Instance.data["family"] == "workfile": instance_workfile = Instance continue @@ -219,7 +218,7 @@ def _submit_headless_farm(node): if node.name() == instance_node.name(): instance = Instance else: - indexes_to_remove.append(count) + Instance.data["active"] = False if instance is None: show_message_dialog( @@ -244,12 +243,6 @@ def _submit_headless_farm(node): instance.data.pop("latestVersion") instance_workfile.data.pop("latestVersion") - # Remove all other instances. - indexes_to_remove.sort(reverse=True) - for i in indexes_to_remove: - if 0 <= i < len(context): - del context[i] - # Validate util.validate(context) @@ -272,11 +265,8 @@ def _submit_headless_farm(node): ) return - # Save the workfile. - host = registered_host() - host.save_file(host.current_file()) - # Copy the workfile to a timestamped copy. + host = registered_host() current_datetime = datetime.now() formatted_timestamp = current_datetime.strftime("%Y%m%d%H%M%S") base, ext = os.path.splitext(host.current_file()) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py index 770726e34f..046b99f6b0 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py @@ -65,12 +65,15 @@ class CreateWriteImage(napi.NukeWriteCreator): ) def create_instance_node(self, product_name, instance_data): + settings = self.project_settings["nuke"]["create"]["CreateWriteImage"] + settings = settings["instance_attributes"] # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, - "fpath_template": self.temp_rendering_path_template + "fpath_template": self.temp_rendering_path_template, + "headless_farm_submission": "headless_farm_submission" in settings } write_data.update(instance_data) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py index 96ac2fac9c..df906c9c25 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py @@ -46,11 +46,15 @@ class CreateWritePrerender(napi.NukeWriteCreator): return attr_defs def create_instance_node(self, product_name, instance_data): + settings = self.project_settings["nuke"]["create"] + settings = settings["CreateWritePrerender"]["instance_attributes"] + # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, - "fpath_template": self.temp_rendering_path_template + "fpath_template": self.temp_rendering_path_template, + "headless_farm_submission": "headless_farm_submission" in settings } write_data.update(instance_data) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py index 24bddb3d26..16bce64ec6 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py @@ -40,11 +40,15 @@ class CreateWriteRender(napi.NukeWriteCreator): return attr_defs def create_instance_node(self, product_name, instance_data): + settings = self.project_settings["nuke"]["create"]["CreateWriteRender"] + settings = settings["instance_attributes"] + # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, - "fpath_template": self.temp_rendering_path_template + "fpath_template": self.temp_rendering_path_template, + "headless_farm_submission": "headless_farm_submission" in settings } write_data.update(instance_data) diff --git a/server_addon/nuke/server/settings/create_plugins.py b/server_addon/nuke/server/settings/create_plugins.py index 6bdc5ee5ad..897a467118 100644 --- a/server_addon/nuke/server/settings/create_plugins.py +++ b/server_addon/nuke/server/settings/create_plugins.py @@ -12,7 +12,11 @@ def instance_attributes_enum(): return [ {"value": "reviewable", "label": "Reviewable"}, {"value": "farm_rendering", "label": "Farm rendering"}, - {"value": "use_range_limit", "label": "Use range limit"} + {"value": "use_range_limit", "label": "Use range limit"}, + { + "value": "headless_farm_submission", + "label": "Headless Farm Submission" + } ] diff --git a/server_addon/nuke/server/version.py b/server_addon/nuke/server/version.py index 569b1212f7..0c5c30071a 100644 --- a/server_addon/nuke/server/version.py +++ b/server_addon/nuke/server/version.py @@ -1 +1 @@ -__version__ = "0.1.10" +__version__ = "0.1.11" From a6ca1488997950044ebddc69b418f5605b9103ab Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 8 Apr 2024 14:24:06 +0200 Subject: [PATCH 030/469] Houdini local render: support single frame --- .../plugins/publish/collect_local_render_instances.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 1fd4129ee1..1dc26e1322 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -62,6 +62,13 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): staging_dir = os.path.dirname(aov_filepaths[0]) ext = aov_filepaths[0].split(".")[-1] + # Support Single frame. + # The integrator wants single files to be a single + # filename instead of a list. + # More info: https://github.com/ynput/ayon-core/issues/238 + if len(aov_filenames) == 1: + aov_filenames = aov_filenames[0] + aov_instance.data.update({ # 'label': label, "task": instance.data["task"], @@ -85,6 +92,7 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): } ] }) + self.log.debug(aov_instance.data) # Remove Mantra instance # I can't remove it here as I still need it to trigger the render. From d7b1f3a3f7a82be99e325201b14dcffbafab4614 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 8 Apr 2024 16:34:38 +0200 Subject: [PATCH 031/469] Houdini local render: support adding review family to the render --- .../publish/collect_local_render_instances.py | 5 ++--- .../plugins/publish/collect_review_data.py | 20 +++++++++++++++++-- .../houdini/plugins/publish/extract_opengl.py | 4 ++++ .../publish/validate_review_colorspace.py | 8 +++++++- .../plugins/publish/validate_scene_review.py | 4 ++++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 1dc26e1322..e221990f2b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -78,21 +78,20 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): "productType": product_type, "productName": product_name, "productGroup": product_group, - "tags": [], - "families": ["render.local.hou"], + "families": ["render.local.hou", "review"], "instance_node": instance.data["instance_node"], "representations": [ { "stagingDir": staging_dir, "ext": ext, "name": ext, + "tags": ["review"], "files": aov_filenames, "frameStart": instance.data["frameStartHandle"], "frameEnd": instance.data["frameEndHandle"] } ] }) - self.log.debug(aov_instance.data) # Remove Mantra instance # I can't remove it here as I still need it to trigger the render. diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py index 9671945b9a..7714ed0954 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py @@ -8,7 +8,8 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin): label = "Collect Review Data" # This specific order value is used so that # this plugin runs after CollectRopFrameRange - order = pyblish.api.CollectorOrder + 0.1 + # Also after CollectLocalRenderInstances + order = pyblish.api.CollectorOrder + 0.13 hosts = ["houdini"] families = ["review"] @@ -28,7 +29,8 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin): ropnode_path = instance.data["instance_node"] ropnode = hou.node(ropnode_path) - camera_path = ropnode.parm("camera").eval() + # Get camera based on the instance_node type. + camera_path = self._get_camera_path(ropnode) camera_node = hou.node(camera_path) if not camera_node: self.log.warning("No valid camera node found on review node: " @@ -55,3 +57,17 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin): # Store focal length in `burninDataMembers` burnin_members = instance.data.setdefault("burninDataMembers", {}) burnin_members["focalLength"] = focal_length + + def _get_camera_path(self, ropnode): + if ropnode.type().name() in { + "opengl", "karma", "ifd", "arnold" + }: + return ropnode.parm("camera").eval() + + elif ropnode.type().name() == "Redshift_ROP": + return ropnode.parm("RS_renderCamera").eval() + + elif ropnode.type().name() == "vray_renderer": + return ropnode.parm("render_camera").eval() + + return "" diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py index fabdfd9a9d..69bbb22340 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py @@ -17,6 +17,10 @@ class ExtractOpenGL(publish.Extractor): def process(self, instance): ropnode = hou.node(instance.data.get("instance_node")) + if ropnode.type().name() != "opengl": + self.log.debug("Skipping OpenGl extraction. Rop node {} " + "is not an OpenGl node.".format(ropnode.path())) + return output = ropnode.evalParm("picture") staging_dir = os.path.normpath(os.path.dirname(output)) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py index 031138e21d..e02ce93f0d 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py @@ -33,6 +33,13 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin, def process(self, instance): + rop_node = hou.node(instance.data["instance_node"]) + + if rop_node.type().name() != "opengl": + self.log.debug("Skipping Validation. Rop node {} " + "is not an OpenGl node.".format(rop_node.path())) + return + if not self.is_active(instance.data): return @@ -43,7 +50,6 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin, ) return - rop_node = hou.node(instance.data["instance_node"]) if rop_node.evalParm("colorcorrect") != 2: # any colorspace settings other than default requires # 'Color Correct' parm to be set to 'OpenColorIO' diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py index b6007d3f0f..9b81f0f8ed 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py @@ -19,6 +19,10 @@ class ValidateSceneReview(pyblish.api.InstancePlugin): report = [] instance_node = hou.node(instance.data.get("instance_node")) + if instance_node.type().name() != "opengl": + self.log.debug("Skipping Validation. Rop node {} " + "is not an OpenGl node.".format(instance_node.path())) + return invalid = self.get_invalid_scene_path(instance_node) if invalid: From c5df561c970bc1cfc0498f8b1adf52392f5fe969 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 9 Apr 2024 20:20:33 +0800 Subject: [PATCH 032/469] Transfer settings from pre create to instance --- .../hosts/houdini/plugins/create/create_arnold_rop.py | 6 ++++++ .../hosts/houdini/plugins/create/create_karma_rop.py | 6 ++++++ .../hosts/houdini/plugins/create/create_mantra_rop.py | 6 ++++++ .../hosts/houdini/plugins/create/create_redshift_rop.py | 6 ++++++ .../hosts/houdini/plugins/create/create_vray_rop.py | 6 ++++++ 5 files changed, 30 insertions(+) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index 07c1c98a28..08ed1bc91a 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -18,6 +18,12 @@ class CreateArnoldRop(plugin.HoudiniCreator): def create(self, product_name, instance_data, pre_create_data): import hou + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in ["render_target"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] # Remove the active, we are checking the bypass flag of the nodes instance_data.pop("active", None) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index 5d56150df9..a3a557791e 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -16,6 +16,12 @@ class CreateKarmaROP(plugin.HoudiniCreator): def create(self, product_name, instance_data, pre_create_data): import hou # noqa + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in ["render_target"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "karma"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index 6705621f58..1b177563bc 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -16,6 +16,12 @@ class CreateMantraROP(plugin.HoudiniCreator): def create(self, product_name, instance_data, pre_create_data): import hou # noqa + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in ["render_target"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "ifd"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index 02c3ed2fc0..942d321b92 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -21,6 +21,12 @@ class CreateRedshiftROP(plugin.HoudiniCreator): render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in ["render_target"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "Redshift_ROP"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index 147a34191f..ad181e4f89 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -20,6 +20,12 @@ class CreateVrayROP(plugin.HoudiniCreator): render_target = "farm_split" def create(self, product_name, instance_data, pre_create_data): + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in ["render_target"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "vray_renderer"}) From 76e4b77845bb34737840680d0e5a15ff56733e30 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 20:25:41 +0200 Subject: [PATCH 033/469] transfer all precreate settings to instance --- .../hosts/houdini/plugins/create/create_arnold_rop.py | 4 +--- .../hosts/houdini/plugins/create/create_karma_rop.py | 4 +--- .../hosts/houdini/plugins/create/create_mantra_rop.py | 4 +--- .../hosts/houdini/plugins/create/create_redshift_rop.py | 4 +--- .../ayon_core/hosts/houdini/plugins/create/create_vray_rop.py | 4 +--- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index 08ed1bc91a..0e25523123 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -21,9 +21,7 @@ class CreateArnoldRop(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - for key in ["render_target"]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] + creator_attributes.update(pre_create_data) # Remove the active, we are checking the bypass flag of the nodes instance_data.pop("active", None) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index a3a557791e..4ddf7af376 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -19,9 +19,7 @@ class CreateKarmaROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - for key in ["render_target"]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] + creator_attributes.update(pre_create_data) instance_data.pop("active", None) instance_data.update({"node_type": "karma"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index 1b177563bc..7d481d0dbf 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -19,9 +19,7 @@ class CreateMantraROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - for key in ["render_target"]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] + creator_attributes.update(pre_create_data) instance_data.pop("active", None) instance_data.update({"node_type": "ifd"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index 942d321b92..dd5325c23c 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -24,9 +24,7 @@ class CreateRedshiftROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - for key in ["render_target"]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] + creator_attributes.update(pre_create_data) instance_data.pop("active", None) instance_data.update({"node_type": "Redshift_ROP"}) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index ad181e4f89..5587f0151b 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -23,9 +23,7 @@ class CreateVrayROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - for key in ["render_target"]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] + creator_attributes.update(pre_create_data) instance_data.pop("active", None) instance_data.update({"node_type": "vray_renderer"}) From 90e2c1f1b5235e0d6fd408588a74f69f9cb7ac51 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 21:58:31 +0200 Subject: [PATCH 034/469] use get_product_name instead of hardcoded productname --- .../publish/collect_local_render_instances.py | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index e221990f2b..4622f2d9cd 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -1,5 +1,6 @@ import os import pyblish.api +from ayon_core.pipeline.create import get_product_name class CollectLocalRenderInstances(pyblish.api.InstancePlugin): @@ -28,31 +29,24 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # Create Instance for each AOV. context = instance.context + self.log.debug(instance.data["expectedFiles"]) expectedFiles = next(iter(instance.data["expectedFiles"]), {}) product_type = "render" # is always render - product_group = "render{Task}{productName}".format( - Task=self._capitalize(instance.data["task"]), - productName=self._capitalize(instance.data["productName"]) - ) # is always the group + product_group = get_product_name( + context.data["projectName"], + context.data["taskEntity"]["name"], + context.data["taskEntity"]["taskType"], + context.data["hostName"], + product_type, + instance.data["productName"] + ) for aov_name, aov_filepaths in expectedFiles.items(): - # Some AOV instance data - # label = "{productName}_{AOV}".format( - # AOV=aov_name, - # productName=instance.data["productName"] - # ) - name_template = "render{Task}{productName}_{AOV}" - if not aov_name: - # This is done to remove the trailing `_` - # if aov name is an empty string. - name_template = "render{Task}{productName}" + product_name = product_group - product_name = name_template.format( - Task=self._capitalize(instance.data["task"]), - productName=self._capitalize(instance.data["productName"]), - AOV=aov_name - ) + if aov_name: + product_name = "{}_{}".format(product_name, aov_name) # Create instance for each AOV aov_instance = context.create_instance(product_name) @@ -96,7 +90,3 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # Remove Mantra instance # I can't remove it here as I still need it to trigger the render. # context.remove(instance) - - @staticmethod - def _capitalize(word): - return word[:1].upper() + word[1:] From 95757c6b68776884d481f03e2890b9c0a2ee8107 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 22:16:53 +0200 Subject: [PATCH 035/469] add doc string to _get_camera_path --- .../houdini/plugins/publish/collect_review_data.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py index 7714ed0954..ed2de785a2 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py @@ -59,6 +59,18 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin): burnin_members["focalLength"] = focal_length def _get_camera_path(self, ropnode): + """Get the camera path associated with the given rop node. + + This function evaluates the camera parameter according to the + type of the given rop node. + + Returns: + Union[str, None]: Camera path or None. + + This function can return empty string if the camera + path is empty i.e. no camera path. + """ + if ropnode.type().name() in { "opengl", "karma", "ifd", "arnold" }: @@ -70,4 +82,4 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin): elif ropnode.type().name() == "vray_renderer": return ropnode.parm("render_camera").eval() - return "" + return None From 75879f54be31e293cad18a1c4a8a60005d62ba70 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 22:28:53 +0200 Subject: [PATCH 036/469] revert changes --- .../deadline/plugins/publish/collect_pools.py | 4 ++-- .../publish/submit_houdini_render_deadline.py | 21 ++++++------------- .../plugins/publish/submit_publish_job.py | 8 +++---- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 6b7449b8f8..6923c2b16b 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -41,10 +41,10 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, "renderlayer", "maxrender", "usdrender", - "mantra_rop", - "karma_rop", "redshift_rop", "arnold_rop", + "mantra_rop", + "karma_rop", "vray_rop", "publish.hou"] diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index b562e2848b..64a7423e8d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -71,12 +71,11 @@ class HoudiniSubmitDeadline( order = pyblish.api.IntegratorOrder hosts = ["houdini"] families = ["usdrender", - "mantra_rop", - "karma_rop", "redshift_rop", "arnold_rop", + "mantra_rop", + "karma_rop", "vray_rop"] - targets = ["local"] use_published = True @@ -266,23 +265,20 @@ class HoudiniSubmitDeadline( # Output driver to render if job_type == "render": product_type = instance.data.get("productType") - rop_node = hou.node(instance.data.get("instance_node")) - node_type = rop_node.type().name() - - if node_type == "arnold": + if product_type == "arnold_rop": plugin_info = ArnoldRenderDeadlinePluginInfo( InputFile=instance.data["ifdFile"] ) - elif node_type == "ifd": + elif product_type == "mantra_rop": plugin_info = MantraRenderDeadlinePluginInfo( SceneFile=instance.data["ifdFile"], Version=hou_major_minor, ) - elif node_type == "vray_renderer": + elif product_type == "vray_rop": plugin_info = VrayRenderPluginInfo( InputFilename=instance.data["ifdFile"], ) - elif node_type == "Redshift_ROP": + elif product_type == "redshift_rop": plugin_info = RedshiftRenderPluginInfo( SceneFile=instance.data["ifdFile"] ) @@ -319,11 +315,6 @@ class HoudiniSubmitDeadline( return attr.asdict(plugin_info) def process(self, instance): - if not instance.data["farm"]: - self.log.debug("Render on farm is disabled. " - "Skipping deadline submission.") - return - super(HoudiniSubmitDeadline, self).process(instance) # TODO: Avoid the need for this logic here, needed for submit publish diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 87693522c3..8def9cc63c 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -92,11 +92,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, "prerender.farm", "prerender.frames_farm", "renderlayer", "imagesequence", "vrayscene", "maxrender", - "mantra_rop", - "karma_rop", - "redshift_rop", - "arnold_rop", - "vray_rop"] + "arnold_rop", "mantra_rop", + "karma_rop", "vray_rop", + "redshift_rop"] aov_filter = [ { From 6151ff57e2dc9f5574cb3ddbb8685d4ec69752f0 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 22:30:01 +0200 Subject: [PATCH 037/469] skip submission if farm is disabled --- .../plugins/publish/submit_houdini_render_deadline.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py index 64a7423e8d..4c517d7848 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_houdini_render_deadline.py @@ -315,6 +315,11 @@ class HoudiniSubmitDeadline( return attr.asdict(plugin_info) def process(self, instance): + if not instance.data["farm"]: + self.log.debug("Render on farm is disabled. " + "Skipping deadline submission.") + return + super(HoudiniSubmitDeadline, self).process(instance) # TODO: Avoid the need for this logic here, needed for submit publish From c49c9016bfdafa27a67f7693b72d0a340a909fa1 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 22:35:06 +0200 Subject: [PATCH 038/469] add a TODO about enhancing code readability --- .../hosts/houdini/plugins/publish/extract_local_render.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py index cf94019947..3f332acc55 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py @@ -49,7 +49,8 @@ class ExtractLocalRender(publish.Extractor): # Check missing frames. # Frames won't exist if user cancels the render. expected_files = next(iter(instance.data["expectedFiles"]), {}) - expected_files = sum(expected_files.values(), []) + # TODO: enhance the readability. + expected_files = sum(expected_files.values(), []) missing_frames = [ frame for frame in expected_files From 3b6c3bb5e5fe61361dd2774b1aa07f9a80a0384b Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 9 Apr 2024 22:49:34 +0200 Subject: [PATCH 039/469] remove redundant attr_defs --- .../hosts/houdini/plugins/create/create_arnold_rop.py | 3 +-- .../ayon_core/hosts/houdini/plugins/create/create_karma_rop.py | 3 +-- .../hosts/houdini/plugins/create/create_mantra_rop.py | 3 +-- .../hosts/houdini/plugins/create/create_redshift_rop.py | 3 +-- .../ayon_core/hosts/houdini/plugins/create/create_vray_rop.py | 3 +-- 5 files changed, 5 insertions(+), 10 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index 0e25523123..0965ee59ca 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -92,6 +92,5 @@ class CreateArnoldRop(plugin.HoudiniCreator): ] def get_pre_create_attr_defs(self): - attrs = super(CreateArnoldRop, self).get_pre_create_attr_defs() - return attrs + self.get_instance_attr_defs() + return self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index 4ddf7af376..c795512469 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -126,6 +126,5 @@ class CreateKarmaROP(plugin.HoudiniCreator): def get_pre_create_attr_defs(self): - attrs = super(CreateKarmaROP, self).get_pre_create_attr_defs() - return attrs + self.get_instance_attr_defs() + return self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index 7d481d0dbf..d0fc79f608 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -108,6 +108,5 @@ class CreateMantraROP(plugin.HoudiniCreator): ] def get_pre_create_attr_defs(self): - attrs = super(CreateMantraROP, self).get_pre_create_attr_defs() - return attrs + self.get_instance_attr_defs() + return self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index dd5325c23c..0094269f47 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -151,6 +151,5 @@ class CreateRedshiftROP(plugin.HoudiniCreator): ] def get_pre_create_attr_defs(self): - attrs = super(CreateRedshiftROP, self).get_pre_create_attr_defs() - return attrs + self.get_instance_attr_defs() + return self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index 5587f0151b..8c4084cf9f 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -179,6 +179,5 @@ class CreateVrayROP(plugin.HoudiniCreator): ] def get_pre_create_attr_defs(self): - attrs = super(CreateVrayROP, self).get_pre_create_attr_defs() - return attrs + self.get_instance_attr_defs() + return self.get_instance_attr_defs() From 85140058ee6d4397485b33974abb78f7509a88f0 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 12 Apr 2024 15:34:47 +0100 Subject: [PATCH 040/469] Code cosmetics --- client/ayon_core/hosts/nuke/api/utils.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 9528ad3d4c..a11f6e023b 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -209,16 +209,16 @@ def _submit_headless_farm(node): # Find instance for node and workfile. instance = None instance_workfile = None - for Instance in context: - if Instance.data["family"] == "workfile": - instance_workfile = Instance + for _instance in context: + if _instance.data["family"] == "workfile": + instance_workfile = _instance continue - instance_node = Instance.data["transientData"]["node"] + instance_node = _instance.data["transientData"]["node"] if node.name() == instance_node.name(): - instance = Instance + instance = _instance else: - Instance.data["active"] = False + _instance.data["active"] = False if instance is None: show_message_dialog( From cd45e9a41c3be122d5b8b95ab11f1234dd77bda8 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 12 Apr 2024 15:43:31 +0100 Subject: [PATCH 041/469] docstring --- client/ayon_core/hosts/nuke/api/utils.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index a11f6e023b..56ba581e1c 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -196,6 +196,16 @@ def submit_headless_farm(node): def _submit_headless_farm(node): + """Headless farm submission + + This function prepares the context for farm submission, validates it, + extracts relevant data, copies the current workfile to a timestamped copy, + and submits the job to the farm. + + Args: + node (Node): The node for which the farm submission is being made. + """ + context = util.collect() success, error_report = create_error_report(context) From 4f70d30ea59c2ef6cde9383edea860a7bfc154bb Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 12 Apr 2024 15:47:12 +0100 Subject: [PATCH 042/469] docstring --- client/ayon_core/hosts/nuke/api/utils.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 56ba581e1c..94582f75f1 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -152,6 +152,19 @@ def is_headless(): def create_error_report(context): + """Create an error report based on the given pyblish context. + + This function iterates through the results in the context and formats any + errors into a comprehensive error report. + + Args: + context (dict): Pyblish context. + + Returns: + tuple: A tuple containing a boolean indicating success and a string + representing the error message. + """ + error_message = "" success = True for result in context.data["results"]: From 756e1f93642d47e8e96cdfb55b9d1b51f09b06b9 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 12 Apr 2024 16:42:29 +0100 Subject: [PATCH 043/469] Deactivate workfile instance. --- client/ayon_core/hosts/nuke/api/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 94582f75f1..8f0dfd0713 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -235,6 +235,7 @@ def _submit_headless_farm(node): for _instance in context: if _instance.data["family"] == "workfile": instance_workfile = _instance + _instance.data["active"] = False continue instance_node = _instance.data["transientData"]["node"] From 4fcab3ca36d1efc6d2e56c2ec89c72184a19e1d8 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Mon, 15 Apr 2024 10:26:22 +0100 Subject: [PATCH 044/469] Remove redundant code. --- client/ayon_core/hosts/nuke/api/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 8f0dfd0713..e608863648 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -254,7 +254,6 @@ def _submit_headless_farm(node): # Enable for farm publishing. instance.data["farm"] = True - instance.data["transfer"] = False # Clear the families as we only want the main family, ei. no review etc. instance.data["families"] = [] From bedebd8f8e871665d6b117f5c13c8a20a63ad24a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 15 Apr 2024 12:28:31 +0200 Subject: [PATCH 045/469] add 'Mark as reviewable' todo --- .../plugins/publish/collect_local_render_instances.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 4622f2d9cd..f3ad5862a6 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -63,6 +63,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): if len(aov_filenames) == 1: aov_filenames = aov_filenames[0] + # TODO: Add some option to allow users to mark + # aov_instances as reviewable. aov_instance.data.update({ # 'label': label, "task": instance.data["task"], @@ -72,14 +74,14 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): "productType": product_type, "productName": product_name, "productGroup": product_group, - "families": ["render.local.hou", "review"], + "families": ["render.local.hou"], "instance_node": instance.data["instance_node"], "representations": [ { "stagingDir": staging_dir, "ext": ext, "name": ext, - "tags": ["review"], + "tags": [], "files": aov_filenames, "frameStart": instance.data["frameStartHandle"], "frameEnd": instance.data["frameEndHandle"] From 16c8c859b32c186559e526cbb941842e1fb0b972 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 15 Apr 2024 12:29:58 +0200 Subject: [PATCH 046/469] update a comment --- .../houdini/plugins/publish/collect_local_render_instances.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index f3ad5862a6..ae98e6ed87 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -89,6 +89,6 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): ] }) - # Remove Mantra instance + # Remove original render instance # I can't remove it here as I still need it to trigger the render. # context.remove(instance) From b6a5eadf96828d3a84ff680ccbd590ce90ea11f6 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Mon, 15 Apr 2024 12:26:22 +0100 Subject: [PATCH 047/469] Update client/ayon_core/hosts/nuke/api/lib.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/hosts/nuke/api/lib.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index 63e6ddef0f..aa44f7c98c 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1163,8 +1163,10 @@ def create_write_node( if char in special_characters: found_special_characters.append(char) - msg = f"Special characters found in name \"{name}\": " - msg += f"{' '.join(found_special_characters)}" + msg = ( + f"Special characters found in name \"{name}\": " + f"{' '.join(found_special_characters)}" + ) assert not found_special_characters, msg prenodes = prenodes or [] From 6ef55adaf044a2c3ece228688fdae2cafcb7e5ec Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 15 Apr 2024 21:01:19 +0200 Subject: [PATCH 048/469] add missing key --- .../houdini/plugins/publish/collect_local_render_instances.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index ae98e6ed87..ea1eeb62af 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -72,6 +72,7 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): "frameStart": instance.data["frameStartHandle"], "frameEnd": instance.data["frameEndHandle"], "productType": product_type, + "family": product_type, "productName": product_name, "productGroup": product_group, "families": ["render.local.hou"], From 409c243516c498164cd115de8daea4cdf72d5206 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 15 Apr 2024 21:47:13 +0200 Subject: [PATCH 049/469] update node parameter in the extractor instead of the collector --- .../plugins/publish/collect_arnold_rop.py | 4 +- .../plugins/publish/collect_farm_instances.py | 26 +------ .../plugins/publish/collect_mantra_rop.py | 4 +- .../plugins/publish/collect_redshift_rop.py | 4 +- .../plugins/publish/collect_vray_rop.py | 4 +- .../plugins/publish/extract_local_render.py | 63 ----------------- .../houdini/plugins/publish/extract_render.py | 67 +++++++++++++++++++ 7 files changed, 74 insertions(+), 98 deletions(-) delete mode 100644 client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/extract_render.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py index 7fe38555a3..c373d94653 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py @@ -41,11 +41,9 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): render_products = [] # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("ar_ass_export_enable").eval()) - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "ar_ass_file", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index 391afe7387..c5a982996b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -16,31 +16,8 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): label = "Collect farm instances" def process(self, instance): - import hou creator_attribute = instance.data["creator_attributes"] - product_type = instance.data["productType"] - rop_node = hou.node(instance.data.get("instance_node")) - - # Align split parameter value on rop node to the render target. - if creator_attribute.get("render_target") == "farm_split": - if product_type == "arnold_rop": - rop_node.setParms({"ar_ass_export_enable": 1}) - elif product_type == "mantra_rop": - rop_node.setParms({"soho_outputmode": 1}) - elif product_type == "redshift_rop": - rop_node.setParms({"RS_archive_enable": 1}) - elif product_type == "vray_rop": - rop_node.setParms({"render_export_mode": "2"}) - else: - if product_type == "arnold_rop": - rop_node.setParms({"ar_ass_export_enable": 0}) - elif product_type == "mantra_rop": - rop_node.setParms({"soho_outputmode": 0}) - elif product_type == "redshift_rop": - rop_node.setParms({"RS_archive_enable": 0}) - elif product_type == "vray_rop": - rop_node.setParms({"render_export_mode": "1"}) # Collect Render Target if creator_attribute.get("render_target") not in { @@ -52,3 +29,6 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): return instance.data["farm"] = True + instance.data["splitRender"] = ( + creator_attribute.get("render_target") == "farm_split" + ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py index df9acc4b61..9894e2beda 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py @@ -45,11 +45,9 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): render_products = [] # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("soho_outputmode").eval()) - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "soho_diskfile", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py index 191a9c1ebc..bd01f929c3 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -43,10 +43,8 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("RS_archive_enable").eval()) - instance.data["splitRender"] = split_render export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "RS_archive_file", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py index 62b7dcdd5d..63e16d541d 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py @@ -46,11 +46,9 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): # TODO: add render elements if render element # Store whether we are splitting the render job in an export + render - split_render = rop.parm("render_export_mode").eval() == "2" - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "render_export_filepath", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py deleted file mode 100644 index 3f332acc55..0000000000 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_local_render.py +++ /dev/null @@ -1,63 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop -import hou -import os - - -class ExtractLocalRender(publish.Extractor): - - order = pyblish.api.ExtractorOrder - label = "Extract Local Render" - hosts = ["houdini"] - families = ["mantra_rop", - "karma_rop", - "redshift_rop", - "arnold_rop", - "vray_rop"] - - def process(self, instance): - if instance.data.get("farm"): - self.log.debug("Should be processed on farm, skipping.") - return - - creator_attribute = instance.data["creator_attributes"] - - if creator_attribute.get("render_target") == "local_no_render": - self.log.debug("Skip render is enabled, skipping rendering.") - return - - # Make sure split parameter is turned off. - # Otherwise, render nodes will generate intermediate - # render files instead of render. - product_type = instance.data["productType"] - rop_node = hou.node(instance.data.get("instance_node")) - - if product_type == "arnold_rop": - rop_node.setParms({"ar_ass_export_enable": 0}) - elif product_type == "mantra_rop": - rop_node.setParms({"soho_outputmode": 0}) - elif product_type == "redshift_rop": - rop_node.setParms({"RS_archive_enable": 0}) - elif product_type == "vray_rop": - rop_node.setParms({"render_export_mode": "1"}) - - ropnode = hou.node(instance.data.get("instance_node")) - render_rop(ropnode) - - # Check missing frames. - # Frames won't exist if user cancels the render. - expected_files = next(iter(instance.data["expectedFiles"]), {}) - # TODO: enhance the readability. - expected_files = sum(expected_files.values(), []) - missing_frames = [ - frame - for frame in expected_files - if not os.path.exists(frame) - ] - if missing_frames: - # TODO: Use user friendly error reporting. - raise RuntimeError("Failed to complete render extraction. " - "Missing output files: {}".format( - missing_frames)) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py new file mode 100644 index 0000000000..7ea276a94d --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -0,0 +1,67 @@ +import pyblish.api + +from ayon_core.pipeline import publish +from ayon_core.hosts.houdini.api.lib import render_rop +import hou +import os + + +class ExtractRender(publish.Extractor): + + order = pyblish.api.ExtractorOrder + label = "Extract Render" + hosts = ["houdini"] + families = ["mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop"] + + def process(self, instance): + creator_attribute = instance.data["creator_attributes"] + product_type = instance.data["productType"] + rop_node = hou.node(instance.data.get("instance_node")) + + # Align split parameter value on rop node to the render target. + if creator_attribute.get("render_target") == "farm_split": + if product_type == "arnold_rop": + rop_node.setParms({"ar_ass_export_enable": 1}) + elif product_type == "mantra_rop": + rop_node.setParms({"soho_outputmode": 1}) + elif product_type == "redshift_rop": + rop_node.setParms({"RS_archive_enable": 1}) + elif product_type == "vray_rop": + rop_node.setParms({"render_export_mode": "2"}) + else: + if product_type == "arnold_rop": + rop_node.setParms({"ar_ass_export_enable": 0}) + elif product_type == "mantra_rop": + rop_node.setParms({"soho_outputmode": 0}) + elif product_type == "redshift_rop": + rop_node.setParms({"RS_archive_enable": 0}) + elif product_type == "vray_rop": + rop_node.setParms({"render_export_mode": "1"}) + + if instance.data.get("farm"): + self.log.debug("Render should be processed on farm, skipping local render.") + return + + if creator_attribute.get("render_target") == "local": + ropnode = hou.node(instance.data.get("instance_node")) + render_rop(ropnode) + + # Check missing frames. + # Frames won't exist if user cancels the render. + expected_files = next(iter(instance.data["expectedFiles"]), {}) + # TODO: enhance the readability. + expected_files = sum(expected_files.values(), []) + missing_frames = [ + frame + for frame in expected_files + if not os.path.exists(frame) + ] + if missing_frames: + # TODO: Use user friendly error reporting. + raise RuntimeError("Failed to complete render extraction. " + "Missing output files: {}".format( + missing_frames)) From ca3f3910232fc4077574c8272b222c9014ecd2fe Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 16 Apr 2024 17:55:59 +0200 Subject: [PATCH 050/469] add review support on farm render --- .../plugins/create/create_arnold_rop.py | 6 ++++- .../plugins/create/create_karma_rop.py | 4 ++++ .../plugins/create/create_mantra_rop.py | 4 ++++ .../plugins/create/create_redshift_rop.py | 6 ++++- .../houdini/plugins/create/create_vray_rop.py | 4 ++++ .../plugins/publish/collect_arnold_rop.py | 11 ++++++++++ .../plugins/publish/collect_karma_rop.py | 6 +++++ .../plugins/publish/collect_mantra_rop.py | 10 +++++++++ .../plugins/publish/collect_redshift_rop.py | 11 ++++++++++ .../publish/collect_reviewable_instances.py | 22 +++++++++++++++++++ .../plugins/publish/collect_vray_rop.py | 10 +++++++++ 11 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index 0f2fc89764..d3254a28dd 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -1,5 +1,5 @@ from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef +from ayon_core.lib import EnumDef, BoolDef class CreateArnoldRop(plugin.HoudiniCreator): @@ -81,6 +81,10 @@ class CreateArnoldRop(plugin.HoudiniCreator): } return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), EnumDef("render_target", items=render_target_items, label="Render target", diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index c795512469..0af2fe8aeb 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -103,6 +103,10 @@ class CreateKarmaROP(plugin.HoudiniCreator): } return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), EnumDef("render_target", items=render_target_items, label="Render target", diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index d0fc79f608..eac7f06b90 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -92,6 +92,10 @@ class CreateMantraROP(plugin.HoudiniCreator): } return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), EnumDef("render_target", items=render_target_items, label="Render target", diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index 0094269f47..2a87d2b35c 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -4,7 +4,7 @@ import hou # noqa from ayon_core.pipeline import CreatorError from ayon_core.hosts.houdini.api import plugin -from ayon_core.lib import EnumDef +from ayon_core.lib import EnumDef, BoolDef class CreateRedshiftROP(plugin.HoudiniCreator): @@ -136,6 +136,10 @@ class CreateRedshiftROP(plugin.HoudiniCreator): } return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), EnumDef("render_target", items=render_target_items, label="Render target", diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index 8788af4748..cdaee7db06 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -158,6 +158,10 @@ class CreateVrayROP(plugin.HoudiniCreator): } return [ + BoolDef("review", + label="Review", + tooltip="Mark as reviewable", + default=True), EnumDef("render_target", items=render_target_items, label="Render target", diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py index c373d94653..fa9a1eea0f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py @@ -66,6 +66,9 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): "": self.generate_expected_files(instance, beauty_product) } + # Assume it's a multipartExr Render. + multipartExr = True + num_aovs = rop.evalParm("ar_aovs") for index in range(1, num_aovs + 1): # Skip disabled AOVs @@ -83,6 +86,14 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): files_by_aov[label] = self.generate_expected_files(instance, aov_product) + # Set to False as soon as we have a separated aov. + multipartExr = False + + # Review Logic expects this key to exist and be True + # if render is a multipart Exr. + # As long as we have one AOV then multipartExr should be True. + instance.data["multipartExr"] = multipartExr + for product in render_products: self.log.debug("Found render product: {}".format(product)) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py index 78651b0c69..662ed7ae30 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py @@ -55,6 +55,12 @@ class CollectKarmaROPRenderProducts(pyblish.api.InstancePlugin): beauty_product) } + # Review Logic expects this key to exist and be True + # if render is a multipart Exr. + # As long as we have one AOV then multipartExr should be True. + # By default karma render is a multipart Exr. + instance.data["multipartExr"] = True + filenames = list(render_products) instance.data["files"] = filenames instance.data["renderProducts"] = colorspace.ARenderProduct() diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py index 9894e2beda..e85751c08a 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py @@ -72,6 +72,8 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): beauty_product) } + # Assume it's a multipartExr Render. + multipartExr = True aov_numbers = rop.evalParm("vm_numaux") if aov_numbers > 0: # get the filenames of the AOVs @@ -83,6 +85,9 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): aov_enabled = rop.evalParm(aov_boolean) has_aov_path = rop.evalParm(aov_name) if has_aov_path and aov_enabled == 1: + # Set to False as soon as we have a separated aov. + multipartExr = False + aov_prefix = evalParmNoFrame(rop, aov_name) aov_product = self.get_render_product_name( prefix=aov_prefix, suffix=None @@ -91,6 +96,11 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): files_by_aov[var] = self.generate_expected_files(instance, aov_product) # noqa + # Review Logic expects this key to exist and be True + # if render is a multipart Exr. + # As long as we have one AOV then multipartExr should be True. + instance.data["multipartExr"] = multipartExr + for product in render_products: self.log.debug("Found render product: %s" % product) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py index bd01f929c3..aff9269fa5 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -80,6 +80,9 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): "RS_aovMultipart": True }) + # Assume it's a multipartExr Render. + multipartExr = True + # Default beauty/main layer AOV beauty_product = self.get_render_product_name( prefix=default_prefix, suffix=beauty_suffix @@ -119,6 +122,14 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): files_by_aov[aov_suffix] = self.generate_expected_files(instance, aov_product) # noqa + # Set to False as soon as we have a separated aov. + multipartExr = False + + # Review Logic expects this key to exist and be True + # if render is a multipart Exr. + # As long as we have one AOV then multipartExr should be True. + instance.data["multipartExr"] = multipartExr + for product in render_products: self.log.debug("Found render product: %s" % product) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py new file mode 100644 index 0000000000..78dc5fe11a --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py @@ -0,0 +1,22 @@ +import pyblish.api + + +class CollectReviewableInstances(pyblish.api.InstancePlugin): + """Collect Reviewable Instances. + + Basically, all instances of the specified families + with creator_attribure["review"] + """ + + order = pyblish.api.CollectorOrder + label = "Collect Reviewable Instances" + families = ["mantra_rop", + "karma_rop", + "redshift_rop", + "arnold_rop", + "vray_rop"] + + def process(self, instance): + creator_attribute = instance.data["creator_attributes"] + + instance.data["review"] = creator_attribute.get("review", False) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py index 63e16d541d..2eb5e3164a 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py @@ -68,6 +68,9 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): "": self.generate_expected_files(instance, beauty_product)} + # Assume it's a multipartExr Render. + multipartExr = True + if instance.data.get("RenderElement", True): render_element = self.get_render_element_name(rop, default_prefix) if render_element: @@ -76,6 +79,13 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): files_by_aov[aov] = self.generate_expected_files( instance, renderpass) + # Set to False as soon as we have a separated aov. + multipartExr = False + + # Review Logic expects this key to exist and be True + # if render is a multipart Exr. + # As long as we have one AOV then multipartExr should be True. + instance.data["multipartExr"] = multipartExr for product in render_products: self.log.debug("Found render product: %s" % product) From 1ddf28c752f03752c22066a4714e752bcb5379c7 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 16 Apr 2024 18:18:52 +0200 Subject: [PATCH 051/469] add missing key --- .../hosts/houdini/plugins/publish/collect_farm_instances.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py index c5a982996b..586aa2da57 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py @@ -24,6 +24,7 @@ class CollectFarmInstances(pyblish.api.InstancePlugin): "farm_split", "farm" }: instance.data["farm"] = False + instance.data["splitRender"] = False self.log.debug("Render on farm is disabled. " "Skipping farm collecting.") return From 205fc0ed21f6a2623d2cc38fc82b7dc1c7a3a216 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 16 Apr 2024 18:19:19 +0200 Subject: [PATCH 052/469] add review support on local render --- .../publish/collect_local_render_instances.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index ea1eeb62af..5918366f06 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -63,8 +63,18 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): if len(aov_filenames) == 1: aov_filenames = aov_filenames[0] - # TODO: Add some option to allow users to mark - # aov_instances as reviewable. + preview = False + if instance.data.get("multipartExr", False): + self.log.debug( + "Adding preview tag because its multipartExr" + ) + preview = True + else: + # TODO: set Preview to True if aov_name matched some regex. + # Also, I'm not sure where that regex is defined. + pass + + preview = preview and instance.data.get("review", False) aov_instance.data.update({ # 'label': label, "task": instance.data["task"], @@ -75,14 +85,14 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): "family": product_type, "productName": product_name, "productGroup": product_group, - "families": ["render.local.hou"], + "families": ["render.local.hou", "review"], "instance_node": instance.data["instance_node"], "representations": [ { "stagingDir": staging_dir, "ext": ext, "name": ext, - "tags": [], + "tags": ["review"] if preview else [], "files": aov_filenames, "frameStart": instance.data["frameStartHandle"], "frameEnd": instance.data["frameEndHandle"] From d7d91b62a9d91e72dde457ed0503692e37fb0445 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 17 Apr 2024 15:18:00 +0200 Subject: [PATCH 053/469] add settings for CollectLocalRenderInstances --- .../houdini/server/settings/publish.py | 36 ++++++++++++++++++- server_addon/houdini/server/version.py | 2 +- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 8e0e7f7795..0912ecd997 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -1,4 +1,7 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField +from ayon_server.settings import ( + BaseSettingsModel, + SettingsField +) # Publish Plugins @@ -20,6 +23,25 @@ class CollectChunkSizeModel(BaseSettingsModel): title="Frames Per Task") +class AOVFilterSubmodel(BaseSettingsModel): + value: list[str] = SettingsField( + default_factory=list, + title="AOV regex" + ) + +class CollectLocalRenderInstancesModel(BaseSettingsModel): + + override_deadline_aov_filter: bool = SettingsField( + False, + title="Override Deadline AOV Filter" + ) + + aov_filter: AOVFilterSubmodel = SettingsField( + default_factory=AOVFilterSubmodel, + title="Reviewable products filter" + ) + + class ValidateWorkfilePathsModel(BaseSettingsModel): enabled: bool = SettingsField(title="Enabled") optional: bool = SettingsField(title="Optional") @@ -49,6 +71,10 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=CollectChunkSizeModel, title="Collect Chunk Size." ) + CollectLocalRenderInstances: CollectLocalRenderInstancesModel = SettingsField( + default_factory=CollectLocalRenderInstancesModel, + title="Collect Local Render Instances." + ) ValidateContainers: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, title="Validate Latest Containers.", @@ -82,6 +108,14 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "optional": True, "chunk_size": 999999 }, + "CollectLocalRenderInstances": { + "override_deadline_aov_filter": False, + "aov_filter" : { + "value": [ + ".*([Bb]eauty).*" + ] + } + }, "ValidateContainers": { "enabled": True, "optional": True, diff --git a/server_addon/houdini/server/version.py b/server_addon/houdini/server/version.py index b5c9b6cb71..11ef092868 100644 --- a/server_addon/houdini/server/version.py +++ b/server_addon/houdini/server/version.py @@ -1 +1 @@ -__version__ = "0.2.12" +__version__ = "0.2.13" From 885cfcb203d9874b5ec267c0d8bdd7b228194266 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 17 Apr 2024 16:24:20 +0200 Subject: [PATCH 054/469] apply aov_filter in Houdini local render --- .../publish/collect_local_render_instances.py | 57 ++++++++++++++----- 1 file changed, 44 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 5918366f06..073053188c 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -1,6 +1,11 @@ import os import pyblish.api from ayon_core.pipeline.create import get_product_name +from ayon_core.pipeline.farm.patterning import match_aov_pattern +from ayon_core.pipeline.publish import ( + get_plugin_settings, + apply_plugin_settings_automatically +) class CollectLocalRenderInstances(pyblish.api.InstancePlugin): @@ -20,6 +25,32 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): hosts = ["houdini"] label = "Collect local render instances" + override_deadline_aov_filter = False + aov_filter = {} + + @classmethod + def apply_settings(cls, project_settings): + # Preserve automatic settings applying logic + settings = get_plugin_settings(plugin=cls, + project_settings=project_settings, + log=cls.log, + category="houdini") + apply_plugin_settings_automatically(cls, settings, logger=cls.log) + + if not cls.override_deadline_aov_filter: + # get aov_filter from collector settings + # and restructure it as match_aov_pattern requires. + cls.aov_filter = { + "houdini": cls.aov_filter["value"] + } + else: + # get aov_filter from deadline settings + cls.aov_filter = project_settings["deadline"]["publish"]["ProcessSubmittedJobOnFarm"]["aov_filter"] + cls.aov_filter = { + item["name"]: item["value"] + for item in cls.aov_filter + } + def process(self, instance): if instance.data["farm"]: @@ -29,7 +60,6 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): # Create Instance for each AOV. context = instance.context - self.log.debug(instance.data["expectedFiles"]) expectedFiles = next(iter(instance.data["expectedFiles"]), {}) product_type = "render" # is always render @@ -56,6 +86,19 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): staging_dir = os.path.dirname(aov_filepaths[0]) ext = aov_filepaths[0].split(".")[-1] + # Decide if instance is reviewable + preview = False + if instance.data.get("multipartExr", False): + # Add preview tag because its multipartExr. + preview = True + else: + # Add Preview tag if the AOV matches the filter. + preview = match_aov_pattern( + "houdini", self.aov_filter, aov_filenames[0] + ) + + preview = preview and instance.data.get("review", False) + # Support Single frame. # The integrator wants single files to be a single # filename instead of a list. @@ -63,18 +106,6 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): if len(aov_filenames) == 1: aov_filenames = aov_filenames[0] - preview = False - if instance.data.get("multipartExr", False): - self.log.debug( - "Adding preview tag because its multipartExr" - ) - preview = True - else: - # TODO: set Preview to True if aov_name matched some regex. - # Also, I'm not sure where that regex is defined. - pass - - preview = preview and instance.data.get("review", False) aov_instance.data.update({ # 'label': label, "task": instance.data["task"], From d094f83efbb7e2f2d4c158dafc3ba6cee93a914e Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 18 Apr 2024 17:22:39 +0800 Subject: [PATCH 055/469] make sure the bake animation is boolean option --- client/ayon_core/hosts/maya/api/fbx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/maya/api/fbx.py b/client/ayon_core/hosts/maya/api/fbx.py index 939da4011b..3f1395cb40 100644 --- a/client/ayon_core/hosts/maya/api/fbx.py +++ b/client/ayon_core/hosts/maya/api/fbx.py @@ -47,7 +47,7 @@ class FBXExtractor: "smoothMesh": bool, "instances": bool, # "referencedContainersContent": bool, # deprecated in Maya 2016+ - "bakeComplexAnimation": int, + "bakeComplexAnimation": bool, "bakeComplexStart": int, "bakeComplexEnd": int, "bakeComplexStep": int, From 60468e4d7410ff5021d771a09b1e2e16494e6380 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 19 Apr 2024 16:09:18 +0200 Subject: [PATCH 056/469] enhance the readability of checking missing frames in expectedFiles --- .../houdini/plugins/publish/extract_render.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 7ea276a94d..8a666541cb 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -50,14 +50,21 @@ class ExtractRender(publish.Extractor): ropnode = hou.node(instance.data.get("instance_node")) render_rop(ropnode) + # `ExpectedFiles` is a list that includes one dict. + expected_files = instance.data["expectedFiles"][0] + # Each key in that dict is a list of files. + # Combine lists of files into one big list. + all_frames = [] + for value in expected_files.values(): + if isinstance(value, str): + all_frames.append(value) + elif isinstance(value, list): + all_frames.extend(value) # Check missing frames. # Frames won't exist if user cancels the render. - expected_files = next(iter(instance.data["expectedFiles"]), {}) - # TODO: enhance the readability. - expected_files = sum(expected_files.values(), []) missing_frames = [ frame - for frame in expected_files + for frame in all_frames if not os.path.exists(frame) ] if missing_frames: From e3babf1aed1674812fe25e434781d8f6b93e9d02 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 19 Apr 2024 20:25:31 +0200 Subject: [PATCH 057/469] Maya: Implement workfile template assign look placeholder --- .../template/assign_look_placeholder.py | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 client/ayon_core/hosts/maya/plugins/template/assign_look_placeholder.py diff --git a/client/ayon_core/hosts/maya/plugins/template/assign_look_placeholder.py b/client/ayon_core/hosts/maya/plugins/template/assign_look_placeholder.py new file mode 100644 index 0000000000..c5d4969c09 --- /dev/null +++ b/client/ayon_core/hosts/maya/plugins/template/assign_look_placeholder.py @@ -0,0 +1,127 @@ +from maya import cmds + +from ayon_core.lib import ( + UISeparatorDef, + UILabelDef, + TextDef, + BoolDef +) +from ayon_core.lib.events import weakref_partial +from ayon_core.hosts.maya.api.workfile_template_builder import ( + MayaPlaceholderPlugin, +) +from ayon_core.hosts.maya.api.lib import ( + get_all_children, + assign_look, +) + + +class AssignLookPlaceholderPlugin(MayaPlaceholderPlugin): + """Assign a look product to members of the placeholder set. + + Creates an objectSet. Any members will get the look assigned with the given + product name if it exists. + + Any containers loaded from other template placeholders will get the look + assigned to their loaded containers. + + """ + + identifier = "maya.assignlook" + label = "Assign Look" + + def get_placeholder_options(self, options=None): + options = options or {} + return [ + UISeparatorDef(), + UILabelDef(label="Description"), + UISeparatorDef(), + UILabelDef( + label=( + "Creates an objectSet. Any members will get the look\n" + "assigned with the given product name if it exists.\n\n" + "Any containers loaded from other template placeholders\n" + "will get the look assigned to their loaded containers." + "" + ) + ), + UISeparatorDef(), + UILabelDef(label="Settings"), + UISeparatorDef(), + TextDef( + "product_name", + label="Product Name", + tooltip="Look product to assign to containers loaded by " + "contained placeholders", + multiline=False, + default=options.get("product_name", "lookMain") + ), + BoolDef( + "recurse", + label="Recursive", + tooltip="Assign look also to potential sub containers / " + "placeholders loaded from the load placeholder.", + default=options.get("recurse", False) + ), + ] + + def create_placeholder(self, placeholder_data): + placeholder_data["plugin_identifier"] = self.identifier + + # Create maya objectSet on selection + selection = cmds.ls(selection=True, long=True) + product_name = placeholder_data["product_name"] + name = "AssignLook_{}".format(product_name) + node = cmds.sets(selection, name=name) + + self.imprint(node, placeholder_data) + + def populate_placeholder(self, placeholder): + callback = weakref_partial(self.assign_look, placeholder) + self.builder.register_on_depth_processed_callback( + callback, order=placeholder.order) + + # If placeholder should be deleted, delete it after finish + if not placeholder.data.get("keep_placeholder", True): + delete_callback = weakref_partial(self.delete_placeholder, + placeholder) + self.builder.register_on_finished_callback( + delete_callback, order=placeholder.order) + + def assign_look(self, placeholder): + if placeholder.data.get("finished", False): + # If not recursive we mark it finished after the first depth + # iteration - otherwise run it again to find any new members + return + + product_name = placeholder.data["product_name"] + assert product_name, "Must have defined look product name to assign" + + members = cmds.ls( + cmds.sets(placeholder.scene_identifier, query=True), long=True + ) + if not members: + return + + # Allow any children of members in the set to get assignments, + # e.g. when a group is included there. Whenever a load placeholder + # finishes it also adds loaded content into the object set the + # placeholder was in, so this will also assign to loaded content + # during this build. + assign_nodes = set(members) + assign_nodes.update(get_all_children(members)) + + processed = placeholder.data.setdefault("processed", set()) + assign_nodes.difference_update(processed) + processed.update(assign_nodes) + + if assign_nodes: + self.log.info( + "Assigning look {} for placeholder: {}".format(product_name, + placeholder) + ) + assign_nodes = list(assign_nodes) + assign_look(assign_nodes, product_name=product_name) + + if not placeholder.data.get("recurse", False): + placeholder.data["finished"] = True From 20bc9560ec3b6fb704eea4941052c73af7d01fd6 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 19 Apr 2024 22:37:19 +0200 Subject: [PATCH 058/469] Refactor adding callbacks --- .../maya/plugins/workfile_build/assign_look_placeholder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/maya/plugins/workfile_build/assign_look_placeholder.py b/client/ayon_core/hosts/maya/plugins/workfile_build/assign_look_placeholder.py index c5d4969c09..8c888a1a1f 100644 --- a/client/ayon_core/hosts/maya/plugins/workfile_build/assign_look_placeholder.py +++ b/client/ayon_core/hosts/maya/plugins/workfile_build/assign_look_placeholder.py @@ -78,14 +78,14 @@ class AssignLookPlaceholderPlugin(MayaPlaceholderPlugin): def populate_placeholder(self, placeholder): callback = weakref_partial(self.assign_look, placeholder) - self.builder.register_on_depth_processed_callback( + self.builder.add_on_depth_processed_callback( callback, order=placeholder.order) # If placeholder should be deleted, delete it after finish if not placeholder.data.get("keep_placeholder", True): delete_callback = weakref_partial(self.delete_placeholder, placeholder) - self.builder.register_on_finished_callback( + self.builder.add_on_finished_callback( delete_callback, order=placeholder.order) def assign_look(self, placeholder): From 6e548a83c9d40be1012201160bb794eec50da6d5 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 23 Apr 2024 21:21:30 +0200 Subject: [PATCH 059/469] expose 'render_target' and 'review' creator attributes in publish tab only --- .../plugins/create/create_arnold_rop.py | 28 ++++++++----- .../plugins/create/create_karma_rop.py | 35 +++++++++++------ .../plugins/create/create_mantra_rop.py | 32 ++++++++++----- .../plugins/create/create_redshift_rop.py | 39 ++++++++++++------- .../houdini/plugins/create/create_vray_rop.py | 35 +++++++++++------ 5 files changed, 115 insertions(+), 54 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py index d3254a28dd..1208cfc1ea 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py @@ -21,7 +21,9 @@ class CreateArnoldRop(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - creator_attributes.update(pre_create_data) + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] # Remove the active, we are checking the bypass flag of the nodes instance_data.pop("active", None) @@ -69,10 +71,12 @@ class CreateArnoldRop(plugin.HoudiniCreator): self.lock_parameters(instance_node, to_lock) def get_instance_attr_defs(self): - image_format_enum = [ - "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", - "rad", "rat", "rta", "sgi", "tga", "tif", - ] + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + render_target_items = { "local": "Local machine rendering", "local_no_render": "Use existing frames (local)", @@ -89,12 +93,18 @@ class CreateArnoldRop(plugin.HoudiniCreator): items=render_target_items, label="Render target", default=self.render_target), + ] + + def get_pre_create_attr_defs(self): + image_format_enum = [ + "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", + "rad", "rat", "rta", "sgi", "tga", "tif", + ] + + attrs = [ EnumDef("image_format", image_format_enum, default=self.ext, label="Image Format Options"), ] - - def get_pre_create_attr_defs(self): - - return self.get_instance_attr_defs() + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py index 0af2fe8aeb..48cf5057ab 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py @@ -19,7 +19,10 @@ class CreateKarmaROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - creator_attributes.update(pre_create_data) + + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "karma"}) @@ -92,10 +95,12 @@ class CreateKarmaROP(plugin.HoudiniCreator): self.lock_parameters(instance_node, to_lock) def get_instance_attr_defs(self): - image_format_enum = [ - "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", - "rad", "rat", "rta", "sgi", "tga", "tif", - ] + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + render_target_items = { "local": "Local machine rendering", "local_no_render": "Use existing frames (local)", @@ -110,7 +115,19 @@ class CreateKarmaROP(plugin.HoudiniCreator): EnumDef("render_target", items=render_target_items, label="Render target", - default=self.render_target), + default=self.render_target) + ] + + + def get_pre_create_attr_defs(self): + image_format_enum = [ + "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", + "rad", "rat", "rta", "sgi", "tga", "tif", + ] + + attrs = super(CreateKarmaROP, self).get_pre_create_attr_defs() + + attrs += [ EnumDef("image_format", image_format_enum, default="exr", @@ -127,8 +144,4 @@ class CreateKarmaROP(plugin.HoudiniCreator): label="Camera Resolution", default=False), ] - - - def get_pre_create_attr_defs(self): - - return self.get_instance_attr_defs() + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py index eac7f06b90..05b4431aba 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py @@ -19,7 +19,9 @@ class CreateMantraROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - creator_attributes.update(pre_create_data) + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "ifd"}) @@ -80,10 +82,12 @@ class CreateMantraROP(plugin.HoudiniCreator): self.lock_parameters(instance_node, to_lock) def get_instance_attr_defs(self): - image_format_enum = [ - "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", - "rad", "rat", "rta", "sgi", "tga", "tif", - ] + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + render_target_items = { "local": "Local machine rendering", "local_no_render": "Use existing frames (local)", @@ -99,7 +103,18 @@ class CreateMantraROP(plugin.HoudiniCreator): EnumDef("render_target", items=render_target_items, label="Render target", - default=self.render_target), + default=self.render_target) + ] + + def get_pre_create_attr_defs(self): + image_format_enum = [ + "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", + "rad", "rat", "rta", "sgi", "tga", "tif", + ] + + attrs = super(CreateMantraROP, self).get_pre_create_attr_defs() + + attrs += [ EnumDef("image_format", image_format_enum, default="exr", @@ -110,7 +125,4 @@ class CreateMantraROP(plugin.HoudiniCreator): "resolution, recommended for IPR.", default=False), ] - - def get_pre_create_attr_defs(self): - - return self.get_instance_attr_defs() + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py index 2a87d2b35c..3ecb09ee9b 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py @@ -24,7 +24,9 @@ class CreateRedshiftROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - creator_attributes.update(pre_create_data) + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "Redshift_ROP"}) @@ -121,13 +123,12 @@ class CreateRedshiftROP(plugin.HoudiniCreator): return super(CreateRedshiftROP, self).remove_instances(instances) def get_instance_attr_defs(self): - image_format_enum = [ - "exr", "tif", "jpg", "png", - ] - multi_layered_mode = [ - "No Multi-Layered EXR File", - "Full Multi-Layered EXR File" - ] + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + render_target_items = { "local": "Local machine rendering", "local_no_render": "Use existing frames (local)", @@ -143,7 +144,22 @@ class CreateRedshiftROP(plugin.HoudiniCreator): EnumDef("render_target", items=render_target_items, label="Render target", - default=self.render_target), + default=self.render_target) + ] + + def get_pre_create_attr_defs(self): + + image_format_enum = [ + "exr", "tif", "jpg", "png", + ] + + multi_layered_mode = [ + "No Multi-Layered EXR File", + "Full Multi-Layered EXR File" + ] + + attrs = super(CreateRedshiftROP, self).get_pre_create_attr_defs() + attrs += [ EnumDef("image_format", image_format_enum, default=self.ext, @@ -153,7 +169,4 @@ class CreateRedshiftROP(plugin.HoudiniCreator): default=self.multi_layered_mode, label="Multi-Layered EXR"), ] - - def get_pre_create_attr_defs(self): - - return self.get_instance_attr_defs() + return attrs + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py index cdaee7db06..9e4633e745 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py @@ -23,7 +23,9 @@ class CreateVrayROP(plugin.HoudiniCreator): # Transfer settings from pre create to instance creator_attributes = instance_data.setdefault( "creator_attributes", dict()) - creator_attributes.update(pre_create_data) + for key in ["render_target", "review"]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] instance_data.pop("active", None) instance_data.update({"node_type": "vray_renderer"}) @@ -146,10 +148,13 @@ class CreateVrayROP(plugin.HoudiniCreator): return super(CreateVrayROP, self).remove_instances(instances) def get_instance_attr_defs(self): - image_format_enum = [ - "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", - "rad", "rat", "rta", "sgi", "tga", "tif", - ] + """get instance attribute definitions. + + Attributes defined in this method are exposed in + publish tab in the publisher UI. + """ + + render_target_items = { "local": "Local machine rendering", "local_no_render": "Use existing frames (local)", @@ -165,7 +170,18 @@ class CreateVrayROP(plugin.HoudiniCreator): EnumDef("render_target", items=render_target_items, label="Render target", - default=self.render_target), + default=self.render_target) + ] + + def get_pre_create_attr_defs(self): + image_format_enum = [ + "bmp", "cin", "exr", "jpg", "pic", "pic.gz", "png", + "rad", "rat", "rta", "sgi", "tga", "tif", + ] + + attrs = super(CreateVrayROP, self).get_pre_create_attr_defs() + + attrs += [ EnumDef("image_format", image_format_enum, default=self.ext, @@ -179,9 +195,6 @@ class CreateVrayROP(plugin.HoudiniCreator): label="Render Element", tooltip="Create Render Element Node " "if enabled", - default=False), + default=False) ] - - def get_pre_create_attr_defs(self): - - return self.get_instance_attr_defs() + return attrs + self.get_instance_attr_defs() From 74fe21a2b3b6db779390966c3041fe6aef0b6bfa Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 23 Apr 2024 21:30:38 +0200 Subject: [PATCH 060/469] revert changes - add only 'multipartExr' flag --- .../plugins/publish/collect_arnold_rop.py | 6 +++- .../plugins/publish/collect_mantra_rop.py | 13 +++++--- .../plugins/publish/collect_redshift_rop.py | 30 +++++-------------- .../plugins/publish/collect_vray_rop.py | 5 ++-- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py index fa9a1eea0f..3a65b8d026 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py @@ -41,9 +41,11 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): render_products = [] # Store whether we are splitting the render job (export + render) + split_render = bool(rop.parm("ar_ass_export_enable").eval()) + instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if instance.data["splitRender"]: + if split_render: export_prefix = evalParmNoFrame( rop, "ar_ass_file", pad_character="0" ) @@ -70,6 +72,8 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): multipartExr = True num_aovs = rop.evalParm("ar_aovs") + # TODO: Check the following logic. + # as it always assumes that all AOV are not merged. for index in range(1, num_aovs + 1): # Skip disabled AOVs if not rop.evalParm("ar_enable_aov{}".format(index)): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py index e85751c08a..6112f0a581 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py @@ -45,9 +45,11 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): render_products = [] # Store whether we are splitting the render job (export + render) + split_render = bool(rop.parm("soho_outputmode").eval()) + instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if instance.data["splitRender"]: + if split_render: export_prefix = evalParmNoFrame( rop, "soho_diskfile", pad_character="0" ) @@ -74,6 +76,9 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): # Assume it's a multipartExr Render. multipartExr = True + + # TODO: This logic doesn't take into considerations + # cryptomatte defined in 'Images > Cryptomatte' aov_numbers = rop.evalParm("vm_numaux") if aov_numbers > 0: # get the filenames of the AOVs @@ -85,9 +90,6 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): aov_enabled = rop.evalParm(aov_boolean) has_aov_path = rop.evalParm(aov_name) if has_aov_path and aov_enabled == 1: - # Set to False as soon as we have a separated aov. - multipartExr = False - aov_prefix = evalParmNoFrame(rop, aov_name) aov_product = self.get_render_product_name( prefix=aov_prefix, suffix=None @@ -96,6 +98,9 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): files_by_aov[var] = self.generate_expected_files(instance, aov_product) # noqa + # Set to False as soon as we have a separated aov. + multipartExr = False + # Review Logic expects this key to exist and be True # if render is a multipart Exr. # As long as we have one AOV then multipartExr should be True. diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py index aff9269fa5..89868b1c33 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -43,8 +43,10 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") # Store whether we are splitting the render job (export + render) + split_render = bool(rop.parm("RS_archive_enable").eval()) + instance.data["splitRender"] = split_render export_products = [] - if instance.data["splitRender"]: + if split_render: export_prefix = evalParmNoFrame( rop, "RS_archive_file", pad_character="0" ) @@ -58,27 +60,11 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): instance.data["ifdFile"] = beauty_export_product instance.data["exportFiles"] = list(export_products) - # Set MultiLayer Mode. - creator_attribute = instance.data["creator_attributes"] - ext = creator_attribute.get("image_format") - multi_layered_mode = creator_attribute.get("multi_layered_mode") - full_exr_mode = False - if ext == "exr": - if multi_layered_mode == "No Multi-Layered EXR File": - rop.setParms({ - "RS_outputMultilayerMode": "1", - "RS_aovMultipart": False - }) - full_exr_mode = True - # Ignore beauty suffix if full mode is enabled - # As this is what the rop does. - beauty_suffix = "" - - elif multi_layered_mode == "Full Multi-Layered EXR File": - rop.setParms({ - "RS_outputMultilayerMode": "2", - "RS_aovMultipart": True - }) + full_exr_mode = (rop.evalParm("RS_outputMultilayerMode") == "2") + if full_exr_mode: + # Ignore beauty suffix if full mode is enabled + # As this is what the rop does. + beauty_suffix = "" # Assume it's a multipartExr Render. multipartExr = True diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py index 2eb5e3164a..13478a9d2b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py @@ -46,9 +46,11 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): # TODO: add render elements if render element # Store whether we are splitting the render job in an export + render + split_render = rop.parm("render_export_mode").eval() == "2" + instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if instance.data["splitRender"]: + if split_render: export_prefix = evalParmNoFrame( rop, "render_export_filepath", pad_character="0" ) @@ -78,7 +80,6 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): render_products.append(renderpass) files_by_aov[aov] = self.generate_expected_files( instance, renderpass) - # Set to False as soon as we have a separated aov. multipartExr = False From effedd82c8ddb511d844dcdef8724c4c63c2355f Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 23 Apr 2024 21:30:58 +0200 Subject: [PATCH 061/469] fix bug with aov_filter --- .../plugins/publish/collect_local_render_instances.py | 9 +++++---- server_addon/houdini/server/settings/publish.py | 9 ++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 073053188c..5a446fa0d3 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -25,8 +25,9 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): hosts = ["houdini"] label = "Collect local render instances" - override_deadline_aov_filter = False - aov_filter = {} + use_deadline_aov_filter = False + aov_filter = {"host_name": "houdini", + "value": [".*([Bb]eauty).*"]} @classmethod def apply_settings(cls, project_settings): @@ -37,11 +38,11 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): category="houdini") apply_plugin_settings_automatically(cls, settings, logger=cls.log) - if not cls.override_deadline_aov_filter: + if not cls.use_deadline_aov_filter: # get aov_filter from collector settings # and restructure it as match_aov_pattern requires. cls.aov_filter = { - "houdini": cls.aov_filter["value"] + cls.aov_filter["host_name"]: cls.aov_filter["value"] } else: # get aov_filter from deadline settings diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 0912ecd997..9e8e796aff 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -24,6 +24,8 @@ class CollectChunkSizeModel(BaseSettingsModel): class AOVFilterSubmodel(BaseSettingsModel): + """You should use the same host name you are using for Houdini.""" + host_name: str = SettingsField("", title="Houdini Host name") value: list[str] = SettingsField( default_factory=list, title="AOV regex" @@ -31,9 +33,9 @@ class AOVFilterSubmodel(BaseSettingsModel): class CollectLocalRenderInstancesModel(BaseSettingsModel): - override_deadline_aov_filter: bool = SettingsField( + use_deadline_aov_filter: bool = SettingsField( False, - title="Override Deadline AOV Filter" + title="Use Deadline AOV Filter" ) aov_filter: AOVFilterSubmodel = SettingsField( @@ -109,8 +111,9 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "chunk_size": 999999 }, "CollectLocalRenderInstances": { - "override_deadline_aov_filter": False, + "use_deadline_aov_filter": False, "aov_filter" : { + "host_name": "houdini", "value": [ ".*([Bb]eauty).*" ] From 47b27ce009ee2c8c5b50e10ac3ee32c91f292a8e Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 23 Apr 2024 22:16:24 +0200 Subject: [PATCH 062/469] use 'creator_attributes' as the source of truth - use extract render to adjust parameters accordingly --- .../hosts/houdini/plugins/publish/collect_arnold_rop.py | 5 +---- .../hosts/houdini/plugins/publish/collect_mantra_rop.py | 5 +---- .../hosts/houdini/plugins/publish/collect_redshift_rop.py | 6 ++---- .../hosts/houdini/plugins/publish/collect_vray_rop.py | 5 +---- .../hosts/houdini/plugins/publish/extract_render.py | 2 +- 5 files changed, 6 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py index 3a65b8d026..53a3e52717 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py @@ -40,12 +40,9 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "ar_picture") render_products = [] - # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("ar_ass_export_enable").eval()) - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "ar_ass_file", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py index 6112f0a581..7b247768fc 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py @@ -44,12 +44,9 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "vm_picture") render_products = [] - # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("soho_outputmode").eval()) - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "soho_diskfile", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py index 89868b1c33..ce90ae2413 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py @@ -42,11 +42,9 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): default_prefix = evalParmNoFrame(rop, "RS_outputFileNamePrefix") beauty_suffix = rop.evalParm("RS_outputBeautyAOVSuffix") - # Store whether we are splitting the render job (export + render) - split_render = bool(rop.parm("RS_archive_enable").eval()) - instance.data["splitRender"] = split_render + export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "RS_archive_file", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py index 13478a9d2b..c39b1db103 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py @@ -45,12 +45,9 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): render_products = [] # TODO: add render elements if render element - # Store whether we are splitting the render job in an export + render - split_render = rop.parm("render_export_mode").eval() == "2" - instance.data["splitRender"] = split_render export_prefix = None export_products = [] - if split_render: + if instance.data["splitRender"]: export_prefix = evalParmNoFrame( rop, "render_export_filepath", pad_character="0" ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 8a666541cb..7b4762a25f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -23,7 +23,7 @@ class ExtractRender(publish.Extractor): rop_node = hou.node(instance.data.get("instance_node")) # Align split parameter value on rop node to the render target. - if creator_attribute.get("render_target") == "farm_split": + if instance.data["splitRender"]: if product_type == "arnold_rop": rop_node.setParms({"ar_ass_export_enable": 1}) elif product_type == "mantra_rop": From e04c9285f1a1dcc4eaa3560ad964b057d9dc3478 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 23 Apr 2024 22:32:04 +0200 Subject: [PATCH 063/469] add a TODO about running plugins over wrong isntances --- .../hosts/houdini/plugins/publish/extract_opengl.py | 6 ++++++ .../houdini/plugins/publish/validate_review_colorspace.py | 5 +++++ .../hosts/houdini/plugins/publish/validate_scene_review.py | 6 ++++++ 3 files changed, 17 insertions(+) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py index 69bbb22340..d3b4b094b2 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py @@ -17,6 +17,12 @@ class ExtractOpenGL(publish.Extractor): def process(self, instance): ropnode = hou.node(instance.data.get("instance_node")) + + # This plugin is triggered when marking render as reviewable. + # Therefore, this plugin will run on over wrong instances. + # TODO: Don't run this plugin on wrong instances. + # This plugin should run only on review product type + # with instance node of opengl type. if ropnode.type().name() != "opengl": self.log.debug("Skipping OpenGl extraction. Rop node {} " "is not an OpenGl node.".format(ropnode.path())) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py index e02ce93f0d..691b54ac05 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py @@ -35,6 +35,11 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin, rop_node = hou.node(instance.data["instance_node"]) + # This plugin is triggered when marking render as reviewable. + # Therefore, this plugin will run on over wrong instances. + # TODO: Don't run this plugin on wrong instances. + # This plugin should run only on review product type + # with instance node of opengl type. if rop_node.type().name() != "opengl": self.log.debug("Skipping Validation. Rop node {} " "is not an OpenGl node.".format(rop_node.path())) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py index 9b81f0f8ed..0b09306b0d 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py @@ -19,6 +19,12 @@ class ValidateSceneReview(pyblish.api.InstancePlugin): report = [] instance_node = hou.node(instance.data.get("instance_node")) + + # This plugin is triggered when marking render as reviewable. + # Therefore, this plugin will run on over wrong instances. + # TODO: Don't run this plugin on wrong instances. + # This plugin should run only on review product type + # with instance node of opengl type. if instance_node.type().name() != "opengl": self.log.debug("Skipping Validation. Rop node {} " "is not an OpenGl node.".format(instance_node.path())) From 8110a601bbc0d114c1bcd22be8122cc591ef51a7 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 25 Apr 2024 11:02:31 +0200 Subject: [PATCH 064/469] add CollectLocalRenderInstances setting --- server_addon/houdini/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 4b72af2a89..4e441c76ae 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,3 @@ name = "houdini" title = "Houdini" -version = "0.2.12" +version = "0.2.13" From 767bbf070fb1a389f217d9e8b37d3c07a5e85f5f Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 29 Apr 2024 10:39:16 +0300 Subject: [PATCH 065/469] add CollectLocalRenderInstances setting --- server_addon/houdini/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 4e441c76ae..6c81eba439 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,3 @@ name = "houdini" title = "Houdini" -version = "0.2.13" +version = "0.2.14" From e6b3492cc54b6a8d2d2642e81faaaedfcae43944 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 30 Apr 2024 06:36:33 +0200 Subject: [PATCH 066/469] Preserve time units on load and update with `MayaUSDReferenceLoader` --- .../hosts/maya/plugins/load/load_reference.py | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/maya/plugins/load/load_reference.py b/client/ayon_core/hosts/maya/plugins/load/load_reference.py index 847591bd11..a26982ddfa 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_reference.py +++ b/client/ayon_core/hosts/maya/plugins/load/load_reference.py @@ -14,6 +14,26 @@ from ayon_core.hosts.maya.api.lib import ( ) +@contextlib.contextmanager +def preserve_time_units(): + """Preserve current frame, frame range and fps""" + frame = cmds.currentTime(query=True) + fps = cmds.currentUnit(query=True, time=True) + start = cmds.playbackOptions(query=True, minTime=True) + end = cmds.playbackOptions(query=True, maxTime=True) + anim_start = cmds.playbackOptions(query=True, animationStartTime=True) + anim_end = cmds.playbackOptions(query=True, animationEndTime=True) + try: + yield + finally: + cmds.currentUnit(time=fps, updateAnimation=False) + cmds.currentTime(frame) + cmds.playbackOptions(minTime=start, + maxTime=end, + animationStartTime=anim_start, + animationEndTime=anim_end) + + @contextlib.contextmanager def preserve_modelpanel_cameras(container, log=None): """Preserve camera members of container in the modelPanels. @@ -349,6 +369,15 @@ class MayaUSDReferenceLoader(ReferenceLoader): ]) options["file_type"] = self.file_type - return super(MayaUSDReferenceLoader, self).process_reference( - context, name, namespace, options - ) + # Maya USD import reference has the tendency to change the time slider + # range and current frame, so we force revert it after + with preserve_time_units(): + return super(MayaUSDReferenceLoader, self).process_reference( + context, name, namespace, options + ) + + def update(self, container, context): + # Maya USD import reference has the tendency to change the time slider + # range and current frame, so we force revert it after + with preserve_time_units(): + super(MayaUSDReferenceLoader, self).update(container, context) From cf9707db85f637b3549a3b84ec30aca2ddeea400 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 30 Apr 2024 11:25:04 +0200 Subject: [PATCH 067/469] Refactor OCIO config settings and profiles Added new OCIO config profile types and paths for built-in and custom configurations. Updated default values accordingly. --- server/settings/main.py | 138 +++++++++++++++++++++++++++------------- 1 file changed, 95 insertions(+), 43 deletions(-) diff --git a/server/settings/main.py b/server/settings/main.py index 28a69e182d..85c1779999 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -54,9 +54,66 @@ class CoreImageIOFileRulesModel(BaseSettingsModel): return value -class CoreImageIOConfigModel(BaseSettingsModel): - filepath: list[str] = SettingsField( - default_factory=list, title="Config path" +_ocio_config_profile_types = [ + {"value": "buildin_path", "label": "Ayon built-in OCIO config"}, + {"value": "custom_path", "label": "Path to OCIO config"}, + {"value": "product", "label": "Published product"}, +] + + +def _ocio_build_in_paths(): + return [ + { + "value": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", + "label": "ACES 1.2", + "description": "Aces 1.2 OCIO config file." + }, + { + "value": "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", + "label": "Nuke default", + }, + ] + + +class CoreImageIOConfigProfilesModel(BaseSettingsModel): + host_names: list[str] = SettingsField( + default_factory=list, + title="Host names" + ) + task_types: list[str] = SettingsField( + default_factory=list, + title="Task types", + enum_resolver=task_types_enum + ) + task_names: list[str] = SettingsField( + default_factory=list, + title="Task names" + ) + type: str = SettingsField( + title="Profile type", + enum_resolver=lambda: _ocio_config_profile_types, + conditionalEnum=True, + default="buildin_path", + section="---", + ) + + buildin_path: str = SettingsField( + "ACES 1.2", + title="Built-in OCIO config", + enum_resolver=_ocio_build_in_paths, + ) + custom_path: str = SettingsField( + "", + title="OCIO config path", + description="Path to OCIO config. Anatomy formatting is supported.", + ) + product: str = SettingsField( + "", + title="Product name", + description=( + "Published product name to get OCIO config from. " + "Partial match is supported." + ), ) @@ -65,9 +122,8 @@ class CoreImageIOBaseModel(BaseSettingsModel): False, title="Enable Color Management" ) - ocio_config: CoreImageIOConfigModel = SettingsField( - default_factory=CoreImageIOConfigModel, - title="OCIO config" + ocio_config_profiles: list[CoreImageIOConfigProfilesModel] = SettingsField( + default_factory=list, title="OCIO config profiles" ) file_rules: CoreImageIOFileRulesModel = SettingsField( default_factory=CoreImageIOFileRulesModel, @@ -186,12 +242,17 @@ class CoreSettings(BaseSettingsModel): DEFAULT_VALUES = { "imageio": { "activate_global_color_management": False, - "ocio_config": { - "filepath": [ - "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", - "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio" - ] - }, + "ocio_config_profiles": [ + { + "host_names": [], + "task_types": [], + "task_names": [], + "type": "buildin_path", + "buildin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", + "custom_path": "", + "product": "", + } + ], "file_rules": { "activate_global_file_rules": False, "rules": [ @@ -199,42 +260,33 @@ DEFAULT_VALUES = { "name": "example", "pattern": ".*(beauty).*", "colorspace": "ACES - ACEScg", - "ext": "exr" + "ext": "exr", } - ] - } + ], + }, }, "studio_name": "", "studio_code": "", - "environments": "{\n\"STUDIO_SW\": {\n \"darwin\": \"/mnt/REPO_SW\",\n \"linux\": \"/mnt/REPO_SW\",\n \"windows\": \"P:/REPO_SW\"\n }\n}", + "environments": '{\n"STUDIO_SW": {\n "darwin": "/mnt/REPO_SW",\n "linux": "/mnt/REPO_SW",\n "windows": "P:/REPO_SW"\n }\n}', "tools": DEFAULT_TOOLS_VALUES, - "version_start_category": { - "profiles": [] - }, + "version_start_category": {"profiles": []}, "publish": DEFAULT_PUBLISH_VALUES, - "project_folder_structure": json.dumps({ - "__project_root__": { - "prod": {}, - "resources": { - "footage": { - "plates": {}, - "offline": {} + "project_folder_structure": json.dumps( + { + "__project_root__": { + "prod": {}, + "resources": { + "footage": {"plates": {}, "offline": {}}, + "audio": {}, + "art_dept": {}, }, - "audio": {}, - "art_dept": {} - }, - "editorial": {}, - "assets": { - "characters": {}, - "locations": {} - }, - "shots": {} - } - }, indent=4), - "project_plugins": { - "windows": [], - "darwin": [], - "linux": [] - }, - "project_environments": "{}" + "editorial": {}, + "assets": {"characters": {}, "locations": {}}, + "shots": {}, + } + }, + indent=4, + ), + "project_plugins": {"windows": [], "darwin": [], "linux": []}, + "project_environments": "{}", } From 2bf86369801a0d6e9d6041a35e839745517b1ccf Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 30 Apr 2024 14:19:23 +0300 Subject: [PATCH 068/469] update inline docs for applications and only_available --- server_addon/applications/server/settings.py | 21 ++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index 5743e9f471..53b547ce13 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -144,7 +144,17 @@ class ToolGroupModel(BaseSettingsModel): class ApplicationsSettings(BaseSettingsModel): - """Applications settings""" + """Applications settings + + Define applications are available to your studio, locations of their + executables, and their additional environments. + + AYON uses the following definitions to populate the applications list + in project anatomy > attributes. + So, You'd still need modify your project anatomy settings. + + Use shortcut **a+a** to navigate to project anatomy. + """ maya: AppGroupWithPython = SettingsField( default_factory=AppGroupWithPython, title="Autodesk Maya") @@ -210,7 +220,14 @@ class ApplicationsAddonSettings(BaseSettingsModel): scope=["studio"] ) only_available: bool = SettingsField( - True, title="Show only available applications") + True, + title="Show only available applications", + description="Enable to show available applications in AYON Launcher" + " i.e. Show them if they are installed on the user" + " machine. Note: AYON Launcher shows only the selected" + " applications in project anatomy and this is another" + " filter to ignore uninstalled apps." + ) @validator("tool_groups") def validate_unique_name(cls, value): From 639d83755f3b5d37d58c1fbf04525020d4c49f71 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Tue, 30 Apr 2024 16:24:19 +0300 Subject: [PATCH 069/469] Update the description of `only_available` Co-authored-by: Roy Nieterau --- server_addon/applications/server/settings.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index 53b547ce13..365f42789f 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -222,11 +222,10 @@ class ApplicationsAddonSettings(BaseSettingsModel): only_available: bool = SettingsField( True, title="Show only available applications", - description="Enable to show available applications in AYON Launcher" - " i.e. Show them if they are installed on the user" - " machine. Note: AYON Launcher shows only the selected" - " applications in project anatomy and this is another" - " filter to ignore uninstalled apps." + description="Enable to show only available applications in AYON Launcher" + " for which the executable paths are found on the running machine." + " This applies as an additional filter to the applications defined in a " + " project's anatomy settings to ignore unavailable applications." ) @validator("tool_groups") From 914448a2e779e251334af007b1ac591de0e7e4f8 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Tue, 30 Apr 2024 16:25:11 +0300 Subject: [PATCH 070/469] Remove shortcut from docstring Co-authored-by: Roy Nieterau --- server_addon/applications/server/settings.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index 365f42789f..abfc2c67b7 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -152,8 +152,6 @@ class ApplicationsSettings(BaseSettingsModel): AYON uses the following definitions to populate the applications list in project anatomy > attributes. So, You'd still need modify your project anatomy settings. - - Use shortcut **a+a** to navigate to project anatomy. """ maya: AppGroupWithPython = SettingsField( From 5149802256f3f1d2b1dc07a87e87ca259ae90fda Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 30 Apr 2024 16:26:56 +0300 Subject: [PATCH 071/469] applications: update ApplicationsSettings --- server_addon/applications/server/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index abfc2c67b7..9e915b6152 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -146,8 +146,8 @@ class ToolGroupModel(BaseSettingsModel): class ApplicationsSettings(BaseSettingsModel): """Applications settings - Define applications are available to your studio, locations of their - executables, and their additional environments. + Define applications available to your studio, locations of their + executables, and their additional environment variables. AYON uses the following definitions to populate the applications list in project anatomy > attributes. From 7b86da34ae86b0f866f610b0eb048511ddf1c743 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:59:04 +0200 Subject: [PATCH 072/469] fix buildin to builtin --- server/settings/main.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/settings/main.py b/server/settings/main.py index 85c1779999..8bbe13da30 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -55,13 +55,13 @@ class CoreImageIOFileRulesModel(BaseSettingsModel): _ocio_config_profile_types = [ - {"value": "buildin_path", "label": "Ayon built-in OCIO config"}, + {"value": "builtin_path", "label": "Ayon built-in OCIO config"}, {"value": "custom_path", "label": "Path to OCIO config"}, {"value": "product", "label": "Published product"}, ] -def _ocio_build_in_paths(): +def _ocio_built_in_paths(): return [ { "value": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", @@ -93,14 +93,14 @@ class CoreImageIOConfigProfilesModel(BaseSettingsModel): title="Profile type", enum_resolver=lambda: _ocio_config_profile_types, conditionalEnum=True, - default="buildin_path", + default="builtin_path", section="---", ) - buildin_path: str = SettingsField( + builtin_path: str = SettingsField( "ACES 1.2", title="Built-in OCIO config", - enum_resolver=_ocio_build_in_paths, + enum_resolver=_ocio_built_in_paths, ) custom_path: str = SettingsField( "", @@ -247,8 +247,8 @@ DEFAULT_VALUES = { "host_names": [], "task_types": [], "task_names": [], - "type": "buildin_path", - "buildin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", + "type": "builtin_path", + "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", "custom_path": "", "product": "", } From 8c525987e58991d770208f93bedcc6ed1bcd3bde Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:59:16 +0200 Subject: [PATCH 073/469] change Ayon to AYON --- server/settings/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/main.py b/server/settings/main.py index 8bbe13da30..d6a38a90e6 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -55,7 +55,7 @@ class CoreImageIOFileRulesModel(BaseSettingsModel): _ocio_config_profile_types = [ - {"value": "builtin_path", "label": "Ayon built-in OCIO config"}, + {"value": "builtin_path", "label": "AYON built-in OCIO config"}, {"value": "custom_path", "label": "Path to OCIO config"}, {"value": "product", "label": "Published product"}, ] From c0d9edad758559c15790c4cfd09f7c357ca84362 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:59:33 +0200 Subject: [PATCH 074/469] _ocio_config_profile_types is function --- server/settings/main.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/server/settings/main.py b/server/settings/main.py index d6a38a90e6..230414ffe7 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -54,11 +54,12 @@ class CoreImageIOFileRulesModel(BaseSettingsModel): return value -_ocio_config_profile_types = [ - {"value": "builtin_path", "label": "AYON built-in OCIO config"}, - {"value": "custom_path", "label": "Path to OCIO config"}, - {"value": "product", "label": "Published product"}, -] +def _ocio_config_profile_types(): + return [ + {"value": "builtin_path", "label": "AYON built-in OCIO config"}, + {"value": "custom_path", "label": "Path to OCIO config"}, + {"value": "product", "label": "Published product"}, + ] def _ocio_built_in_paths(): @@ -91,7 +92,7 @@ class CoreImageIOConfigProfilesModel(BaseSettingsModel): ) type: str = SettingsField( title="Profile type", - enum_resolver=lambda: _ocio_config_profile_types, + enum_resolver=_ocio_config_profile_types, conditionalEnum=True, default="builtin_path", section="---", From feb73842c377c401f2acdd1dc18c6852b3b23de7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 30 Apr 2024 16:07:17 +0200 Subject: [PATCH 075/469] rename 'product' attribute to 'product_name' --- server/settings/main.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/settings/main.py b/server/settings/main.py index 230414ffe7..c9c86bdd0d 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -97,7 +97,6 @@ class CoreImageIOConfigProfilesModel(BaseSettingsModel): default="builtin_path", section="---", ) - builtin_path: str = SettingsField( "ACES 1.2", title="Built-in OCIO config", @@ -108,7 +107,7 @@ class CoreImageIOConfigProfilesModel(BaseSettingsModel): title="OCIO config path", description="Path to OCIO config. Anatomy formatting is supported.", ) - product: str = SettingsField( + product_name: str = SettingsField( "", title="Product name", description=( @@ -251,7 +250,7 @@ DEFAULT_VALUES = { "type": "builtin_path", "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", "custom_path": "", - "product": "", + "product_name": "", } ], "file_rules": { From acacf15723e8cf99fcc3cbe194e49612b6dcb53d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 30 Apr 2024 15:24:34 +0100 Subject: [PATCH 076/469] Code cosmetics --- .../hosts/nuke/plugins/create/create_write_render.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py index 16bce64ec6..5340fbdecc 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py @@ -41,14 +41,16 @@ class CreateWriteRender(napi.NukeWriteCreator): def create_instance_node(self, product_name, instance_data): settings = self.project_settings["nuke"]["create"]["CreateWriteRender"] - settings = settings["instance_attributes"] + instance_attributes = settings["instance_attributes"] # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, "fpath_template": self.temp_rendering_path_template, - "headless_farm_submission": "headless_farm_submission" in settings + "headless_farm_submission": ( + "headless_farm_submission" in instance_attributes + ) } write_data.update(instance_data) From 3812f229240f7dc7eb4c71979973a355c831a0fa Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 2 May 2024 10:33:32 +0200 Subject: [PATCH 077/469] implemented 'get_imageio_config_preset' with new profiles handling --- client/ayon_core/pipeline/colorspace.py | 317 ++++++++++++++++++++---- 1 file changed, 272 insertions(+), 45 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index efa3bbf968..8dcbaeb877 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -8,14 +8,19 @@ import tempfile import warnings from copy import deepcopy +import ayon_api + from ayon_core import AYON_CORE_ROOT from ayon_core.settings import get_project_settings from ayon_core.lib import ( + filter_profiles, StringTemplate, run_ayon_launcher_process, - Logger + Logger, ) from ayon_core.pipeline import Anatomy +from ayon_core.pipeline.template_data import get_template_data +from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS @@ -758,6 +763,9 @@ def get_imageio_config( Config path is formatted in `path` key and original settings input is saved into `template` key. + Deprecated: + Deprecated since '0.3.1' . Use `get_imageio_config_preset` instead. + Args: project_name (str): project name host_name (str): host name @@ -768,88 +776,307 @@ def get_imageio_config( Returns: dict: config path data or empty dict - """ - project_settings = project_settings or get_project_settings(project_name) - anatomy = anatomy or Anatomy(project_name) + """ if not anatomy_data: from ayon_core.pipeline.context_tools import ( get_current_context_template_data) anatomy_data = get_current_context_template_data() - formatting_data = deepcopy(anatomy_data) + task_name = anatomy_data["task"]["name"] + folder_path = anatomy_data["folder"]["path"] + return get_imageio_config_preset( + project_name, + folder_path, + task_name, + host_name, + anatomy=anatomy, + project_settings=project_settings, + template_data=anatomy_data, + env=env, + ) - # Add project roots to anatomy data - formatting_data["root"] = anatomy.roots - formatting_data["platform"] = platform.system().lower() + +def _get_global_config_data( + project_name, + host_name, + anatomy, + template_data, + imageio_global, + folder_id, + log, +): + """Get global config data. + + Global config from core settings is using profiles that are based on + host name, task name and task type. The filtered profile can define 3 + types of config sources: + 1. AYON ocio addon configs. + 2. Custom path to ocio config. + 3. Path to 'ocioconfig' representation on product. Name of product can be + defined in settings. Product name can be regex but exact match is + always preferred. + + None is returned when no profile is found, when path + + Args: + project_name (str): Project name. + host_name (str): Host name. + anatomy (Anatomy): Project anatomy object. + template_data (dict[str, Any]): Template data. + imageio_global (dict[str, Any]): Core imagio settings. + folder_id (Union[dict[str, Any], None]): Folder id. + log (logging.Logger): Logger object. + + Returns: + Union[dict[str, str], None]: Config data with path and template + or None. + + """ + task_name = task_type = None + task_data = template_data.get("task") + if task_data: + task_name = task_data["name"] + task_type = task_data["type"] + + filter_values = { + "task_names": task_name, + "task_types": task_type, + "host_names": host_name, + } + profile = filter_profiles( + imageio_global["ocio_config_profiles"], filter_values + ) + if profile is None: + log.info(f"No config profile matched filters {str(filter_values)}") + return None + + profile_type = profile["type"] + if profile_type in ("builtin_path", "custom_path"): + template = profile[profile_type] + result = StringTemplate.format_strict_template( + template, template_data + ) + normalized_path = str(result.normalized()) + if not os.path.exists(normalized_path): + log.warning(f"Path was not found '{normalized_path}'.") + return None + + return { + "path": normalized_path, + "template": template + } + + # TODO decide if this is the right name for representation + repre_name = "ocioconfig" + + folder_info = template_data.get("folder") + if not folder_info: + log.warning("Folder info is missing.") + return None + folder_path = folder_info["path"] + + product_name = profile["product_name"] + if folder_id is None: + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path, fields={"id"} + ) + if not folder_entity: + log.warning(f"Folder entity '{folder_path}' was not found..") + return None + folder_id = folder_entity["id"] + + product_entities_by_name = { + product_entity["name"]: product_entity + for product_entity in ayon_api.get_products( + project_name, + folder_ids={folder_id}, + product_name_regex=product_name, + fields={"id", "name"} + ) + } + if not product_entities_by_name: + log.debug( + f"No product entities were found for folder '{folder_path}' with" + f" product name filter '{product_name}'." + ) + return None + + # Try to use exact match first, otherwise use first available product + product_entity = product_entities_by_name.get(product_name) + if product_entity is None: + product_entity = next(iter(product_entities_by_name.values())) + + product_name = product_entity["name"] + # Find last product version + version_entity = ayon_api.get_last_version_by_product_id( + project_name, + product_id=product_entity["id"], + fields={"id"} + ) + if not version_entity: + log.info( + f"Product '{product_name}' does not have available any versions." + ) + return None + + # Find 'ocioconfig' representation entity + repre_entity = ayon_api.get_representation_by_name( + project_name, + representation_name=repre_name, + version_id=version_entity["id"], + ) + if not repre_entity: + log.debug( + f"Representation '{repre_name}'" + f" not found on product '{product_name}'." + ) + return None + + path = get_representation_path_with_anatomy(repre_entity, anatomy) + template = repre_entity["attrib"]["template"] + return { + "path": path, + "template": template, + } + + +def get_imageio_config_preset( + project_name, + folder_path, + task_name, + host_name, + anatomy=None, + project_settings=None, + template_data=None, + env=None, + folder_id=None, +): + """Returns config data from settings + + Output contains 'path' key and 'template' key holds its template. + + Template data can be prepared with 'get_template_data'. + + Args: + project_name (str): Project name. + folder_path (str): Folder path. + task_name (str): Task name. + host_name (str): Host name. + anatomy (Optional[Anatomy]): Project anatomy object. + project_settings (Optional[dict]): Project settings. + template_data (Optional[dict]): Template data used for + template formatting. + env (Optional[dict]): Environment variables. Environments are used + for template formatting too. Values from 'os.environ' are used + when not provided. + folder_id (Optional[str]): Folder id. Is used only when config path + is received from published representation. Is autofilled when + not provided. + + Returns: + dict: config path data or empty dict + + """ + if not project_settings: + project_settings = get_project_settings(project_name) # Get colorspace settings imageio_global, imageio_host = _get_imageio_settings( - project_settings, host_name) + project_settings, host_name + ) + # Global color management must be enabled to be able to use host settings + if not imageio_global["activate_global_color_management"]: + log.info("Colorspace management is disabled globally.") + return {} # Host 'ocio_config' is optional host_ocio_config = imageio_host.get("ocio_config") or {} - - # Global color management must be enabled to be able to use host settings - activate_color_management = imageio_global.get( - "activate_global_color_management") - # TODO: remove this in future - backward compatibility - # For already saved overrides from previous version look for 'enabled' - # on host settings. - if activate_color_management is None: - activate_color_management = host_ocio_config.get("enabled", False) - - if not activate_color_management: - # if global settings are disabled return empty dict because - # it is expected that no colorspace management is needed - log.info("Colorspace management is disabled globally.") - return {} + # TODO remove + # - backward compatibility when host settings had only 'enabled' flag + # the flag was split into 'activate_global_color_management' + # and 'override_global_config' + host_ocio_config_enabled = host_ocio_config.get("enabled", False) # Check if host settings group is having 'activate_host_color_management' # - if it does not have activation key then default it to True so it uses # global settings - # This is for backward compatibility. - # TODO: in future rewrite this to be more explicit activate_host_color_management = imageio_host.get( - "activate_host_color_management") - - # TODO: remove this in future - backward compatibility + "activate_host_color_management" + ) if activate_host_color_management is None: - activate_host_color_management = host_ocio_config.get("enabled", False) + activate_host_color_management = host_ocio_config_enabled if not activate_host_color_management: # if host settings are disabled return False because # it is expected that no colorspace management is needed log.info( - "Colorspace management for host '{}' is disabled.".format( - host_name) + f"Colorspace management for host '{host_name}' is disabled." ) return {} - # get config path from either global or host settings - # depending on override flag + project_entity = None + if anatomy is None: + project_entity = ayon_api.get_project(project_name) + anatomy = Anatomy(project_name, project_entity) + + if env is None: + env = dict(os.environ.items()) + + if template_data: + template_data = deepcopy(template_data) + else: + if not project_entity: + project_entity = ayon_api.get_project(project_name) + + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + folder_id = folder_entity["id"] + task_entity = ayon_api.get_task_by_name( + project_name, folder_id, task_name + ) + template_data = get_template_data( + project_entity, + folder_entity, + task_entity, + host_name, + project_settings, + ) + + # Add project roots to anatomy data + template_data["root"] = anatomy.roots + template_data["platform"] = platform.system().lower() + + # Add environment variables to template data + template_data.update(env) + + # Get config path from core or host settings + # - based on override flag in host settings # TODO: in future rewrite this to be more explicit override_global_config = host_ocio_config.get("override_global_config") if override_global_config is None: - # for already saved overrides from previous version - # TODO: remove this in future - backward compatibility - override_global_config = host_ocio_config.get("enabled") + override_global_config = host_ocio_config_enabled - if override_global_config: - config_data = _get_config_data( - host_ocio_config["filepath"], formatting_data, env + if not override_global_config: + config_data = _get_global_config_data( + project_name, + host_name, + anatomy, + template_data, + imageio_global, + folder_id, + log, ) else: - # get config path from global - config_global = imageio_global["ocio_config"] config_data = _get_config_data( - config_global["filepath"], formatting_data, env + host_ocio_config["filepath"], template_data, env ) if not config_data: raise FileExistsError( - "No OCIO config found in settings. It is " - "either missing or there is typo in path inputs" + "No OCIO config found in settings. It is" + " either missing or there is typo in path inputs" ) return config_data From 71f2c074c55938672025f6ed7af450a32d3584b8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 2 May 2024 10:58:51 +0200 Subject: [PATCH 078/469] implemented conversion of settings overrides --- server/__init__.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/server/__init__.py b/server/__init__.py index 152cc77218..f6f89f2049 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -1,3 +1,5 @@ +from typing import Any + from ayon_server.addons import BaseServerAddon from .settings import CoreSettings, DEFAULT_VALUES @@ -9,3 +11,46 @@ class CoreAddon(BaseServerAddon): async def get_default_settings(self): settings_model_cls = self.get_settings_model() return settings_model_cls(**DEFAULT_VALUES) + + async def convert_settings_overrides( + self, + source_version: str, + overrides: dict[str, Any], + ) -> dict[str, Any]: + self._convert_imagio_configs_0_3_1(overrides) + # Use super conversion + return await super().convert_settings_overrides( + source_version, overrides + ) + + def _convert_imagio_configs_0_3_1(self, overrides): + """Imageio config settings did change to profiles since 0.3.1. .""" + imageio_overrides = overrides.get("imageio") or {} + if "ocio_config" not in imageio_overrides: + return + + ocio_config = imageio_overrides.pop("ocio_config") + filepath = ocio_config["filepath"] + if not filepath: + return + first_filepath = filepath[0] + ocio_config_profiles = imageio_overrides.setdefault( + "ocio_config_profiles", [] + ) + base_value = { + "type": "builtin_path", + "product": "", + "host_names": [], + "task_names": [], + "task_types": [], + "custom_path": "", + "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio" + } + if first_filepath not in ( + "{BUILTIN_OCIO_ROOT}/aces_1.2/config.oci", + "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", + ): + base_value["type"] = "custom_path" + base_value["custom_path"] = first_filepath + + ocio_config_profiles.append(base_value) From 0462d38445f9b4a66635e0ba3bcd9dfd4cf28a46 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 2 May 2024 15:11:56 +0100 Subject: [PATCH 079/469] Use pyblish plugins instead of code outside of publishing. --- client/ayon_core/hosts/nuke/api/utils.py | 107 ++---------------- .../plugins/publish/collect_headless_farm.py | 41 +++++++ .../plugins/publish/extract_headless_farm.py | 35 ++++++ 3 files changed, 88 insertions(+), 95 deletions(-) create mode 100644 client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py create mode 100644 client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index e608863648..a5d9bfb323 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -1,17 +1,16 @@ import os import re import traceback -from datetime import datetime -import shutil import nuke -from pyblish import util +from pyblish import util, api from qtpy import QtWidgets from ayon_core import resources from ayon_core.pipeline import registered_host from ayon_core.tools.utils import show_message_dialog +from ayon_core.pipeline.create import CreateContext def set_context_favorites(favorites=None): @@ -219,7 +218,16 @@ def _submit_headless_farm(node): node (Node): The node for which the farm submission is being made. """ - context = util.collect() + host = registered_host() + create_context = CreateContext(host) + context = api.Context() + context.data["create_context"] = create_context + # Used in pyblish plugin to determine which instance to publish. + context.data["node_name"] = node.name() + # Used in pyblish plugins to determine whether to run or not. + context.data["headless_farm"] = True + + context = util.publish(context) success, error_report = create_error_report(context) @@ -228,94 +236,3 @@ def _submit_headless_farm(node): "Collection Errors", error_report, level="critical" ) return - - # Find instance for node and workfile. - instance = None - instance_workfile = None - for _instance in context: - if _instance.data["family"] == "workfile": - instance_workfile = _instance - _instance.data["active"] = False - continue - - instance_node = _instance.data["transientData"]["node"] - if node.name() == instance_node.name(): - instance = _instance - else: - _instance.data["active"] = False - - if instance is None: - show_message_dialog( - "Collection Error", - "Could not find the instance from the node.", - level="critical" - ) - return - - # Enable for farm publishing. - instance.data["farm"] = True - - # Clear the families as we only want the main family, ei. no review etc. - instance.data["families"] = [] - - # Use the workfile instead of published. - publish_attributes = instance.data["publish_attributes"] - publish_attributes["NukeSubmitDeadline"]["use_published_workfile"] = False - - # Disable version validation. - instance.data.pop("latestVersion") - instance_workfile.data.pop("latestVersion") - - # Validate - util.validate(context) - - success, error_report = create_error_report(context) - - if not success: - show_message_dialog( - "Validation Errors", error_report, level="critical" - ) - return - - # Extraction. - util.extract(context) - - success, error_report = create_error_report(context) - - if not success: - show_message_dialog( - "Extraction Errors", error_report, level="critical" - ) - return - - # Copy the workfile to a timestamped copy. - host = registered_host() - current_datetime = datetime.now() - formatted_timestamp = current_datetime.strftime("%Y%m%d%H%M%S") - base, ext = os.path.splitext(host.current_file()) - - directory = os.path.join(os.path.dirname(base), "farm_submissions") - if not os.path.exists(directory): - os.makedirs(directory) - - filename = "{}_{}{}".format( - os.path.basename(base), formatted_timestamp, ext - ) - path = os.path.join(directory, filename).replace("\\", "/") - context.data["currentFile"] = path - shutil.copy(host.current_file(), path) - - # Continue to submission. - util.integrate(context) - - success, error_report = create_error_report(context) - - if not success: - show_message_dialog( - "Extraction Errors", error_report, level="critical" - ) - return - - show_message_dialog( - "Submission Successful", "Submission to the farm was successful." - ) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py new file mode 100644 index 0000000000..9bcdd199f3 --- /dev/null +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -0,0 +1,41 @@ +import pyblish.api + + +class CollectHeadlessFarm(pyblish.api.InstancePlugin): + """Setup instances for headless farm submission.""" + + order = pyblish.api.CollectorOrder + 0.4999 + label = "Collect Headless Farm" + hosts = ["nuke"] + + def process(self, instance): + if not instance.context.data.get("headless_farm", False): + return + + if instance.data["family"] == "workfile": + instance.data["active"] = False + + # Disable version validation. + instance.data.pop("latestVersion") + return + + # Filter out all other instances. + node = instance.data["transientData"]["node"] + if node.name() != instance.context.data["node_name"]: + instance.data["active"] = False + return + + # Enable for farm publishing. + instance.data["farm"] = True + + # Clear the families as we only want the main family, ei. no review + # etc. + instance.data["families"] = [] + + # Use the workfile instead of published. + settings = instance.data["publish_attributes"] + settings = settings["NukeSubmitDeadline"] + settings["use_published_workfile"] = False + + # Disable version validation. + instance.data.pop("latestVersion") diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py new file mode 100644 index 0000000000..be74a05392 --- /dev/null +++ b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py @@ -0,0 +1,35 @@ +import os +from datetime import datetime +import shutil + +import pyblish.api + +from ayon_core.pipeline import registered_host + + +class ExtractHeadlessFarm(pyblish.api.InstancePlugin): + """Copy the workfile to a timestamped copy.""" + + order = pyblish.api.ExtractorOrder + 0.499 + label = "Extract Headless Farm" + hosts = ["nuke"] + + def process(self, instance): + if not instance.context.data.get("headless_farm", False): + return + + host = registered_host() + current_datetime = datetime.now() + formatted_timestamp = current_datetime.strftime("%Y%m%d%H%M%S") + base, ext = os.path.splitext(host.current_file()) + + directory = os.path.join(os.path.dirname(base), "farm_submissions") + if not os.path.exists(directory): + os.makedirs(directory) + + filename = "{}_{}{}".format( + os.path.basename(base), formatted_timestamp, ext + ) + path = os.path.join(directory, filename).replace("\\", "/") + instance.context.data["currentFile"] = path + shutil.copy(host.current_file(), path) From 81c75841db70d5ac601fc86f18e003f44d4ec11d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 2 May 2024 15:14:04 +0100 Subject: [PATCH 080/469] increment nuke package --- server_addon/nuke/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index bf03c4e7e7..e522b9fb5d 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,3 @@ name = "nuke" title = "Nuke" -version = "0.1.11" +version = "0.1.12" From a3c2bb1415b320fad1eabcc617c5d6643e719f8d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 2 May 2024 15:52:38 +0100 Subject: [PATCH 081/469] Show successfull message. --- client/ayon_core/hosts/nuke/api/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index a5d9bfb323..5ab2e15552 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -236,3 +236,7 @@ def _submit_headless_farm(node): "Collection Errors", error_report, level="critical" ) return + + show_message_dialog( + "Submission Successful", "Submission to the farm was successful." + ) From e5fbb20bdc51a1c7bb8c9707cd3f659ce26e583d Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 2 May 2024 15:52:52 +0100 Subject: [PATCH 082/469] Skip script version increment --- .../hosts/nuke/plugins/publish/increment_script_version.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py b/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py index 6b0be42ba1..f20748b034 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py @@ -13,6 +13,8 @@ class IncrementScriptVersion(pyblish.api.ContextPlugin): hosts = ['nuke'] def process(self, context): + if context.data.get("headless_farm", False): + return assert all(result["success"] for result in context.data["results"]), ( "Publishing not successful so version is not increased.") From ce13e8629fa63c0b6649061400eccfc09d18fcb1 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 3 May 2024 09:49:52 +0100 Subject: [PATCH 083/469] Full imports --- client/ayon_core/hosts/nuke/api/utils.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 5ab2e15552..8eb0339a89 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -4,7 +4,8 @@ import traceback import nuke -from pyblish import util, api +import pyblish.util +import pyblish.api from qtpy import QtWidgets from ayon_core import resources @@ -220,14 +221,14 @@ def _submit_headless_farm(node): host = registered_host() create_context = CreateContext(host) - context = api.Context() + context = pyblish.api.Context() context.data["create_context"] = create_context # Used in pyblish plugin to determine which instance to publish. context.data["node_name"] = node.name() # Used in pyblish plugins to determine whether to run or not. context.data["headless_farm"] = True - context = util.publish(context) + context = pyblish.util.publish(context) success, error_report = create_error_report(context) From 230611e91c6a89f73b8fc9c80a9414107018a0ac Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 15:58:26 +0200 Subject: [PATCH 084/469] AY-4801 - new creator for editorial_pckg Should publish folder with otio file and (.mov) resources. --- .../create/create_editorial_package.py | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py new file mode 100644 index 0000000000..6a581b59d1 --- /dev/null +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py @@ -0,0 +1,66 @@ +from pathlib import Path + +from ayon_core.pipeline import ( + CreatedInstance, +) + +from ayon_core.lib.attribute_definitions import FileDef +from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator + + +class EditorialPackageCreator(TrayPublishCreator): + """Creates instance for OTIO file from published folder. + + Folder contains OTIO file and exported .mov files. Process should publish + whole folder as single `editorial_pckg` product type and (possibly) convert + .mov files into different format and copy them into `publish` `resources` + subfolder. + """ + identifier = "editorial_pckg" + label = "Editorial package" + product_type = "editorial_pckg" + description = "Publish folder with OTIO file and resources" + + # Position batch creator after simple creators + order = 120 + + + def get_icon(self): + return "fa.folder" + + def create(self, product_name, instance_data, pre_create_data): + folder_path = pre_create_data.get("folder_path") + if not folder_path: + return + + instance_data["creator_attributes"] = { + "path": (Path(folder_path["directory"]) / + Path(folder_path["filenames"][0])).as_posix() + } + + # Create new instance + new_instance = CreatedInstance(self.product_type, product_name, + instance_data, self) + self._store_new_instance(new_instance) + + def get_pre_create_attr_defs(self): + # Use same attributes as for instance attributes + return [ + FileDef( + "folder_path", + folders=True, + single_item=True, + extensions=[], + allow_sequences=False, + label="Folder path" + ) + ] + + def get_detail_description(self): + return """# Publish folder with OTIO file and video clips + + Folder contains OTIO file and exported .mov files. Process should + publish whole folder as single `editorial_pckg` product type and + (possibly) convert .mov files into different format and copy them into + `publish` `resources` subfolder. + """ From 4318218881c6d4c0ad0f83bd23395b1c8936f5b7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 16:02:56 +0200 Subject: [PATCH 085/469] AY-4801 - new collector for editorial_pckg Collects otio_path and resource_paths from folder. Doesn't parse and collect otio_data yet, to not carry too much data over.(Might be changed) --- .../publish/collect_editorial_package.py | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py new file mode 100644 index 0000000000..101f58b6d1 --- /dev/null +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py @@ -0,0 +1,58 @@ +"""Produces instance.data["editorial_pckg"] data used during integration. + +Requires: + instance.data["creator_attributes"]["path"] - from creator + +Provides: + instance -> editorial_pckg (dict): + folder_path (str) + otio_path (str) - from dragged folder + resource_paths (list) + +""" +import os + +import pyblish.api + +from ayon_core.lib.transcoding import VIDEO_EXTENSIONS + + +class CollectEditorialPackage(pyblish.api.InstancePlugin): + """Collects path to OTIO file and resources""" + + label = "Collect Editorial Package" + order = pyblish.api.CollectorOrder - 0.1 + + hosts = ["traypublisher"] + families = ["editorial_pckg"] + + def process(self, instance): + folder_path = instance.data["creator_attributes"].get("path") + if not folder_path or not os.path.exists(folder_path): + self.log.info(( + "Instance doesn't contain collected existing folder path." + )) + return + + instance.data["editorial_pckg"] = {} + instance.data["editorial_pckg"]["folder_path"] = folder_path + + otio_path, resource_paths = ( + self._get_otio_and_resource_paths(folder_path)) + + instance.data["editorial_pckg"]["otio_path"] = otio_path + instance.data["editorial_pckg"]["resource_paths"] = resource_paths + + def _get_otio_and_resource_paths(self, folder_path): + otio_path = None + resource_paths = [] + + file_names = os.listdir(folder_path) + for filename in file_names: + _, ext = os.path.splitext(filename) + file_path = os.path.join(folder_path, filename) + if ext == ".otio": + otio_path = file_path + elif ext in VIDEO_EXTENSIONS: + resource_paths.append(file_path) + return otio_path, resource_paths From 1ff4d63091fbcbdcabc434317181fd19f00a916d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 16:11:12 +0200 Subject: [PATCH 086/469] AY-4801 - new validator for editorial_pckg Currently checks only by file names and expects flat structure. It ignores path to resources in otio file as folder might be dragged in and published from different location than it was created. --- .../publish/validate_editorial_package.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py new file mode 100644 index 0000000000..869dc73811 --- /dev/null +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py @@ -0,0 +1,70 @@ +import os +import opentimelineio + +import pyblish.api +from ayon_core.pipeline import PublishValidationError + + +class ValidateEditorialPackage(pyblish.api.InstancePlugin): + """Checks that published folder contains all resources from otio + + Currently checks only by file names and expects flat structure. + It ignores path to resources in otio file as folder might be dragged in and + published from different location than it was created. + """ + + label = "Validate Editorial Package" + order = pyblish.api.ValidatorOrder - 0.49 + + hosts = ["traypublisher"] + families = ["editorial_pckg"] + + def process(self, instance): + editorial_pckg_data = instance.data.get("editorial_pckg") + if not editorial_pckg_data: + raise PublishValidationError( + f"Editorial package not collected") + + folder_path = editorial_pckg_data["folder_path"] + + otio_path = editorial_pckg_data["otio_path"] + if not otio_path: + raise PublishValidationError( + f"Folder {folder_path} missing otio file") + + resource_paths = editorial_pckg_data["resource_paths"] + + resource_file_names = {os.path.basename(path) + for path in resource_paths} + + otio_data = opentimelineio.adapters.read_from_file(otio_path) + + target_urls = self._get_all_target_urls(otio_data) + missing_files = set() + for target_url in target_urls: + target_basename = os.path.basename(target_url) + if target_basename not in resource_file_names: + missing_files.add(target_basename) + + if missing_files: + raise PublishValidationError("Otio file contains missing files " + f"'{missing_files}'.") + + instance.data["editorial_pckg"]["otio_data"] = otio_data + + def _get_all_target_urls(self, otio_data): + target_urls = [] + + # Iterate through tracks, clips, or other elements + for track in otio_data.tracks: + for clip in track: + # Check if the clip has a media reference + if clip.media_reference is not None: + # Access the target_url from the media reference + target_url = clip.media_reference.target_url + if target_url: + target_urls.append(target_url) + + return target_urls + + From 20dad59947e4fb13d026670baa73820e9e378ecd Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 18:31:40 +0200 Subject: [PATCH 087/469] AY-4801 - added editorial_pckg to integrate --- client/ayon_core/plugins/publish/integrate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index 764168edd3..5a9d8eae2b 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -169,6 +169,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "yeticacheUE", "tycache", "csv_ingest_file", + "editorial_pckg" ] default_template_name = "publish" From 345f5f31f1a395c4f4d468166bc343933be9974e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 3 May 2024 18:44:48 +0200 Subject: [PATCH 088/469] AY-4801 - added editorial_pckg extractor Modifies otio file with rootless publish paths, prepares for integration. --- .../plugins/publish/extract_editorial_pckg.py | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py new file mode 100644 index 0000000000..dc8163e1ff --- /dev/null +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -0,0 +1,122 @@ +import os.path +import opentimelineio + +import pyblish.api + +from ayon_core.pipeline import publish + + +class ExtractEditorialPackage(publish.Extractor): + """Replaces movie paths in otio file with publish rootless + + Prepares movie resources for integration. + TODO introduce conversion to .mp4 + """ + + label = "Extract Editorial Package" + order = pyblish.api.ExtractorOrder - 0.45 + hosts = ["traypublisher"] + families = ["editorial_pckg"] + + def process(self, instance): + editorial_pckg_data = instance.data.get("editorial_pckg") + + otio_path = editorial_pckg_data["otio_path"] + otio_basename = os.path.basename(otio_path) + staging_dir = self.staging_dir(instance) + + editorial_pckg_repre = { + 'name': "editorial_pckg", + 'ext': "otio", + 'files': otio_basename, + "stagingDir": staging_dir, + } + otio_staging_path = os.path.join(staging_dir, otio_basename) + + instance.data["representations"].append(editorial_pckg_repre) + + publish_path = self._get_published_path(instance) + publish_folder = os.path.dirname(publish_path) + publish_resource_folder = os.path.join(publish_folder, "resources") + + resource_paths = editorial_pckg_data["resource_paths"] + transfers = self._get_transfers(resource_paths, + publish_resource_folder) + if not "transfers" in instance.data: + instance.data["transfers"] = [] + instance.data["transfers"] = transfers + + source_to_rootless = self._get_resource_path_mapping(instance, + transfers) + + otio_data = editorial_pckg_data["otio_data"] + otio_data = self._replace_target_urls(otio_data, source_to_rootless) + + opentimelineio.adapters.write_to_file(otio_data, otio_staging_path) + + self.log.info("Added Editorial Package representation: {}".format( + editorial_pckg_repre)) + + def _get_resource_path_mapping(self, instance, transfers): + """Returns dict of {source_mov_path: rootless_published_path}.""" + replace_paths = {} + anatomy = instance.context.data["anatomy"] + for source, destination in transfers: + rootless_path = self._get_rootless(anatomy, destination) + source_file_name = os.path.basename(source) + replace_paths[source_file_name] = rootless_path + return replace_paths + + def _get_transfers(self, resource_paths, publish_resource_folder): + """Returns list of tuples (source, destination) movie paths.""" + transfers = [] + for res_path in resource_paths: + res_basename = os.path.basename(res_path) + pub_res_path = os.path.join(publish_resource_folder, res_basename) + transfers.append((res_path, pub_res_path)) + return transfers + + def _replace_target_urls(self, otio_data, replace_paths): + """Replace original movie paths with published rootles ones.""" + for track in otio_data.tracks: + for clip in track: + # Check if the clip has a media reference + if clip.media_reference is not None: + # Access the target_url from the media reference + target_url = clip.media_reference.target_url + if not target_url: + continue + file_name = os.path.basename(target_url) + replace_value = replace_paths.get(file_name) + if replace_value: + clip.media_reference.target_url = replace_value + + return otio_data + + def _get_rootless(self, anatomy, path): + """Try to find rootless {root[work]} path from `path`""" + success, rootless_path = anatomy.find_root_template_from_path( + path) + if not success: + # `rootless_path` is not set to `output_dir` if none of roots match + self.log.warning( + f"Could not find root path for remapping '{path}'." + ) + rootless_path = path + + return rootless_path + + def _get_published_path(self, instance): + """Calculates expected `publish` folder""" + # determine published path from Anatomy. + template_data = instance.data.get("anatomyData") + rep = instance.data["representations"][0] + template_data["representation"] = rep.get("name") + template_data["ext"] = rep.get("ext") + template_data["comment"] = None + + anatomy = instance.context.data["anatomy"] + template_data["root"] = anatomy.roots + template = anatomy.get_template_item("publish", "default", "path") + template_filled = template.format_strict(template_data) + return os.path.normpath(template_filled) From 6bb585c6a92b62f70fbfb2355ed45e3ff70f0d9a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 3 May 2024 20:31:40 +0200 Subject: [PATCH 089/469] Change label to `Load Cache` --- client/ayon_core/hosts/blender/plugins/load/load_cache.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/blender/plugins/load/load_cache.py b/client/ayon_core/hosts/blender/plugins/load/load_cache.py index 65d45e6fc4..30c847f89d 100644 --- a/client/ayon_core/hosts/blender/plugins/load/load_cache.py +++ b/client/ayon_core/hosts/blender/plugins/load/load_cache.py @@ -29,8 +29,7 @@ class CacheModelLoader(plugin.AssetLoader): product_types = {"model", "pointcache", "animation", "usd"} representations = {"abc", "usd"} - # TODO: Should USD loader be a separate loader instead? - label = "Load Alembic/USD" + label = "Load Cache" icon = "code-fork" color = "orange" From bd0509a2c64d9488e5c79dbf9ea27e1b885b064d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 3 May 2024 20:42:16 +0200 Subject: [PATCH 090/469] Allow publishing USD from `model` family and expose it in settings --- .../hosts/blender/plugins/publish/extract_usd.py | 11 +++++++++++ .../blender/server/settings/publish_plugins.py | 9 +++++++++ 2 files changed, 20 insertions(+) diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py index 70092ded7b..1d4fa3d7ac 100644 --- a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py +++ b/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py @@ -77,3 +77,14 @@ class ExtractUSD(publish.Extractor): instance.data.setdefault("representations", []).append(representation) self.log.debug("Extracted instance '%s' to: %s", instance.name, representation) + + +class ExtractModelUSD(ExtractUSD): + """Extract model as USD.""" + + label = "Extract USD (Model)" + hosts = ["blender"] + families = ["model"] + + # Driven by settings + optional = True diff --git a/server_addon/blender/server/settings/publish_plugins.py b/server_addon/blender/server/settings/publish_plugins.py index e998d7b057..8db8c5be46 100644 --- a/server_addon/blender/server/settings/publish_plugins.py +++ b/server_addon/blender/server/settings/publish_plugins.py @@ -151,6 +151,10 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=ExtractPlayblastModel, title="Extract Playblast" ) + ExtractModelUSD: ValidatePluginModel = SettingsField( + default_factory=ValidatePluginModel, + title="Extract Model USD" + ) DEFAULT_BLENDER_PUBLISH_SETTINGS = { @@ -348,5 +352,10 @@ DEFAULT_BLENDER_PUBLISH_SETTINGS = { }, indent=4 ) + }, + "ExtractModelUSD": { + "enabled": True, + "optional": True, + "active": True } } From 8131b53983301b0d5f4e3a5a6a8fd42eff0eedbb Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 3 May 2024 20:42:41 +0200 Subject: [PATCH 091/469] Bump blender server addon version --- server_addon/blender/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/blender/package.py b/server_addon/blender/package.py index 667076e533..d2c02a4909 100644 --- a/server_addon/blender/package.py +++ b/server_addon/blender/package.py @@ -1,3 +1,3 @@ name = "blender" title = "Blender" -version = "0.1.8" +version = "0.1.9" From ade52e789702f7d7f57a6898d13e75e79537653c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 3 May 2024 23:16:34 +0300 Subject: [PATCH 092/469] add model product type creator --- .../houdini/plugins/create/create_model.py | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 client/ayon_core/hosts/houdini/plugins/create/create_model.py diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_model.py b/client/ayon_core/hosts/houdini/plugins/create/create_model.py new file mode 100644 index 0000000000..1f32ccde45 --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/create/create_model.py @@ -0,0 +1,144 @@ +# -*- coding: utf-8 -*- +"""Creator plugin for creating Model product type. + +Note: + Currently, This creator plugin is the same as 'create_pointcache.py' + But renaming the product type to 'model'. + + It's purpose to support + Maya (load/publish model from maya to/from houdini). + + It's considered to support multiple representations in the future. +""" + +from ayon_core.hosts.houdini.api import plugin +from ayon_core.lib import BoolDef + +import hou + + + +class CreateModel(plugin.HoudiniCreator): + """Create Model""" + identifier = "io.openpype.creators.houdini.model" + label = "Model" + product_type = "model" + icon = "cube" + + def get_publish_families(self): + return ["model", "abc"] + + def create(self, product_name, instance_data, pre_create_data): + instance_data.pop("active", None) + instance_data.update({"node_type": "alembic"}) + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + creator_attributes["farm"] = pre_create_data["farm"] + + instance = super(CreateModel, self).create( + product_name, + instance_data, + pre_create_data) + + instance_node = hou.node(instance.get("instance_node")) + parms = { + "use_sop_path": True, + "build_from_path": True, + "path_attrib": "path", + "prim_to_detail_pattern": "cbId", + "format": 2, + "facesets": 0, + "filename": hou.text.expandString( + "$HIP/pyblish/{}.abc".format(product_name)) + } + + if self.selected_nodes: + selected_node = self.selected_nodes[0] + + # Although Houdini allows ObjNode path on `sop_path` for the + # the ROP node we prefer it set to the SopNode path explicitly + + # Allow sop level paths (e.g. /obj/geo1/box1) + if isinstance(selected_node, hou.SopNode): + parms["sop_path"] = selected_node.path() + self.log.debug( + "Valid SopNode selection, 'SOP Path' in ROP will be set to '%s'." + % selected_node.path() + ) + + # Allow object level paths to Geometry nodes (e.g. /obj/geo1) + # but do not allow other object level nodes types like cameras, etc. + elif isinstance(selected_node, hou.ObjNode) and \ + selected_node.type().name() in ["geo"]: + + # get the output node with the minimum + # 'outputidx' or the node with display flag + sop_path = self.get_obj_output(selected_node) + + if sop_path: + parms["sop_path"] = sop_path.path() + self.log.debug( + "Valid ObjNode selection, 'SOP Path' in ROP will be set to " + "the child path '%s'." + % sop_path.path() + ) + + if not parms.get("sop_path", None): + self.log.debug( + "Selection isn't valid. 'SOP Path' in ROP will be empty." + ) + else: + self.log.debug( + "No Selection. 'SOP Path' in ROP will be empty." + ) + + instance_node.setParms(parms) + instance_node.parm("trange").set(1) + + # Explicitly set f1 and f2 to frame start. + # Which forces the rop node to export one frame. + instance_node.parmTuple('f').deleteAllKeyframes() + fstart = int(hou.hscriptExpression("$FSTART")) + instance_node.parmTuple('f').set((fstart, fstart, 1)) + + # Lock any parameters in this list + to_lock = ["prim_to_detail_pattern"] + self.lock_parameters(instance_node, to_lock) + + def get_network_categories(self): + return [ + hou.ropNodeTypeCategory(), + hou.sopNodeTypeCategory() + ] + + def get_obj_output(self, obj_node): + """Find output node with the smallest 'outputidx'.""" + + outputs = obj_node.subnetOutputs() + + # if obj_node is empty + if not outputs: + return + + # if obj_node has one output child whether its + # sop output node or a node with the render flag + elif len(outputs) == 1: + return outputs[0] + + # if there are more than one, then it have multiple output nodes + # return the one with the minimum 'outputidx' + else: + return min(outputs, + key=lambda node: node.evalParm('outputidx')) + + def get_instance_attr_defs(self): + return [ + BoolDef("farm", + label="Submitting to Farm", + default=False) + ] + + def get_pre_create_attr_defs(self): + attrs = super().get_pre_create_attr_defs() + # Use same attributes as for instance attributes + return attrs + self.get_instance_attr_defs() From ba57d6db6d37f3a8a5d24b02b4f5a3d66530eb7c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 3 May 2024 23:18:33 +0300 Subject: [PATCH 093/469] add essential publish plugins for model product type --- .../plugins/publish/collect_cache_farm.py | 7 +-- .../plugins/publish/collect_chunk_size.py | 2 +- .../plugins/publish/collect_output_node.py | 3 +- .../validate_export_is_a_single_frame.py | 60 +++++++++++++++++++ .../publish/validate_mesh_is_static.py | 6 +- .../publish/validate_mkpaths_toggled.py | 2 +- .../publish/validate_sop_output_node.py | 2 +- 7 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py index 040ad68a1a..dc433f0f58 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py @@ -10,7 +10,7 @@ class CollectDataforCache(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.04 families = ["ass", "pointcache", "mantraifd", "redshiftproxy", - "vdbcache"] + "vdbcache", "model"] hosts = ["houdini"] targets = ["local", "remote"] label = "Collect Data for Cache" @@ -42,10 +42,7 @@ class CollectDataforCache(pyblish.api.InstancePlugin): cache_files = {"_": instance.data["files"]} # Convert instance family to pointcache if it is bgeo or abc # because ??? - for family in instance.data["families"]: - if family == "bgeo" or "abc": - instance.data["productType"] = "pointcache" - break + self.log.debug(instance.data["families"]) instance.data.update({ "plugin": "Houdini", "publish": True diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py index 3e2561dd6f..f0913f2f0a 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py @@ -10,7 +10,7 @@ class CollectChunkSize(pyblish.api.InstancePlugin, order = pyblish.api.CollectorOrder + 0.05 families = ["ass", "pointcache", "vdbcache", "mantraifd", - "redshiftproxy"] + "redshiftproxy", "model"] hosts = ["houdini"] targets = ["local", "remote"] label = "Collect Chunk Size" diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py index 26381e065e..289222f32b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py @@ -15,7 +15,8 @@ class CollectOutputSOPPath(pyblish.api.InstancePlugin): "usd", "usdrender", "redshiftproxy", - "staticMesh" + "staticMesh", + "model" ] hosts = ["houdini"] diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py new file mode 100644 index 0000000000..6775699adf --- /dev/null +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- +"""Validator for checking that export is a single frame.""" +import pyblish.api +from ayon_core.pipeline import ( + PublishValidationError, + OptionalPyblishPluginMixin +) +from ayon_core.pipeline.publish import ValidateContentsOrder +from ayon_core.hosts.houdini.api.action import SelectInvalidAction + + +class ValidateSingleFrame(pyblish.api.InstancePlugin, + OptionalPyblishPluginMixin): + """Validate Export is a Single Frame. + + It checks if rop node is exporting one frame. + This is mainly for Model product type. + """ + + families = ["model"] + hosts = ["houdini"] + label = "Validate Single Frame" + order = ValidateContentsOrder + 0.1 + actions = [SelectInvalidAction] + + def process(self, instance): + + invalid = self.get_invalid(instance) + if invalid: + nodes = [n.path() for n in invalid] + raise PublishValidationError( + "See log for details. " + "Invalid nodes: {0}".format(nodes) + ) + + @classmethod + def get_invalid(cls, instance): + + invalid = [] + + frame_start = instance.data.get("frameStartHandle") + frame_end = instance.data.get("frameEndHandle") + + # This happens if instance node has no 'trange' parameter. + if (frame_start or frame_end) is None: + cls.log.debug( + "No frame data, skipping check.." + ) + return + + if frame_start != frame_end: + invalid.append(instance.data["instance_node"]) + cls.log.error( + "Invalid frame range on '%s'." + "You should use the same frame number for 'f1' " + "and 'f2' parameters.", + instance.data["instance_node"].path() + ) + + return invalid diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py index 289e00339b..9652367bfe 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py @@ -16,9 +16,13 @@ class ValidateMeshIsStatic(pyblish.api.InstancePlugin, """Validate mesh is static. It checks if output node is time dependent. + this avoids getting different output from ROP node when extracted + from a different frame than the first frame. + (Might be overly restrictive though) """ - families = ["staticMesh"] + families = ["staticMesh", + "model"] hosts = ["houdini"] label = "Validate Mesh is Static" order = ValidateContentsOrder + 0.1 diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py index 38f1c4e176..5e59eb505f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py @@ -7,7 +7,7 @@ class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): """Validate Create Intermediate Directories is enabled on ROP node.""" order = pyblish.api.ValidatorOrder - families = ["pointcache", "camera", "vdbcache"] + families = ["pointcache", "camera", "vdbcache", "model"] hosts = ["houdini"] label = "Create Intermediate Directories Checked" diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py index 61cf7596ac..d67192d28e 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py @@ -22,7 +22,7 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder - families = ["pointcache", "vdbcache"] + families = ["pointcache", "vdbcache", "model"] hosts = ["houdini"] label = "Validate Output Node (SOP)" actions = [SelectROPAction, SelectInvalidAction] From 5e0ab289293b37a195c3c59bf42221c4e04e823d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:04:36 +0200 Subject: [PATCH 094/469] renamed 'tools__get_config_data_name' to '_get_host_config_data' --- client/ayon_core/pipeline/colorspace.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 8dcbaeb877..f17e9d5f7b 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1069,7 +1069,7 @@ def get_imageio_config_preset( log, ) else: - config_data = _get_config_data( + config_data = _get_host_config_data( host_ocio_config["filepath"], template_data, env ) @@ -1082,7 +1082,7 @@ def get_imageio_config_preset( return config_data -def _get_config_data(path_list, anatomy_data, env=None): +def _get_host_config_data(path_list, anatomy_data, env=None): """Return first existing path in path list. If template is used in path inputs, From 1589ee5c0e9ccf35e723d7f703fad4118470c8bc Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:05:01 +0200 Subject: [PATCH 095/469] simplified '_get_host_config_data' --- client/ayon_core/pipeline/colorspace.py | 43 ++++++++++--------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index f17e9d5f7b..595c50606c 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1082,39 +1082,30 @@ def get_imageio_config_preset( return config_data -def _get_host_config_data(path_list, anatomy_data, env=None): +def _get_host_config_data(templates, template_data): """Return first existing path in path list. - If template is used in path inputs, - then it is formatted by anatomy data - and environment variables + Use template data to fill possible formatting in paths. Args: - path_list (list[str]): list of abs paths - anatomy_data (dict): formatting data - env (Optional[dict]): Environment variables. + templates (list[str]): List of templates to config paths. + template_data (dict): Template data used to format templates. Returns: - dict: config data + Union[dict, None]: Config data or 'None' if templates are empty + or any path exists. + """ - formatting_data = deepcopy(anatomy_data) - - environment_vars = env or dict(**os.environ) - - # format the path for potential env vars - formatting_data.update(environment_vars) - - # first try host config paths - for path_ in path_list: - formatted_path = _format_path(path_, formatting_data) - - if not os.path.exists(formatted_path): - continue - - return { - "path": os.path.normpath(formatted_path), - "template": path_ - } + for template in templates: + formatted_path = StringTemplate.format_strict_template( + template, template_data + ) + path = os.path.abspath(formatted_path) + if os.path.exists(path): + return { + "path": os.path.normpath(path), + "template": template + } def _format_path(template_path, formatting_data): From aaeaa1e7f0c6c977716b5e240b3610090d32190c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:10:14 +0200 Subject: [PATCH 096/469] removed unused '_format_path' --- client/ayon_core/pipeline/colorspace.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 595c50606c..363012dad5 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1108,24 +1108,6 @@ def _get_host_config_data(templates, template_data): } -def _format_path(template_path, formatting_data): - """Single template path formatting. - - Args: - template_path (str): template string - formatting_data (dict): data to be used for - template formatting - - Returns: - str: absolute formatted path - """ - # format path for anatomy keys - formatted_path = StringTemplate(template_path).format( - formatting_data) - - return os.path.abspath(formatted_path) - - def get_imageio_file_rules(project_name, host_name, project_settings=None): """Get ImageIO File rules from project settings From c6b6ca1e3cfbb3d400b65ec3ead9d5bd5518650b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:10:36 +0200 Subject: [PATCH 097/469] use safer option to format template path --- client/ayon_core/pipeline/colorspace.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 363012dad5..1ab93c7844 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1097,9 +1097,12 @@ def _get_host_config_data(templates, template_data): """ for template in templates: - formatted_path = StringTemplate.format_strict_template( + formatted_path = StringTemplate.format_template( template, template_data ) + if not formatted_path.solved: + continue + path = os.path.abspath(formatted_path) if os.path.exists(path): return { From bc01bf08f2a45339b476af61094904551a73a12b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:50:00 +0200 Subject: [PATCH 098/469] updated 'get_colorspace_settings_from_publish_context' to use new function --- client/ayon_core/pipeline/colorspace.py | 30 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 1ab93c7844..5793fd1143 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1236,27 +1236,41 @@ def get_colorspace_settings_from_publish_context(context_data): Returns: tuple | bool: config, file rules or None + """ if "imageioSettings" in context_data and context_data["imageioSettings"]: return context_data["imageioSettings"] project_name = context_data["projectName"] + folder_path = context_data["folderPath"] + task_name = context_data["task"] host_name = context_data["hostName"] - anatomy_data = context_data["anatomyData"] - project_settings_ = context_data["project_settings"] + anatomy = context_data["anatomy"] + template_data = context_data["anatomyData"] + project_settings = context_data["project_settings"] + folder_id = None + folder_entity = context_data.get("folderEntity") + if folder_entity: + folder_id = folder_entity["id"] - config_data = get_imageio_config( - project_name, host_name, - project_settings=project_settings_, - anatomy_data=anatomy_data + config_data = get_imageio_config_preset( + project_name, + folder_path, + task_name, + host_name, + anatomy=anatomy, + project_settings=project_settings, + template_data=template_data, + folder_id=folder_id, ) # caching invalid state, so it's not recalculated all the time file_rules = None if config_data: file_rules = get_imageio_file_rules( - project_name, host_name, - project_settings=project_settings_ + project_name, + host_name, + project_settings=project_settings ) # caching settings for future instance processing From 178e30d8e7fdba1012908f1f7574e824ab03055a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:52:31 +0200 Subject: [PATCH 099/469] fix call of '_get_host_config_data' --- client/ayon_core/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 5793fd1143..906f9f96fa 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1070,7 +1070,7 @@ def get_imageio_config_preset( ) else: config_data = _get_host_config_data( - host_ocio_config["filepath"], template_data, env + host_ocio_config["filepath"], template_data ) if not config_data: From 571658b1290c69b9444ecaabc35247722dd15aca Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:53:12 +0200 Subject: [PATCH 100/469] make context optional --- client/ayon_core/pipeline/colorspace.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 906f9f96fa..a715651f4a 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -783,8 +783,8 @@ def get_imageio_config( get_current_context_template_data) anatomy_data = get_current_context_template_data() - task_name = anatomy_data["task"]["name"] - folder_path = anatomy_data["folder"]["path"] + task_name = anatomy_data.get("task", {}).get("name") + folder_path = anatomy_data.get("folder", {}).get("path") return get_imageio_config_preset( project_name, folder_path, @@ -1029,13 +1029,17 @@ def get_imageio_config_preset( if not project_entity: project_entity = ayon_api.get_project(project_name) - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - folder_id = folder_entity["id"] - task_entity = ayon_api.get_task_by_name( - project_name, folder_id, task_name - ) + folder_entity = task_entity = folder_id = None + if folder_path: + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + folder_id = folder_entity["id"] + + if folder_id and task_name: + task_entity = ayon_api.get_task_by_name( + project_name, folder_id, task_name + ) template_data = get_template_data( project_entity, folder_entity, From cd857753ae6f24bf066514ecaf26d32bed827217 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:54:00 +0200 Subject: [PATCH 101/469] 'config_data' are now required in other functions --- client/ayon_core/pipeline/colorspace.py | 86 ++++++++++++++----------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index a715651f4a..9e33b2e531 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -126,42 +126,48 @@ def get_ocio_config_script_path(): def get_colorspace_name_from_filepath( - filepath, host_name, project_name, - config_data=None, file_rules=None, + filepath, + host_name, + project_name, + config_data, + file_rules=None, project_settings=None, validate=True ): """Get colorspace name from filepath Args: - filepath (str): path string, file rule pattern is tested on it - host_name (str): host name - project_name (str): project name - config_data (Optional[dict]): config path and template in dict. - Defaults to None. - file_rules (Optional[dict]): file rule data from settings. - Defaults to None. - project_settings (Optional[dict]): project settings. Defaults to None. + filepath (str): Path string, file rule pattern is tested on it. + host_name (str): Host name. + project_name (str): Project name. + config_data (dict): Config path and template in dict. + file_rules (Optional[dict]): File rule data from settings. + project_settings (Optional[dict]): Project settings. validate (Optional[bool]): should resulting colorspace be validated - with config file? Defaults to True. + with config file? Defaults to True. Returns: - str: name of colorspace - """ - project_settings, config_data, file_rules = _get_context_settings( - host_name, project_name, - config_data=config_data, file_rules=file_rules, - project_settings=project_settings - ) + Union[str, None]: name of colorspace + """ if not config_data: # in case global or host color management is not enabled return None + if file_rules is None: + if project_settings is None: + project_settings = get_project_settings(project_name) + file_rules = get_imageio_file_rules( + project_name, host_name, project_settings + ) + # use ImageIO file rules colorspace_name = get_imageio_file_rules_colorspace_from_filepath( - filepath, host_name, project_name, - config_data=config_data, file_rules=file_rules, + filepath, + host_name, + project_name, + config_data=config_data, + file_rules=file_rules, project_settings=project_settings ) @@ -187,7 +193,8 @@ def get_colorspace_name_from_filepath( # validate matching colorspace with config if validate: validate_imageio_colorspace_in_config( - config_data["path"], colorspace_name) + config_data["path"], colorspace_name + ) return colorspace_name @@ -226,8 +233,11 @@ def _get_context_settings( def get_imageio_file_rules_colorspace_from_filepath( - filepath, host_name, project_name, - config_data=None, file_rules=None, + filepath, + host_name, + project_name, + config_data, + file_rules=None, project_settings=None ): """Get colorspace name from filepath @@ -235,28 +245,28 @@ def get_imageio_file_rules_colorspace_from_filepath( ImageIO Settings file rules are tested for matching rule. Args: - filepath (str): path string, file rule pattern is tested on it - host_name (str): host name - project_name (str): project name - config_data (Optional[dict]): config path and template in dict. - Defaults to None. - file_rules (Optional[dict]): file rule data from settings. - Defaults to None. - project_settings (Optional[dict]): project settings. Defaults to None. + filepath (str): Path string, file rule pattern is tested on it. + host_name (str): Host name. + project_name (str): Project name. + config_data (dict): Config path and template in dict. + file_rules (Optional[dict]): File rule data from settings. + project_settings (Optional[dict]): Project settings. Returns: - str: name of colorspace - """ - project_settings, config_data, file_rules = _get_context_settings( - host_name, project_name, - config_data=config_data, file_rules=file_rules, - project_settings=project_settings - ) + Union[str, None]: Name of colorspace. + """ if not config_data: # in case global or host color management is not enabled return None + if file_rules is None: + if project_settings is None: + project_settings = get_project_settings(project_name) + file_rules = get_imageio_file_rules( + project_name, host_name, project_settings + ) + # match file rule from path colorspace_name = None for file_rule in file_rules: From 5d6993d1112c7e24285f43b78ae68193abe29e7b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:54:18 +0200 Subject: [PATCH 102/469] removed unused '_get_context_settings' --- client/ayon_core/pipeline/colorspace.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 9e33b2e531..0e745b625f 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -210,28 +210,6 @@ def get_colorspace_from_filepath(*args, **kwargs): return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) -def _get_context_settings( - host_name, project_name, - config_data=None, file_rules=None, - project_settings=None -): - project_settings = project_settings or get_project_settings( - project_name - ) - - config_data = config_data or get_imageio_config( - project_name, host_name, project_settings) - - # in case host color management is not enabled - if not config_data: - return (None, None, None) - - file_rules = file_rules or get_imageio_file_rules( - project_name, host_name, project_settings) - - return project_settings, config_data, file_rules - - def get_imageio_file_rules_colorspace_from_filepath( filepath, host_name, From 1586b316c8ab700b1f9e42dc57e813454010356a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:54:47 +0200 Subject: [PATCH 103/469] implemented function for current context --- client/ayon_core/pipeline/colorspace.py | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 0e745b625f..e0fa613ae8 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -23,6 +23,7 @@ from ayon_core.pipeline.template_data import get_template_data from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS +from .context_tools import get_current_context, get_current_host_name log = Logger.get_logger(__name__) @@ -1402,3 +1403,37 @@ def get_display_view_colorspace_subprocess(config_path, display, view): # return default view colorspace name with open(tmp_json_path, "r") as f: return json.load(f) + + +# --- Current context functions --- +def get_current_context_imageio_config_preset( + anatomy=None, + project_settings=None, + template_data=None, + env=None, +): + """Get ImageIO config preset for current context. + + Args: + anatomy (Optional[Anatomy]): Current project anatomy. + project_settings (Optional[dict[str, Any]]): Current project settings. + template_data (Optional[dict[str, Any]]): Prepared template data + for current context. + env (Optional[dict[str, str]]): Custom environment variable values. + + Returns: + dict: ImageIO config preset. + + """ + context = get_current_context() + host_name = get_current_host_name() + return get_imageio_config_preset( + context["project_name"], + context["folder_path"], + context["task_name"], + host_name, + anatomy=anatomy, + project_settings=project_settings, + template_data=template_data, + env=env, + ) From 3d1fa6471cbf8be68906a94aacea80bc90dc0a53 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 15:59:50 +0200 Subject: [PATCH 104/469] use 'get_current_context_imageio_config_preset' in host integrations --- client/ayon_core/hosts/hiero/api/lib.py | 5 +--- client/ayon_core/hosts/max/api/lib.py | 11 ++------ .../hosts/maya/plugins/load/load_image.py | 5 ++-- .../plugins/create/create_colorspace_look.py | 7 +----- .../publish/collect_explicit_colorspace.py | 25 +++++++++---------- 5 files changed, 18 insertions(+), 35 deletions(-) diff --git a/client/ayon_core/hosts/hiero/api/lib.py b/client/ayon_core/hosts/hiero/api/lib.py index aaf99546c7..456a68f125 100644 --- a/client/ayon_core/hosts/hiero/api/lib.py +++ b/client/ayon_core/hosts/hiero/api/lib.py @@ -1110,10 +1110,7 @@ def apply_colorspace_project(): ''' # backward compatibility layer # TODO: remove this after some time - config_data = get_imageio_config( - project_name=get_current_project_name(), - host_name="hiero" - ) + config_data = get_current_context_imageio_config_preset() if config_data: presets.update({ diff --git a/client/ayon_core/hosts/max/api/lib.py b/client/ayon_core/hosts/max/api/lib.py index d9a3af3336..4170a992a5 100644 --- a/client/ayon_core/hosts/max/api/lib.py +++ b/client/ayon_core/hosts/max/api/lib.py @@ -372,12 +372,8 @@ def reset_colorspace(): """ if int(get_max_version()) < 2024: return - project_name = get_current_project_name() - colorspace_mgr = rt.ColorPipelineMgr - project_settings = get_project_settings(project_name) - max_config_data = colorspace.get_imageio_config( - project_name, "max", project_settings) + max_config_data = colorspace.get_current_context_imageio_config_preset() if max_config_data: ocio_config_path = max_config_data["path"] colorspace_mgr = rt.ColorPipelineMgr @@ -392,10 +388,7 @@ def check_colorspace(): "because Max main window can't be found.") if int(get_max_version()) >= 2024: color_mgr = rt.ColorPipelineMgr - project_name = get_current_project_name() - project_settings = get_project_settings(project_name) - max_config_data = colorspace.get_imageio_config( - project_name, "max", project_settings) + max_config_data = colorspace.get_current_context_imageio_config_preset() if max_config_data and color_mgr.Mode != rt.Name("OCIO_Custom"): if not is_headless(): from ayon_core.tools.utils import SimplePopup diff --git a/client/ayon_core/hosts/maya/plugins/load/load_image.py b/client/ayon_core/hosts/maya/plugins/load/load_image.py index 5b0858ce70..171920f747 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_image.py +++ b/client/ayon_core/hosts/maya/plugins/load/load_image.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.load.utils import get_representation_path_from_context from ayon_core.pipeline.colorspace import ( get_imageio_file_rules_colorspace_from_filepath, - get_imageio_config, + get_current_context_imageio_config_preset, get_imageio_file_rules ) from ayon_core.settings import get_project_settings @@ -270,8 +270,7 @@ class FileNodeLoader(load.LoaderPlugin): host_name = get_current_host_name() project_settings = get_project_settings(project_name) - config_data = get_imageio_config( - project_name, host_name, + config_data = get_current_context_imageio_config_preset( project_settings=project_settings ) diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py index 4d865c1c5c..da05afe86b 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py @@ -156,14 +156,9 @@ This creator publishes color space look file (LUT). ] def apply_settings(self, project_settings): - host = self.create_context.host - host_name = host.name - project_name = host.get_current_project_name() - config_data = colorspace.get_imageio_config( - project_name, host_name, + config_data = colorspace.get_current_context_imageio_config_preset( project_settings=project_settings ) - if not config_data: self.enabled = False return diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py index 8e29a0048d..5fbb9a6f4c 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py @@ -1,10 +1,7 @@ import pyblish.api -from ayon_core.pipeline import ( - publish, - registered_host -) from ayon_core.lib import EnumDef from ayon_core.pipeline import colorspace +from ayon_core.pipeline import publish from ayon_core.pipeline.publish import KnownPublishError @@ -19,9 +16,10 @@ class CollectColorspace(pyblish.api.InstancePlugin, families = ["render", "plate", "reference", "image", "online"] enabled = False - colorspace_items = [ + default_colorspace_items = [ (None, "Don't override") ] + colorspace_items = list(default_colorspace_items) colorspace_attr_show = False config_items = None @@ -69,14 +67,13 @@ class CollectColorspace(pyblish.api.InstancePlugin, @classmethod def apply_settings(cls, project_settings): - host = registered_host() - host_name = host.name - project_name = host.get_current_project_name() - config_data = colorspace.get_imageio_config( - project_name, host_name, + config_data = colorspace.get_current_context_imageio_config_preset( project_settings=project_settings ) + enabled = False + colorspace_items = list(cls.default_colorspace_items) + config_items = None if config_data: filepath = config_data["path"] config_items = colorspace.get_ocio_config_colorspaces(filepath) @@ -85,9 +82,11 @@ class CollectColorspace(pyblish.api.InstancePlugin, include_aliases=True, include_roles=True ) - cls.config_items = config_items - cls.colorspace_items.extend(labeled_colorspaces) - cls.enabled = True + colorspace_items.extend(labeled_colorspaces) + + cls.config_items = config_items + cls.colorspace_items = colorspace_items + cls.enabled = enabled @classmethod def get_attribute_defs(cls): From f827dc2060488de74421cd7d0b8fc826a499975e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 16:55:59 +0200 Subject: [PATCH 105/469] use new function in pre launch hook --- client/ayon_core/hooks/pre_ocio_hook.py | 52 ++++++++++++++----------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/client/ayon_core/hooks/pre_ocio_hook.py b/client/ayon_core/hooks/pre_ocio_hook.py index 0817afec71..6c30b267bc 100644 --- a/client/ayon_core/hooks/pre_ocio_hook.py +++ b/client/ayon_core/hooks/pre_ocio_hook.py @@ -1,7 +1,7 @@ from ayon_applications import PreLaunchHook -from ayon_core.pipeline.colorspace import get_imageio_config -from ayon_core.pipeline.template_data import get_template_data_with_names +from ayon_core.pipeline.colorspace import get_imageio_config_preset +from ayon_core.pipeline.template_data import get_template_data class OCIOEnvHook(PreLaunchHook): @@ -26,32 +26,38 @@ class OCIOEnvHook(PreLaunchHook): def execute(self): """Hook entry method.""" - template_data = get_template_data_with_names( - project_name=self.data["project_name"], - folder_path=self.data["folder_path"], - task_name=self.data["task_name"], + folder_entity = self.data["folder_entity"] + + template_data = get_template_data( + self.data["project_entity"], + folder_entity=folder_entity, + task_entity=self.data["task_entity"], host_name=self.host_name, - settings=self.data["project_settings"] + settings=self.data["project_settings"], ) - config_data = get_imageio_config( - project_name=self.data["project_name"], - host_name=self.host_name, - project_settings=self.data["project_settings"], - anatomy_data=template_data, + config_data = get_imageio_config_preset( + self.data["project_name"], + self.data["folder_path"], + self.data["task_name"], + self.host_name, anatomy=self.data["anatomy"], + project_settings=self.data["project_settings"], + template_data=template_data, env=self.launch_context.env, + folder_id=folder_entity["id"], ) - if config_data: - ocio_path = config_data["path"] - - if self.host_name in ["nuke", "hiero"]: - ocio_path = ocio_path.replace("\\", "/") - - self.log.info( - f"Setting OCIO environment to config path: {ocio_path}") - - self.launch_context.env["OCIO"] = ocio_path - else: + if not config_data: self.log.debug("OCIO not set or enabled") + return + + ocio_path = config_data["path"] + + if self.host_name in ["nuke", "hiero"]: + ocio_path = ocio_path.replace("\\", "/") + + self.log.info( + f"Setting OCIO environment to config path: {ocio_path}") + + self.launch_context.env["OCIO"] = ocio_path From 5a43242bda200a79454fbef579e00156c29fd144 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 16:56:43 +0200 Subject: [PATCH 106/469] use 'get_current_context_imageio_config_preset' in nuke --- client/ayon_core/hosts/nuke/api/lib.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index e3505a16f2..0a4755c166 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -43,7 +43,9 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.context_tools import ( get_current_context_custom_workfile_template ) -from ayon_core.pipeline.colorspace import get_imageio_config +from ayon_core.pipeline.colorspace import ( + get_current_context_imageio_config_preset +) from ayon_core.pipeline.workfile import BuildWorkfile from . import gizmo_menu from .constants import ASSIST @@ -1552,10 +1554,7 @@ class WorkfileSettings(object): imageio_host (dict): host colorspace configurations ''' - config_data = get_imageio_config( - project_name=get_current_project_name(), - host_name="nuke" - ) + config_data = get_current_context_imageio_config_preset() workfile_settings = imageio_host["workfile"] color_management = workfile_settings["color_management"] From 1568d40c98c07919dc90fdffc85f1c9a39af59c8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 16:57:03 +0200 Subject: [PATCH 107/469] temp json fole wrapper is safe --- client/ayon_core/pipeline/colorspace.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index e0fa613ae8..e985bdfcf5 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -87,28 +87,25 @@ def deprecated(new_destination): def _make_temp_json_file(): """Wrapping function for json temp file """ + temporary_json_file = None try: # Store dumped json to temporary file - temporary_json_file = tempfile.NamedTemporaryFile( + with tempfile.NamedTemporaryFile( mode="w", suffix=".json", delete=False - ) - temporary_json_file.close() - temporary_json_filepath = temporary_json_file.name.replace( - "\\", "/" - ) + ) as tmpfile: + temporary_json_filepath = tmpfile.name.replace("\\", "/") yield temporary_json_filepath - except IOError as _error: + except IOError as exc: raise IOError( - "Unable to create temp json file: {}".format( - _error - ) + "Unable to create temp json file: {}".format(exc) ) finally: # Remove the temporary json - os.remove(temporary_json_filepath) + if temporary_json_file is not None: + os.remove(temporary_json_filepath) def get_ocio_config_script_path(): From c0d5e77177463ca075ee1fed2e9c61416dd6196d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 16:57:27 +0200 Subject: [PATCH 108/469] simplified 'get_ocio_config_script_path' --- client/ayon_core/pipeline/colorspace.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index e985bdfcf5..cbd63c851f 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -113,13 +113,12 @@ def get_ocio_config_script_path(): Returns: str: path string + """ - return os.path.normpath( - os.path.join( - AYON_CORE_ROOT, - "scripts", - "ocio_wrapper.py" - ) + return os.path.join( + os.path.normpath(AYON_CORE_ROOT), + "scripts", + "ocio_wrapper.py" ) From 0c84c32e15ce1732139afaef5533c8f16e8f0c78 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:00:09 +0200 Subject: [PATCH 109/469] pass config data to 'get_imageio_file_rules_colorspace_from_filepath' in nuke loader --- client/ayon_core/hosts/nuke/plugins/load/load_clip.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py index df8f2ab018..1f707c25cf 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py @@ -9,7 +9,8 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.colorspace import ( - get_imageio_file_rules_colorspace_from_filepath + get_imageio_file_rules_colorspace_from_filepath, + get_current_context_imageio_config_preset, ) from ayon_core.hosts.nuke.api.lib import ( get_imageio_input_colorspace, @@ -547,9 +548,10 @@ class LoadClip(plugin.NukeLoader): f"Colorspace from representation colorspaceData: {colorspace}" ) + config_data = get_current_context_imageio_config_preset() # check if any filerules are not applicable new_parsed_colorspace = get_imageio_file_rules_colorspace_from_filepath( # noqa - filepath, "nuke", project_name + filepath, "nuke", project_name, config_data=config_data ) self.log.debug(f"Colorspace new filerules: {new_parsed_colorspace}") From 5599d773c7f49f4ecee35a6cca1a0c1186b92a2e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:02:21 +0200 Subject: [PATCH 110/469] use 'get_imageio_file_rules_colorspace_from_filepath' instead of 'get_imageio_colorspace_from_filepath' --- client/ayon_core/pipeline/colorspace.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index cbd63c851f..7b0d4c8491 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1328,12 +1328,15 @@ def set_colorspace_data_to_representation( filename = filename[0] # get matching colorspace from rules - colorspace = colorspace or get_imageio_colorspace_from_filepath( - filename, host_name, project_name, - config_data=config_data, - file_rules=file_rules, - project_settings=project_settings - ) + if colorspace is None: + colorspace = get_imageio_file_rules_colorspace_from_filepath( + filename, + host_name, + project_name, + config_data=config_data, + file_rules=file_rules, + project_settings=project_settings + ) # infuse data to representation if colorspace: From bf8b2fb3fafd6d9ee8cd7a868b7b44f26514147a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:02:41 +0200 Subject: [PATCH 111/469] 'get_display_view_colorspace_subprocess' is private --- client/ayon_core/pipeline/colorspace.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 7b0d4c8491..4034527282 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1364,15 +1364,16 @@ def get_display_view_colorspace_name(config_path, display, view): if not compatibility_check(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess - return get_display_view_colorspace_subprocess(config_path, - display, view) + return _get_display_view_colorspace_subprocess( + config_path, display, view + ) from ayon_core.scripts.ocio_wrapper import _get_display_view_colorspace_name # noqa return _get_display_view_colorspace_name(config_path, display, view) -def get_display_view_colorspace_subprocess(config_path, display, view): +def _get_display_view_colorspace_subprocess(config_path, display, view): """Returns the colorspace attribute of the (display, view) pair via subprocess. From 322e36128a8ed2497fa862e1ad150f834ecd73be Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:04:12 +0200 Subject: [PATCH 112/469] space sufficient cache logic --- client/ayon_core/pipeline/colorspace.py | 29 +++++++++++-------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 4034527282..77c830d44a 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -509,16 +509,15 @@ def get_ocio_config_colorspaces(config_path): if not compatibility_check(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess - CachedData.ocio_config_colorspaces[config_path] = \ - _get_wrapped_with_subprocess( - "config", "get_colorspace", in_path=config_path + config_colorspaces = _get_wrapped_with_subprocess( + "config", "get_colorspace", in_path=config_path ) else: # TODO: refactor this so it is not imported but part of this file from ayon_core.scripts.ocio_wrapper import _get_colorspace_data - CachedData.ocio_config_colorspaces[config_path] = \ - _get_colorspace_data(config_path) + config_colorspaces = _get_colorspace_data(config_path) + CachedData.ocio_config_colorspaces[config_path] = config_colorspaces return CachedData.ocio_config_colorspaces[config_path] @@ -1160,16 +1159,15 @@ def get_remapped_colorspace_to_native( Union[str, None]: native colorspace name defined in remapping or None """ - CachedData.remapping.setdefault(host_name, {}) - if CachedData.remapping[host_name].get("to_native") is None: + host_mapping = CachedData.remapping.setdefault(host_name, {}) + if "to_native" not in host_mapping: remapping_rules = imageio_host_settings["remapping"]["rules"] - CachedData.remapping[host_name]["to_native"] = { + host_mapping["to_native"] = { rule["ocio_name"]: rule["host_native_name"] for rule in remapping_rules } - return CachedData.remapping[host_name]["to_native"].get( - ocio_colorspace_name) + return host_mapping["to_native"].get(ocio_colorspace_name) def get_remapped_colorspace_from_native( @@ -1184,18 +1182,17 @@ def get_remapped_colorspace_from_native( Returns: Union[str, None]: Ocio colorspace name defined in remapping or None. - """ - CachedData.remapping.setdefault(host_name, {}) - if CachedData.remapping[host_name].get("from_native") is None: + """ + host_mapping = CachedData.remapping.setdefault(host_name, {}) + if "from_native" not in host_mapping: remapping_rules = imageio_host_settings["remapping"]["rules"] - CachedData.remapping[host_name]["from_native"] = { + host_mapping["from_native"] = { rule["host_native_name"]: rule["ocio_name"] for rule in remapping_rules } - return CachedData.remapping[host_name]["from_native"].get( - host_native_colorspace_name) + return host_mapping["from_native"].get(host_native_colorspace_name) def _get_imageio_settings(project_settings, host_name): From b679b06919bfbde31790f920d6fb95555849f675 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:04:42 +0200 Subject: [PATCH 113/469] formatting changes --- client/ayon_core/pipeline/colorspace.py | 48 +++++++++++++------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 77c830d44a..ed590758a3 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -334,10 +334,10 @@ def parse_colorspace_from_filepath( pattern = "|".join( # Allow to match spaces also as underscores because the # integrator replaces spaces with underscores in filenames - re.escape(colorspace) for colorspace in + re.escape(colorspace) # Sort by longest first so the regex matches longer matches # over smaller matches, e.g. matching 'Output - sRGB' over 'sRGB' - sorted(colorspaces, key=len, reverse=True) + for colorspace in sorted(colorspaces, key=len, reverse=True) ) return re.compile(pattern) @@ -529,11 +529,12 @@ def convert_colorspace_enumerator_item( """Convert colorspace enumerator item to dictionary Args: - colorspace_item (str): colorspace and family in couple - config_items (dict[str,dict]): colorspace data + colorspace_enum_item (str): Colorspace and family in couple. + config_items (dict[str,dict]): Colorspace data. Returns: dict: colorspace data + """ if "::" not in colorspace_enum_item: return None @@ -1103,13 +1104,13 @@ def get_imageio_file_rules(project_name, host_name, project_settings=None): """Get ImageIO File rules from project settings Args: - project_name (str): project name - host_name (str): host name - project_settings (dict, optional): project settings. - Defaults to None. + project_name (str): Project name. + host_name (str): Host name. + project_settings (Optional[dict]): Project settings. Returns: list[dict[str, Any]]: file rules data + """ project_settings = project_settings or get_project_settings(project_name) @@ -1151,7 +1152,7 @@ def get_remapped_colorspace_to_native( """Return native colorspace name. Args: - ocio_colorspace_name (str | None): ocio colorspace name + ocio_colorspace_name (str | None): OCIO colorspace name. host_name (str): Host name. imageio_host_settings (dict[str, Any]): ImageIO host settings. @@ -1199,12 +1200,12 @@ def _get_imageio_settings(project_settings, host_name): """Get ImageIO settings for global and host Args: - project_settings (dict): project settings. - Defaults to None. - host_name (str): host name + project_settings (dict[str, Any]): Project settings. + host_name (str): Host name. Returns: - tuple[dict, dict]: image io settings for global and host + tuple[dict, dict]: Image io settings for global and host. + """ # get image io from global and host_name imageio_global = project_settings["core"]["imageio"] @@ -1266,18 +1267,13 @@ def get_colorspace_settings_from_publish_context(context_data): def set_colorspace_data_to_representation( - representation, context_data, + representation, + context_data, colorspace=None, log=None ): """Sets colorspace data to representation. - Args: - representation (dict): publishing representation - context_data (publish.Context.data): publishing context data - colorspace (str, optional): colorspace name. Defaults to None. - log (logging.Logger, optional): logger instance. Defaults to None. - Example: ``` { @@ -1292,6 +1288,12 @@ def set_colorspace_data_to_representation( } ``` + Args: + representation (dict): publishing representation + context_data (publish.Context.data): publishing context data + colorspace (Optional[str]): Colorspace name. + log (Optional[logging.Logger]): logger instance. + """ log = log or Logger.get_logger(__name__) @@ -1355,9 +1357,9 @@ def get_display_view_colorspace_name(config_path, display, view): view (str): view name e.g. "sRGB" Returns: - view color space name (str) e.g. "Output - sRGB" - """ + str: View color space name. e.g. "Output - sRGB" + """ if not compatibility_check(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess @@ -1381,8 +1383,8 @@ def _get_display_view_colorspace_subprocess(config_path, display, view): Returns: view color space name (str) e.g. "Output - sRGB" - """ + """ with _make_temp_json_file() as tmp_json_path: # Prepare subprocess arguments args = [ From ff05fafb77e5901e34e2dbcb070435f5fc72cd96 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 6 May 2024 18:04:52 +0200 Subject: [PATCH 114/469] mark 'get_imageio_config' as deprecated --- client/ayon_core/pipeline/colorspace.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index ed590758a3..e9da194984 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -735,6 +735,7 @@ def get_views_data_subprocess(config_path): ) +@deprecated("get_imageio_config_preset") def get_imageio_config( project_name, host_name, From 8a971f393c3a2d2f9cecb6afbd910d8f17a76d25 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 7 May 2024 09:25:31 +0100 Subject: [PATCH 115/469] CollectHeadlessFarm > ContextPlugin --- .../plugins/publish/collect_headless_farm.py | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 9bcdd199f3..b9b5acf0bc 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -1,41 +1,42 @@ import pyblish.api -class CollectHeadlessFarm(pyblish.api.InstancePlugin): +class CollectHeadlessFarm(pyblish.api.ContextPlugin): """Setup instances for headless farm submission.""" order = pyblish.api.CollectorOrder + 0.4999 label = "Collect Headless Farm" hosts = ["nuke"] - def process(self, instance): - if not instance.context.data.get("headless_farm", False): - return + def process(self, context): + for instance in context: + if not instance.context.data.get("headless_farm", False): + continue - if instance.data["family"] == "workfile": - instance.data["active"] = False + if instance.data["family"] == "workfile": + instance.data["active"] = False + + # Disable version validation. + instance.data.pop("latestVersion") + continue + + # Filter out all other instances. + node = instance.data["transientData"]["node"] + if node.name() != instance.context.data["node_name"]: + instance.data["active"] = False + continue + + # Enable for farm publishing. + instance.data["farm"] = True + + # Clear the families as we only want the main family, ei. no review + # etc. + instance.data["families"] = [] + + # Use the workfile instead of published. + settings = instance.data["publish_attributes"] + settings = settings["NukeSubmitDeadline"] + settings["use_published_workfile"] = False # Disable version validation. instance.data.pop("latestVersion") - return - - # Filter out all other instances. - node = instance.data["transientData"]["node"] - if node.name() != instance.context.data["node_name"]: - instance.data["active"] = False - return - - # Enable for farm publishing. - instance.data["farm"] = True - - # Clear the families as we only want the main family, ei. no review - # etc. - instance.data["families"] = [] - - # Use the workfile instead of published. - settings = instance.data["publish_attributes"] - settings = settings["NukeSubmitDeadline"] - settings["use_published_workfile"] = False - - # Disable version validation. - instance.data.pop("latestVersion") From 978e7d1be5388fcf3f6bde665917913599f63e7f Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 7 May 2024 09:46:44 +0100 Subject: [PATCH 116/469] Update client/ayon_core/hosts/nuke/api/lib.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/hosts/nuke/api/lib.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index 2703307400..868c0ada34 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1155,13 +1155,9 @@ def create_write_node( node (obj): group node with avalon data as Knobs ''' # Ensure name does not contain any invalid characters. - special_characters = set("!@#$%^&*()=[]{}|\\;',.<>/?~+-") - found_special_characters = [] - - # Check each character in the node name - for char in name: - if char in special_characters: - found_special_characters.append(char) + special_chars = re.escape("!@#$%^&*()=[]{}|\\;',.<>/?~+-") + special_chars_regex = re.compile(f"[{special_chars}]") + found_special_characters = list(special_chars_regex.findall(name)) msg = ( f"Special characters found in name \"{name}\": " From e9dc1d4a05efb9c03459da3d652f6806e63f6120 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 7 May 2024 09:48:58 +0100 Subject: [PATCH 117/469] Update client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index b9b5acf0bc..73d2450351 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -9,10 +9,10 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): hosts = ["nuke"] def process(self, context): - for instance in context: - if not instance.context.data.get("headless_farm", False): - continue + if not context.data.get("headless_farm", False): + return + for instance in context: if instance.data["family"] == "workfile": instance.data["active"] = False From 72116cd976f6fa5ccab07b902cf3a6e60d7d3700 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 7 May 2024 09:51:42 +0100 Subject: [PATCH 118/469] Update client/ayon_core/hosts/nuke/api/utils.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/hosts/nuke/api/utils.py | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 8eb0339a89..3752028c91 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -173,26 +173,9 @@ def create_error_report(context): success = False - err = result["error"] - formatted_traceback = "".join( - traceback.format_exception( - type(err), - err, - err.__traceback__ - ) - ) - fname = result["plugin"].__module__ - if 'File "", line' in formatted_traceback: - _, lineno, func, msg = err.traceback - fname = os.path.abspath(fname) - formatted_traceback = formatted_traceback.replace( - 'File "", line', - 'File "{0}", line'.format(fname) - ) - err = result["error"] error_message += "\n" - error_message += formatted_traceback + error_message += err.formatted_traceback return success, error_message From 5b591b602fe8119f68d7cf4656812c5c0cc2911f Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 7 May 2024 10:07:27 +0100 Subject: [PATCH 119/469] Ensure CreateInstance is active. --- client/ayon_core/hosts/nuke/api/utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 3752028c91..08e2630cbd 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -204,6 +204,14 @@ def _submit_headless_farm(node): host = registered_host() create_context = CreateContext(host) + + # Ensure CreateInstance is enabled. + for instance in create_context.instances: + if node.name() != instance.transient_data["node"].name(): + continue + + instance.data["active"] = True + context = pyblish.api.Context() context.data["create_context"] = create_context # Used in pyblish plugin to determine which instance to publish. From 54500dbb59d9e6c4ab0ad5625f568aea64c01548 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Tue, 7 May 2024 10:08:29 +0100 Subject: [PATCH 120/469] Update client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 73d2450351..4bdfc28fe9 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -15,9 +15,6 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): for instance in context: if instance.data["family"] == "workfile": instance.data["active"] = False - - # Disable version validation. - instance.data.pop("latestVersion") continue # Filter out all other instances. From fd71818d4683b47a3aa43a61e2323fd570dbd5e3 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 7 May 2024 10:11:54 +0100 Subject: [PATCH 121/469] Remove redundant code --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 4bdfc28fe9..f2af3551d9 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -34,6 +34,3 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): settings = instance.data["publish_attributes"] settings = settings["NukeSubmitDeadline"] settings["use_published_workfile"] = False - - # Disable version validation. - instance.data.pop("latestVersion") From d8eb451887e17ad3eb3ca794d29d8f442159cc62 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 7 May 2024 10:30:55 +0100 Subject: [PATCH 122/469] Illicit feedback --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 6 ++---- .../hosts/nuke/plugins/publish/extract_headless_farm.py | 1 + .../deadline/plugins/publish/submit_nuke_deadline.py | 7 +++++-- client/ayon_core/plugins/publish/validate_version.py | 9 +++++++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index f2af3551d9..dfd294cebc 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -28,9 +28,7 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): # Clear the families as we only want the main family, ei. no review # etc. - instance.data["families"] = [] + instance.data["families"] = ["headless_farm"] # Use the workfile instead of published. - settings = instance.data["publish_attributes"] - settings = settings["NukeSubmitDeadline"] - settings["use_published_workfile"] = False + instance.data["use_published_workfile"] = False diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py index be74a05392..003e51aa1a 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py @@ -13,6 +13,7 @@ class ExtractHeadlessFarm(pyblish.api.InstancePlugin): order = pyblish.api.ExtractorOrder + 0.499 label = "Extract Headless Farm" hosts = ["nuke"] + families = ["headless_farm"] def process(self, instance): if not instance.context.data.get("headless_farm", False): diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index d70cb75bf3..751fb4c46a 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -128,8 +128,11 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, render_path = instance.data['path'] script_path = context.data["currentFile"] - use_published_workfile = instance.data["attributeValues"].get( - "use_published_workfile", self.use_published_workfile + use_published_workfile = instance.data.get( + "use_published_workfile", + instance.data["attributeValues"].get( + "use_published_workfile", self.use_published_workfile + ) ) if use_published_workfile: script_path = self._get_published_workfile_path(context) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index 9031194e8c..25a5757330 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -1,8 +1,10 @@ import pyblish.api -from ayon_core.pipeline.publish import PublishValidationError +from ayon_core.pipeline.publish import ( + PublishValidationError, OptionalPyblishPluginMixin +) -class ValidateVersion(pyblish.api.InstancePlugin): +class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): """Validate instance version. AYON does not allow overwriting previously published versions. @@ -18,6 +20,9 @@ class ValidateVersion(pyblish.api.InstancePlugin): active = True def process(self, instance): + if not self.is_active(instance.data): + return + version = instance.data.get("version") latest_version = instance.data.get("latestVersion") From ad7d24c5cfbba3d27f14a69b167ec71b8bc6e819 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Tue, 7 May 2024 12:09:20 +0100 Subject: [PATCH 123/469] Disable instances as early as possible. --- .../plugins/publish/collect_headless_farm.py | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index dfd294cebc..5a3d3cc0de 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -4,7 +4,8 @@ import pyblish.api class CollectHeadlessFarm(pyblish.api.ContextPlugin): """Setup instances for headless farm submission.""" - order = pyblish.api.CollectorOrder + 0.4999 + # Needs to be after CollectFromCreateContext + order = pyblish.api.CollectorOrder - 0.4 label = "Collect Headless Farm" hosts = ["nuke"] @@ -23,12 +24,24 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): instance.data["active"] = False continue - # Enable for farm publishing. - instance.data["farm"] = True + instance.data["families"].append("headless_farm") - # Clear the families as we only want the main family, ei. no review - # etc. - instance.data["families"] = ["headless_farm"] - # Use the workfile instead of published. - instance.data["use_published_workfile"] = False +class SetupHeadlessFarm(pyblish.api.InstancePlugin): + """Setup instance for headless farm submission.""" + + order = pyblish.api.CollectorOrder + 0.4999 + label = "Setup Headless Farm" + hosts = ["nuke"] + families = ["headless_farm"] + + def process(self, instance): + # Enable for farm publishing. + instance.data["farm"] = True + + # Clear the families as we only want the main family, ei. no review + # etc. + instance.data["families"] = ["headless_farm"] + + # Use the workfile instead of published. + instance.data["use_published_workfile"] = False From 2facf91bcb4a5ea5812dc93b3b2c026978a7a7f3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 7 May 2024 13:51:36 +0200 Subject: [PATCH 124/469] AY-4801-Added conversion of resources Added similar configuration as for ExtractReview to control possible conversion from .mov to target format (.mp4) --- .../plugins/publish/extract_editorial_pckg.py | 151 ++++++++++++++++-- .../server/settings/publish_plugins.py | 89 ++++++++++- 2 files changed, 230 insertions(+), 10 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index dc8163e1ff..02f953d579 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -1,16 +1,20 @@ +import copy import os.path +import subprocess + import opentimelineio import pyblish.api +from ayon_core.lib import filter_profiles, get_ffmpeg_tool_args, run_subprocess from ayon_core.pipeline import publish -class ExtractEditorialPackage(publish.Extractor): +class ExtractEditorialPckgConversion(publish.Extractor): """Replaces movie paths in otio file with publish rootless - Prepares movie resources for integration. - TODO introduce conversion to .mp4 + Prepares movie resources for integration (adds them to `transfers`). + Converts .mov files according to output definition. """ label = "Extract Editorial Package" @@ -35,13 +39,22 @@ class ExtractEditorialPackage(publish.Extractor): instance.data["representations"].append(editorial_pckg_repre) - publish_path = self._get_published_path(instance) - publish_folder = os.path.dirname(publish_path) - publish_resource_folder = os.path.join(publish_folder, "resources") - + publish_resource_folder = self._get_publish_resource_folder(instance) resource_paths = editorial_pckg_data["resource_paths"] transfers = self._get_transfers(resource_paths, publish_resource_folder) + + project_settings = instance.context.data["project_settings"] + profiles = (project_settings["traypublisher"] + ["publish"] + ["ExtractEditorialPckgConversion"] + .get("profiles")) + output_def = None + if profiles: + output_def = self._get_output_definition(instance, profiles) + if output_def: + transfers = self._convert_resources(output_def, transfers) + if not "transfers" in instance.data: instance.data["transfers"] = [] instance.data["transfers"] = transfers @@ -57,6 +70,36 @@ class ExtractEditorialPackage(publish.Extractor): self.log.info("Added Editorial Package representation: {}".format( editorial_pckg_repre)) + def _get_publish_resource_folder(self, instance): + """Calculates publish folder and create it.""" + publish_path = self._get_published_path(instance) + publish_folder = os.path.dirname(publish_path) + publish_resource_folder = os.path.join(publish_folder, "resources") + + if not os.path.exists(publish_resource_folder): + os.makedirs(publish_resource_folder, exist_ok=True) + return publish_resource_folder + + def _get_output_definition(self, instance, profiles): + """Return appropriate profile by context information.""" + product_type = instance.data["productType"] + product_name = instance.data["productName"] + task_entity = instance.data["taskEntity"] or {} + task_name = task_entity.get("name") + task_type = task_entity.get("taskType") + filtering_criteria = { + "product_types": product_type, + "product_names": product_name, + "task_names": task_name, + "task_types": task_type, + } + profile = filter_profiles( + profiles, + filtering_criteria, + logger=self.log + ) + return profile + def _get_resource_path_mapping(self, instance, transfers): """Returns dict of {source_mov_path: rootless_published_path}.""" replace_paths = {} @@ -68,7 +111,7 @@ class ExtractEditorialPackage(publish.Extractor): return replace_paths def _get_transfers(self, resource_paths, publish_resource_folder): - """Returns list of tuples (source, destination) movie paths.""" + """Returns list of tuples (source, destination) with movie paths.""" transfers = [] for res_path in resource_paths: res_basename = os.path.basename(res_path) @@ -77,7 +120,7 @@ class ExtractEditorialPackage(publish.Extractor): return transfers def _replace_target_urls(self, otio_data, replace_paths): - """Replace original movie paths with published rootles ones.""" + """Replace original movie paths with published rootless ones.""" for track in otio_data.tracks: for clip in track: # Check if the clip has a media reference @@ -120,3 +163,93 @@ class ExtractEditorialPackage(publish.Extractor): template = anatomy.get_template_item("publish", "default", "path") template_filled = template.format_strict(template_data) return os.path.normpath(template_filled) + + def _convert_resources(self, output_def, transfers): + """Converts all resource files to configured format.""" + outputs = output_def["outputs"] + if not outputs: + self.log.warning("No output configured in " + "ayon+settings://traypublisher/publish/ExtractEditorialPckgConversion/profiles/0/outputs") # noqa + return transfers + + final_transfers = [] + # most likely only single output is expected + for output in outputs: + out_extension = output["ext"] + out_def_ffmpeg_args = output["ffmpeg_args"] + ffmpeg_input_args = [ + value.strip() + for value in out_def_ffmpeg_args["input"] + if value.strip() + ] + ffmpeg_video_filters = [ + value.strip() + for value in out_def_ffmpeg_args["video_filters"] + if value.strip() + ] + ffmpeg_audio_filters = [ + value.strip() + for value in out_def_ffmpeg_args["audio_filters"] + if value.strip() + ] + ffmpeg_output_args = [ + value.strip() + for value in out_def_ffmpeg_args["output"] + if value.strip() + ] + ffmpeg_input_args = self._split_ffmpeg_args(ffmpeg_input_args) + + generic_args = [ + subprocess.list2cmdline(get_ffmpeg_tool_args("ffmpeg")) + ] + generic_args.extend(ffmpeg_input_args) + if ffmpeg_video_filters: + generic_args.append("-filter:v") + generic_args.append( + "\"{}\"".format(",".join(ffmpeg_video_filters))) + + if ffmpeg_audio_filters: + generic_args.append("-filter:a") + generic_args.append( + "\"{}\"".format(",".join(ffmpeg_audio_filters))) + + for source, destination in transfers: + base_name = os.path.basename(destination) + file_name, ext = os.path.splitext(base_name) + dest_path = os.path.join(os.path.dirname(destination), + f"{file_name}.{out_extension}") + final_transfers.append((source, dest_path)) + + all_args = copy.deepcopy(generic_args) + all_args.append(f"-i {source}") + all_args.extend(ffmpeg_output_args) # order matters + all_args.append(f"{dest_path}") + subprcs_cmd = " ".join(all_args) + + # run subprocess + self.log.debug("Executing: {}".format(subprcs_cmd)) + run_subprocess(subprcs_cmd, shell=True, logger=self.log) + return final_transfers + + def _split_ffmpeg_args(self, in_args): + """Makes sure all entered arguments are separated in individual items. + + Split each argument string with " -" to identify if string contains + one or more arguments. + """ + splitted_args = [] + for arg in in_args: + sub_args = arg.split(" -") + if len(sub_args) == 1: + if arg and arg not in splitted_args: + splitted_args.append(arg) + continue + + for idx, arg in enumerate(sub_args): + if idx != 0: + arg = "-" + arg + + if arg and arg not in splitted_args: + splitted_args.append(arg) + return splitted_args + diff --git a/server_addon/traypublisher/server/settings/publish_plugins.py b/server_addon/traypublisher/server/settings/publish_plugins.py index f413c86227..9869f54620 100644 --- a/server_addon/traypublisher/server/settings/publish_plugins.py +++ b/server_addon/traypublisher/server/settings/publish_plugins.py @@ -1,4 +1,11 @@ -from ayon_server.settings import BaseSettingsModel, SettingsField +from pydantic import validator + +from ayon_server.settings import ( + BaseSettingsModel, + SettingsField, + task_types_enum, + ensure_unique_names +) class ValidatePluginModel(BaseSettingsModel): @@ -14,6 +21,74 @@ class ValidateFrameRangeModel(ValidatePluginModel): 'my_asset_to_publish.mov')""" +class ExtractEditorialPckgFFmpegModel(BaseSettingsModel): + video_filters: list[str] = SettingsField( + default_factory=list, + title="Video filters" + ) + audio_filters: list[str] = SettingsField( + default_factory=list, + title="Audio filters" + ) + input: list[str] = SettingsField( + default_factory=list, + title="Input arguments" + ) + output: list[str] = SettingsField( + default_factory=list, + title="Output arguments" + ) + + +class ExtractEditorialPckgOutputDefModel(BaseSettingsModel): + """Set extension and ffmpeg arguments. See `ExtractReview` for example.""" + _layout = "expanded" + name: str = SettingsField("", title="Name") + ext: str = SettingsField("", title="Output extension") + + ffmpeg_args: ExtractEditorialPckgFFmpegModel = SettingsField( + default_factory=ExtractEditorialPckgFFmpegModel, + title="FFmpeg arguments" + ) + + +class ExtractEditorialPckgProfileModel(BaseSettingsModel): + product_types: list[str] = SettingsField( + default_factory=list, + title="Product types" + ) + task_types: list[str] = SettingsField( + default_factory=list, + title="Task types", + enum_resolver=task_types_enum + ) + task_names: list[str] = SettingsField( + default_factory=list, + title="Task names" + ) + product_names: list[str] = SettingsField( + default_factory=list, + title="Product names" + ) + outputs: list[ExtractEditorialPckgOutputDefModel] = SettingsField( + default_factory=list, + title="Output Definitions", + ) + + @validator("outputs") + def validate_unique_outputs(cls, value): + ensure_unique_names(value) + return value + + +class ExtractEditorialPckgConversionModel(BaseSettingsModel): + """Conversion of input movie files into expected format.""" + enabled: bool = SettingsField(True) + profiles: list[ExtractEditorialPckgProfileModel] = SettingsField( + default_factory=list, title="Profiles" + ) + + class TrayPublisherPublishPlugins(BaseSettingsModel): CollectFrameDataFromAssetEntity: ValidatePluginModel = SettingsField( default_factory=ValidatePluginModel, @@ -28,6 +103,13 @@ class TrayPublisherPublishPlugins(BaseSettingsModel): default_factory=ValidatePluginModel, ) + ExtractEditorialPckgConversion: ExtractEditorialPckgConversionModel = ( + SettingsField( + default_factory=ExtractEditorialPckgConversionModel, + title="Extract Editorial Package Conversion" + ) + ) + DEFAULT_PUBLISH_PLUGINS = { "CollectFrameDataFromAssetEntity": { @@ -44,5 +126,10 @@ DEFAULT_PUBLISH_PLUGINS = { "enabled": True, "optional": True, "active": True + }, + "ExtractEditorialPckgConversion": { + "enabled": True, + "optional": True, + "active": True } } From c3910256b117487bff677ff81ef7b4c2c67a07a1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 7 May 2024 14:40:45 +0200 Subject: [PATCH 125/469] fix circular import --- client/ayon_core/pipeline/colorspace.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index e9da194984..705d1570b0 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -23,7 +23,6 @@ from ayon_core.pipeline.template_data import get_template_data from ayon_core.pipeline.load import get_representation_path_with_anatomy from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS -from .context_tools import get_current_context, get_current_host_name log = Logger.get_logger(__name__) @@ -765,8 +764,7 @@ def get_imageio_config( """ if not anatomy_data: - from ayon_core.pipeline.context_tools import ( - get_current_context_template_data) + from .context_tools import get_current_context_template_data anatomy_data = get_current_context_template_data() task_name = anatomy_data.get("task", {}).get("name") @@ -1425,6 +1423,8 @@ def get_current_context_imageio_config_preset( dict: ImageIO config preset. """ + from .context_tools import get_current_context, get_current_host_name + context = get_current_context() host_name = get_current_host_name() return get_imageio_config_preset( From 393897f2a9b2f4af3533ba2f6f00716d2de151d2 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 7 May 2024 18:08:55 +0200 Subject: [PATCH 126/469] don't change controller project on close --- client/ayon_core/tools/loader/ui/window.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/window.py b/client/ayon_core/tools/loader/ui/window.py index 3a6f4679fa..8529a53b06 100644 --- a/client/ayon_core/tools/loader/ui/window.py +++ b/client/ayon_core/tools/loader/ui/window.py @@ -335,9 +335,7 @@ class LoaderWindow(QtWidgets.QWidget): def closeEvent(self, event): super(LoaderWindow, self).closeEvent(event) - # Deselect project so current context will be selected - # on next 'showEvent' - self._controller.set_selected_project(None) + self._reset_on_show = True def keyPressEvent(self, event): From 4d502a55481adbfdbd5fe06aeefe2f7ad14d381e Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 8 May 2024 21:42:04 +0800 Subject: [PATCH 127/469] add reset max file and clear undo buffer in the callback of starting new scene --- client/ayon_core/hosts/max/api/lib.py | 3 --- client/ayon_core/hosts/max/api/pipeline.py | 11 +++++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/hosts/max/api/lib.py b/client/ayon_core/hosts/max/api/lib.py index d9a3af3336..0e3abe25ec 100644 --- a/client/ayon_core/hosts/max/api/lib.py +++ b/client/ayon_core/hosts/max/api/lib.py @@ -6,12 +6,9 @@ import json from typing import Any, Dict, Union import six -import ayon_api from ayon_core.pipeline import ( get_current_project_name, - get_current_folder_path, - get_current_task_name, colorspace ) from ayon_core.settings import get_project_settings diff --git a/client/ayon_core/hosts/max/api/pipeline.py b/client/ayon_core/hosts/max/api/pipeline.py index dc13f47795..c6298bf590 100644 --- a/client/ayon_core/hosts/max/api/pipeline.py +++ b/client/ayon_core/hosts/max/api/pipeline.py @@ -52,11 +52,8 @@ class MaxHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): self._has_been_setup = True - def context_setting(): - return lib.set_context_setting() - rt.callbacks.addScript(rt.Name('systemPostNew'), - context_setting) + on_post_open) rt.callbacks.addScript(rt.Name('filePostOpen'), lib.check_colorspace) @@ -163,6 +160,12 @@ def ls() -> list: yield lib.read(container) +def on_post_open(): + lib.set_context_setting() + rt.resetMaxFile(rt.Name("noPrompt")) + rt.clearUndoBuffer() + + def containerise(name: str, nodes: list, context, namespace=None, loader=None, suffix="_CON"): data = { From 7dadac74ac23db64d89512e792e7725d403a84f7 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 8 May 2024 21:50:43 +0800 Subject: [PATCH 128/469] restore unncessary change --- client/ayon_core/hosts/max/api/lib.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/hosts/max/api/lib.py b/client/ayon_core/hosts/max/api/lib.py index 0e3abe25ec..d9a3af3336 100644 --- a/client/ayon_core/hosts/max/api/lib.py +++ b/client/ayon_core/hosts/max/api/lib.py @@ -6,9 +6,12 @@ import json from typing import Any, Dict, Union import six +import ayon_api from ayon_core.pipeline import ( get_current_project_name, + get_current_folder_path, + get_current_task_name, colorspace ) from ayon_core.settings import get_project_settings From d25e8f508eeef612f99cca12976774fd3e401c5f Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 8 May 2024 22:21:07 +0800 Subject: [PATCH 129/469] use on_new as name of the function --- client/ayon_core/hosts/max/api/pipeline.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/max/api/pipeline.py b/client/ayon_core/hosts/max/api/pipeline.py index c6298bf590..776565bade 100644 --- a/client/ayon_core/hosts/max/api/pipeline.py +++ b/client/ayon_core/hosts/max/api/pipeline.py @@ -52,8 +52,7 @@ class MaxHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): self._has_been_setup = True - rt.callbacks.addScript(rt.Name('systemPostNew'), - on_post_open) + rt.callbacks.addScript(rt.Name('systemPostNew'), on_new) rt.callbacks.addScript(rt.Name('filePostOpen'), lib.check_colorspace) @@ -160,7 +159,7 @@ def ls() -> list: yield lib.read(container) -def on_post_open(): +def on_new(): lib.set_context_setting() rt.resetMaxFile(rt.Name("noPrompt")) rt.clearUndoBuffer() From 36cbdcfde77580e86a512b292603a5f810c8f77d Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 8 May 2024 22:56:26 +0800 Subject: [PATCH 130/469] only reset max file and clear undo buffer when there is unsaved change before starting new scene --- client/ayon_core/hosts/max/api/pipeline.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/max/api/pipeline.py b/client/ayon_core/hosts/max/api/pipeline.py index 776565bade..4782159ef8 100644 --- a/client/ayon_core/hosts/max/api/pipeline.py +++ b/client/ayon_core/hosts/max/api/pipeline.py @@ -161,8 +161,9 @@ def ls() -> list: def on_new(): lib.set_context_setting() - rt.resetMaxFile(rt.Name("noPrompt")) - rt.clearUndoBuffer() + if rt.checkForSave(): + rt.resetMaxFile(rt.Name("noPrompt")) + rt.clearUndoBuffer() def containerise(name: str, nodes: list, context, From 46ed96cad8ac8fc34804bf52232fa302e1c39071 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 8 May 2024 23:10:44 +0800 Subject: [PATCH 131/469] add redraw views for new scene --- client/ayon_core/hosts/max/api/pipeline.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/max/api/pipeline.py b/client/ayon_core/hosts/max/api/pipeline.py index 4782159ef8..d9cfc3407f 100644 --- a/client/ayon_core/hosts/max/api/pipeline.py +++ b/client/ayon_core/hosts/max/api/pipeline.py @@ -164,6 +164,7 @@ def on_new(): if rt.checkForSave(): rt.resetMaxFile(rt.Name("noPrompt")) rt.clearUndoBuffer() + rt.redrawViews() def containerise(name: str, nodes: list, context, From 8b9a45e7152bb5c83d3eafaa11c466742ea1df2b Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 9 May 2024 15:20:56 +0800 Subject: [PATCH 132/469] color channel from baking write node should be aligning with that from the write node created from creator --- client/ayon_core/hosts/nuke/api/plugin.py | 3 +++ .../ayon_core/hosts/nuke/plugins/publish/collect_writes.py | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/api/plugin.py b/client/ayon_core/hosts/nuke/api/plugin.py index fb56dec833..02f41ff865 100644 --- a/client/ayon_core/hosts/nuke/api/plugin.py +++ b/client/ayon_core/hosts/nuke/api/plugin.py @@ -778,6 +778,7 @@ class ExporterReviewMov(ExporterReview): # deal with now lut defined in viewer lut self.viewer_lut_raw = klass.viewer_lut_raw self.write_colorspace = instance.data["colorspace"] + self.color_channels = instance.data["color_channels"] self.name = name or "baked" self.ext = ext or "mov" @@ -947,6 +948,8 @@ class ExporterReviewMov(ExporterReview): self.log.debug("Path: {}".format(self.path)) write_node["file"].setValue(str(self.path)) write_node["file_type"].setValue(str(self.ext)) + write_node["channels"].setValue(str(self.color_channels)) + # Knobs `meta_codec` and `mov64_codec` are not available on centos. # TODO shouldn't this come from settings on outputs? try: diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py index 745351dc49..27525bcad1 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py @@ -153,6 +153,9 @@ class CollectNukeWrites(pyblish.api.InstancePlugin, # Determine defined file type ext = write_node["file_type"].value() + # determine defined channel type + color_channels = write_node["channels"].value() + # get frame range data handle_start = instance.context.data["handleStart"] handle_end = instance.context.data["handleEnd"] @@ -172,7 +175,8 @@ class CollectNukeWrites(pyblish.api.InstancePlugin, "path": write_file_path, "outputDir": output_dir, "ext": ext, - "colorspace": colorspace + "colorspace": colorspace, + "color_channels": color_channels }) if product_type == "render": From 475d1db69bc518522b57f270f174799842f6d031 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 9 May 2024 15:05:54 +0300 Subject: [PATCH 133/469] add 'model' product type to 'collect_instnaces_type' --- .../hosts/houdini/plugins/create/create_model.py | 3 --- ...intcache_type.py => collect_instances_type.py} | 15 +++++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) rename client/ayon_core/hosts/houdini/plugins/publish/{collect_pointcache_type.py => collect_instances_type.py} (51%) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_model.py b/client/ayon_core/hosts/houdini/plugins/create/create_model.py index 1f32ccde45..74d067b133 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_model.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_model.py @@ -25,9 +25,6 @@ class CreateModel(plugin.HoudiniCreator): product_type = "model" icon = "cube" - def get_publish_families(self): - return ["model", "abc"] - def create(self, product_name, instance_data, pre_create_data): instance_data.pop("active", None) instance_data.update({"node_type": "alembic"}) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_pointcache_type.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_instances_type.py similarity index 51% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_pointcache_type.py rename to client/ayon_core/hosts/houdini/plugins/publish/collect_instances_type.py index 3323e97c20..07851387fe 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_pointcache_type.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_instances_type.py @@ -1,21 +1,24 @@ -"""Collector for pointcache types. +"""Collector for different types. -This will add additional family to pointcache instance based on +This will add additional families to different instance based on the creator_identifier parameter. """ import pyblish.api class CollectPointcacheType(pyblish.api.InstancePlugin): - """Collect data type for pointcache instance.""" + """Collect data type for different instances.""" order = pyblish.api.CollectorOrder hosts = ["houdini"] - families = ["pointcache"] - label = "Collect type of pointcache" + families = ["pointcache", "model"] + label = "Collect instances types" def process(self, instance): if instance.data["creator_identifier"] == "io.openpype.creators.houdini.bgeo": # noqa: E501 instance.data["families"] += ["bgeo"] - elif instance.data["creator_identifier"] == "io.openpype.creators.houdini.pointcache": # noqa: E501 + elif instance.data["creator_identifier"] in { + "io.openpype.creators.houdini.pointcache", + "io.openpype.creators.houdini.model" + }: instance.data["families"] += ["abc"] From b7662645b5c980c09c599ce4d88ad03a77d0d00f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 9 May 2024 16:15:30 +0200 Subject: [PATCH 134/469] Refactor indentation for better readability Adjusted the indentation in a function to improve code clarity and readability. --- client/ayon_core/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 705d1570b0..3503d0c534 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -873,7 +873,7 @@ def _get_global_config_data( product_entities_by_name = { product_entity["name"]: product_entity for product_entity in ayon_api.get_products( - project_name, + project_name, folder_ids={folder_id}, product_name_regex=product_name, fields={"id", "name"} From 9b2564cfd7049cbaff6670451c9cd6762023bb7f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 9 May 2024 16:22:21 +0200 Subject: [PATCH 135/469] fixing settings type name key --- server/settings/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/main.py b/server/settings/main.py index c9c86bdd0d..97bd376f47 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -58,7 +58,7 @@ def _ocio_config_profile_types(): return [ {"value": "builtin_path", "label": "AYON built-in OCIO config"}, {"value": "custom_path", "label": "Path to OCIO config"}, - {"value": "product", "label": "Published product"}, + {"value": "product_name", "label": "Published product"}, ] From f70bdc5795a698e8316b064a57720ddb8585ccb7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 9 May 2024 16:59:50 +0200 Subject: [PATCH 136/469] fix product name in base value --- server/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/__init__.py b/server/__init__.py index f6f89f2049..31a6e8dfca 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -39,7 +39,7 @@ class CoreAddon(BaseServerAddon): ) base_value = { "type": "builtin_path", - "product": "", + "product_name": "", "host_names": [], "task_names": [], "task_types": [], From bcd1e864c0b2507080521141c61adbc70c5b4fc8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 9 May 2024 17:00:04 +0200 Subject: [PATCH 137/469] use correct builtin path --- server/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/__init__.py b/server/__init__.py index 31a6e8dfca..50eda35c89 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -46,10 +46,13 @@ class CoreAddon(BaseServerAddon): "custom_path": "", "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio" } - if first_filepath not in ( + if first_filepath in ( "{BUILTIN_OCIO_ROOT}/aces_1.2/config.oci", "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", ): + base_value["type"] = "builtin_path" + base_value["builtin_path"] = first_filepath + else: base_value["type"] = "custom_path" base_value["custom_path"] = first_filepath From 925ff8b86f11e595be591b7458b28694608efb91 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 9 May 2024 17:04:09 +0200 Subject: [PATCH 138/469] fix value check --- server/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/__init__.py b/server/__init__.py index 50eda35c89..82473927b6 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -47,7 +47,7 @@ class CoreAddon(BaseServerAddon): "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio" } if first_filepath in ( - "{BUILTIN_OCIO_ROOT}/aces_1.2/config.oci", + "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", ): base_value["type"] = "builtin_path" From 9570d92411dcd8efa97a93da61e34141a829f049 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 9 May 2024 18:10:58 +0200 Subject: [PATCH 139/469] change layout of profiles --- server/settings/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server/settings/main.py b/server/settings/main.py index 97bd376f47..d1cee32afa 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -77,6 +77,7 @@ def _ocio_built_in_paths(): class CoreImageIOConfigProfilesModel(BaseSettingsModel): + _layout = "expanded" host_names: list[str] = SettingsField( default_factory=list, title="Host names" From b7be1952e8533a6f794c7604ad4de939060a7495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Je=C5=BEek?= Date: Thu, 9 May 2024 20:24:54 +0200 Subject: [PATCH 140/469] Update client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py Co-authored-by: Roy Nieterau --- .../traypublisher/plugins/create/create_editorial_package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py index 6a581b59d1..19ca032a0f 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py @@ -24,7 +24,6 @@ class EditorialPackageCreator(TrayPublishCreator): # Position batch creator after simple creators order = 120 - def get_icon(self): return "fa.folder" From 4d737790de9d598f7a5b88e7e20b6ca6e738b444 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 9 May 2024 21:04:54 +0100 Subject: [PATCH 141/469] Working version --- client/ayon_core/hosts/nuke/api/plugin.py | 9 +++++++-- .../nuke/plugins/publish/extract_review_intermediates.py | 9 +++++++-- server_addon/nuke/package.py | 2 +- server_addon/nuke/server/settings/publish_plugins.py | 3 +++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/plugin.py b/client/ayon_core/hosts/nuke/api/plugin.py index fb56dec833..ec256ea303 100644 --- a/client/ayon_core/hosts/nuke/api/plugin.py +++ b/client/ayon_core/hosts/nuke/api/plugin.py @@ -834,7 +834,7 @@ class ExporterReviewMov(ExporterReview): self.log.info("Nodes exported...") return path - def generate_mov(self, farm=False, **kwargs): + def generate_mov(self, farm=False, delete=True, **kwargs): # colorspace data colorspace = None # get colorspace settings @@ -987,8 +987,13 @@ class ExporterReviewMov(ExporterReview): self.render(write_node.name()) # ---------- generate representation data + tags = ["review", "need_thumbnail"] + + if delete: + tags.append("delete") + self.get_representation_data( - tags=["review", "need_thumbnail", "delete"] + add_tags, + tags=tags + add_tags, custom_tags=add_custom_tags, range=True, colorspace=colorspace diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py b/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py index 8d7a3ec311..82c7b6e4c5 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py @@ -136,11 +136,16 @@ class ExtractReviewIntermediates(publish.Extractor): self, instance, o_name, o_data["extension"], multiple_presets) + o_data["add_custom_tags"].append("intermediate") + delete = not o_data.get("publish", False) + if instance.data.get("farm"): if "review" in instance.data["families"]: instance.data["families"].remove("review") - data = exporter.generate_mov(farm=True, **o_data) + data = exporter.generate_mov( + farm=True, delete=delete, **o_data + ) self.log.debug( "_ data: {}".format(data)) @@ -154,7 +159,7 @@ class ExtractReviewIntermediates(publish.Extractor): "bakeWriteNodeName": data.get("bakeWriteNodeName") }) else: - data = exporter.generate_mov(**o_data) + data = exporter.generate_mov(delete=delete, **o_data) # add representation generated by exporter generated_repres.extend(data["representations"]) diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index bf03c4e7e7..e522b9fb5d 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,3 @@ name = "nuke" title = "Nuke" -version = "0.1.11" +version = "0.1.12" diff --git a/server_addon/nuke/server/settings/publish_plugins.py b/server_addon/nuke/server/settings/publish_plugins.py index d5b05d8715..e67f7be24f 100644 --- a/server_addon/nuke/server/settings/publish_plugins.py +++ b/server_addon/nuke/server/settings/publish_plugins.py @@ -125,6 +125,7 @@ class ReformatNodesConfigModel(BaseSettingsModel): class IntermediateOutputModel(BaseSettingsModel): name: str = SettingsField(title="Output name") + publish: bool = SettingsField(title="Publish") filter: BakingStreamFilterModel = SettingsField( title="Filter", default_factory=BakingStreamFilterModel) read_raw: bool = SettingsField( @@ -346,6 +347,7 @@ DEFAULT_PUBLISH_PLUGIN_SETTINGS = { "outputs": [ { "name": "baking", + "publish": False, "filter": { "task_types": [], "product_types": [], @@ -401,6 +403,7 @@ DEFAULT_PUBLISH_PLUGIN_SETTINGS = { "outputs": [ { "name": "baking", + "publish": False, "filter": { "task_types": [], "product_types": [], From 2a675f51a6db20322b3e1d5e8f537723bc33154d Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:38:16 +0200 Subject: [PATCH 142/469] AY-4801-simplified Settings Got rid of profiles, didn't make much sense. Git rid of multiple output definitions, didn't make sense with single otio file. --- .../server/settings/publish_plugins.py | 44 +++---------------- 1 file changed, 7 insertions(+), 37 deletions(-) diff --git a/server_addon/traypublisher/server/settings/publish_plugins.py b/server_addon/traypublisher/server/settings/publish_plugins.py index 9869f54620..2afe20c865 100644 --- a/server_addon/traypublisher/server/settings/publish_plugins.py +++ b/server_addon/traypublisher/server/settings/publish_plugins.py @@ -41,9 +41,7 @@ class ExtractEditorialPckgFFmpegModel(BaseSettingsModel): class ExtractEditorialPckgOutputDefModel(BaseSettingsModel): - """Set extension and ffmpeg arguments. See `ExtractReview` for example.""" _layout = "expanded" - name: str = SettingsField("", title="Name") ext: str = SettingsField("", title="Output extension") ffmpeg_args: ExtractEditorialPckgFFmpegModel = SettingsField( @@ -52,40 +50,13 @@ class ExtractEditorialPckgOutputDefModel(BaseSettingsModel): ) -class ExtractEditorialPckgProfileModel(BaseSettingsModel): - product_types: list[str] = SettingsField( - default_factory=list, - title="Product types" - ) - task_types: list[str] = SettingsField( - default_factory=list, - title="Task types", - enum_resolver=task_types_enum - ) - task_names: list[str] = SettingsField( - default_factory=list, - title="Task names" - ) - product_names: list[str] = SettingsField( - default_factory=list, - title="Product names" - ) - outputs: list[ExtractEditorialPckgOutputDefModel] = SettingsField( - default_factory=list, - title="Output Definitions", - ) - - @validator("outputs") - def validate_unique_outputs(cls, value): - ensure_unique_names(value) - return value - - class ExtractEditorialPckgConversionModel(BaseSettingsModel): - """Conversion of input movie files into expected format.""" - enabled: bool = SettingsField(True) - profiles: list[ExtractEditorialPckgProfileModel] = SettingsField( - default_factory=list, title="Profiles" + """Set output definition if resource files should be converted.""" + conversion_enabled: bool = SettingsField(True, + title="Conversion enabled") + output: ExtractEditorialPckgOutputDefModel = SettingsField( + default_factory=ExtractEditorialPckgOutputDefModel, + title="Output Definitions", ) @@ -128,8 +99,7 @@ DEFAULT_PUBLISH_PLUGINS = { "active": True }, "ExtractEditorialPckgConversion": { - "enabled": True, - "optional": True, + "optional": False, "active": True } } From a1d310fad04e210ac1cf60c86473346c5a3061e4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:39:07 +0200 Subject: [PATCH 143/469] AY-4801-exposed state of conversion from Settings in creator Settings have toggle to on/off conversion, this is exposed for Artist to decide ad-hoc. --- .../create/create_editorial_package.py | 40 +++++++++++++++++-- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py index 6a581b59d1..72a156dfb7 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py @@ -4,7 +4,12 @@ from ayon_core.pipeline import ( CreatedInstance, ) -from ayon_core.lib.attribute_definitions import FileDef +from ayon_core.lib.attribute_definitions import ( + FileDef, + BoolDef, + TextDef, + HiddenDef +) from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator @@ -24,6 +29,16 @@ class EditorialPackageCreator(TrayPublishCreator): # Position batch creator after simple creators order = 120 + conversion_enabled = False + + def apply_settings(self, project_settings): + self.conversion_enabled = ( + project_settings["traypublisher"] + ["publish"] + ["ExtractEditorialPckgConversion"] + ["conversion_enabled"] + ) + print(project_settings) def get_icon(self): return "fa.folder" @@ -34,8 +49,9 @@ class EditorialPackageCreator(TrayPublishCreator): return instance_data["creator_attributes"] = { - "path": (Path(folder_path["directory"]) / - Path(folder_path["filenames"][0])).as_posix() + "folder_path": (Path(folder_path["directory"]) / + Path(folder_path["filenames"][0])).as_posix(), + "conversion_enabled": pre_create_data["conversion_enabled"] } # Create new instance @@ -53,7 +69,23 @@ class EditorialPackageCreator(TrayPublishCreator): extensions=[], allow_sequences=False, label="Folder path" - ) + ), + BoolDef("conversion_enabled", + tooltip="Convert to output defined in Settings.", + default=self.conversion_enabled, + label="Convert resources"), + ] + + def get_instance_attr_defs(self): + return [ + TextDef( + "folder_path", + label="Folder path", + disabled=True + ), + BoolDef("conversion_enabled", + tooltip="Convert to output defined in Settings.", + label="Convert resources"), ] def get_detail_description(self): From b55ed2e7869a508f33621b656cc03e23e8bd66d2 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:39:42 +0200 Subject: [PATCH 144/469] AY-4801-updated variable name Old 'path' clashed in output of instance attributes in Publisher. --- .../traypublisher/plugins/publish/collect_editorial_package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py index 101f58b6d1..cb1277546c 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py @@ -27,7 +27,7 @@ class CollectEditorialPackage(pyblish.api.InstancePlugin): families = ["editorial_pckg"] def process(self, instance): - folder_path = instance.data["creator_attributes"].get("path") + folder_path = instance.data["creator_attributes"]["folder_path"] if not folder_path or not os.path.exists(folder_path): self.log.info(( "Instance doesn't contain collected existing folder path." From 663ace6c8f23ae8faf61408c761aed6457d4c100 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:40:44 +0200 Subject: [PATCH 145/469] AY-4801-conversion controlled by instance attribute --- .../plugins/publish/extract_editorial_pckg.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index 02f953d579..6b6f0bfe1d 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -45,14 +45,15 @@ class ExtractEditorialPckgConversion(publish.Extractor): publish_resource_folder) project_settings = instance.context.data["project_settings"] - profiles = (project_settings["traypublisher"] - ["publish"] - ["ExtractEditorialPckgConversion"] - .get("profiles")) - output_def = None - if profiles: - output_def = self._get_output_definition(instance, profiles) - if output_def: + output_def = (project_settings["traypublisher"] + ["publish"] + ["ExtractEditorialPckgConversion"] + ["output"]) + + conversion_enabled = (instance.data["creator_attributes"] + ["conversion_enabled"]) + + if conversion_enabled and output_def["ext"]: transfers = self._convert_resources(output_def, transfers) if not "transfers" in instance.data: From 0a45c5f8fff5e1bae29cec10033cff3263cfc638 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:41:10 +0200 Subject: [PATCH 146/469] AY-4801-removed profile filtering --- .../plugins/publish/extract_editorial_pckg.py | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index 6b6f0bfe1d..e2eb4cb916 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -6,7 +6,7 @@ import opentimelineio import pyblish.api -from ayon_core.lib import filter_profiles, get_ffmpeg_tool_args, run_subprocess +from ayon_core.lib import get_ffmpeg_tool_args, run_subprocess from ayon_core.pipeline import publish @@ -81,26 +81,6 @@ class ExtractEditorialPckgConversion(publish.Extractor): os.makedirs(publish_resource_folder, exist_ok=True) return publish_resource_folder - def _get_output_definition(self, instance, profiles): - """Return appropriate profile by context information.""" - product_type = instance.data["productType"] - product_name = instance.data["productName"] - task_entity = instance.data["taskEntity"] or {} - task_name = task_entity.get("name") - task_type = task_entity.get("taskType") - filtering_criteria = { - "product_types": product_type, - "product_names": product_name, - "task_names": task_name, - "task_types": task_type, - } - profile = filter_profiles( - profiles, - filtering_criteria, - logger=self.log - ) - return profile - def _get_resource_path_mapping(self, instance, transfers): """Returns dict of {source_mov_path: rootless_published_path}.""" replace_paths = {} From f8503aa5dc7b62e0d5fdd9d982dc55b1204b604a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:41:37 +0200 Subject: [PATCH 147/469] AY-4801-removed multiple output definitions --- .../plugins/publish/extract_editorial_pckg.py | 107 +++++++++--------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index e2eb4cb916..488b8e5a75 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -147,69 +147,66 @@ class ExtractEditorialPckgConversion(publish.Extractor): def _convert_resources(self, output_def, transfers): """Converts all resource files to configured format.""" - outputs = output_def["outputs"] - if not outputs: - self.log.warning("No output configured in " - "ayon+settings://traypublisher/publish/ExtractEditorialPckgConversion/profiles/0/outputs") # noqa + out_extension = output_def["ext"] + if not out_extension: + self.log.warning("No output extension configured in " + "ayon+settings://traypublisher/publish/ExtractEditorialPckgConversion") # noqa return transfers final_transfers = [] - # most likely only single output is expected - for output in outputs: - out_extension = output["ext"] - out_def_ffmpeg_args = output["ffmpeg_args"] - ffmpeg_input_args = [ - value.strip() - for value in out_def_ffmpeg_args["input"] - if value.strip() - ] - ffmpeg_video_filters = [ - value.strip() - for value in out_def_ffmpeg_args["video_filters"] - if value.strip() - ] - ffmpeg_audio_filters = [ - value.strip() - for value in out_def_ffmpeg_args["audio_filters"] - if value.strip() - ] - ffmpeg_output_args = [ - value.strip() - for value in out_def_ffmpeg_args["output"] - if value.strip() - ] - ffmpeg_input_args = self._split_ffmpeg_args(ffmpeg_input_args) + out_def_ffmpeg_args = output_def["ffmpeg_args"] + ffmpeg_input_args = [ + value.strip() + for value in out_def_ffmpeg_args["input"] + if value.strip() + ] + ffmpeg_video_filters = [ + value.strip() + for value in out_def_ffmpeg_args["video_filters"] + if value.strip() + ] + ffmpeg_audio_filters = [ + value.strip() + for value in out_def_ffmpeg_args["audio_filters"] + if value.strip() + ] + ffmpeg_output_args = [ + value.strip() + for value in out_def_ffmpeg_args["output"] + if value.strip() + ] + ffmpeg_input_args = self._split_ffmpeg_args(ffmpeg_input_args) - generic_args = [ - subprocess.list2cmdline(get_ffmpeg_tool_args("ffmpeg")) - ] - generic_args.extend(ffmpeg_input_args) - if ffmpeg_video_filters: - generic_args.append("-filter:v") - generic_args.append( - "\"{}\"".format(",".join(ffmpeg_video_filters))) + generic_args = [ + subprocess.list2cmdline(get_ffmpeg_tool_args("ffmpeg")) + ] + generic_args.extend(ffmpeg_input_args) + if ffmpeg_video_filters: + generic_args.append("-filter:v") + generic_args.append( + "\"{}\"".format(",".join(ffmpeg_video_filters))) - if ffmpeg_audio_filters: - generic_args.append("-filter:a") - generic_args.append( - "\"{}\"".format(",".join(ffmpeg_audio_filters))) + if ffmpeg_audio_filters: + generic_args.append("-filter:a") + generic_args.append( + "\"{}\"".format(",".join(ffmpeg_audio_filters))) - for source, destination in transfers: - base_name = os.path.basename(destination) - file_name, ext = os.path.splitext(base_name) - dest_path = os.path.join(os.path.dirname(destination), - f"{file_name}.{out_extension}") - final_transfers.append((source, dest_path)) + for source, destination in transfers: + base_name = os.path.basename(destination) + file_name, ext = os.path.splitext(base_name) + dest_path = os.path.join(os.path.dirname(destination), + f"{file_name}.{out_extension}") + final_transfers.append((source, dest_path)) - all_args = copy.deepcopy(generic_args) - all_args.append(f"-i {source}") - all_args.extend(ffmpeg_output_args) # order matters - all_args.append(f"{dest_path}") - subprcs_cmd = " ".join(all_args) + all_args = copy.deepcopy(generic_args) + all_args.append(f"-i {source}") + all_args.extend(ffmpeg_output_args) # order matters + all_args.append(f"{dest_path}") + subprcs_cmd = " ".join(all_args) - # run subprocess - self.log.debug("Executing: {}".format(subprcs_cmd)) - run_subprocess(subprcs_cmd, shell=True, logger=self.log) + # run subprocess + self.log.debug("Executing: {}".format(subprcs_cmd)) + run_subprocess(subprcs_cmd, shell=True, logger=self.log) return final_transfers def _split_ffmpeg_args(self, in_args): From 0e4e845407d9f0c425b392d3f454dd5866b819b5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 10 May 2024 14:43:02 +0200 Subject: [PATCH 148/469] bump version to '0.3.2-dev.1' --- client/ayon_core/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 952df2a2c0..275e1b1dd6 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON core addon version.""" -__version__ = "0.3.1" +__version__ = "0.3.2-dev.1" diff --git a/package.py b/package.py index 4398bd9920..b7b8d2dae6 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "0.3.1" +version = "0.3.2-dev.1" client_dir = "ayon_core" From ba0918964f3766465104d278489d49bad7585233 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 14:41:57 +0200 Subject: [PATCH 149/469] AY-4801-updated validation message --- .../plugins/publish/extract_editorial_pckg.py | 8 +++++--- .../plugins/publish/validate_editorial_package.py | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index 488b8e5a75..d25a7146a0 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -111,9 +111,11 @@ class ExtractEditorialPckgConversion(publish.Extractor): if not target_url: continue file_name = os.path.basename(target_url) - replace_value = replace_paths.get(file_name) - if replace_value: - clip.media_reference.target_url = replace_value + replace_path = replace_paths.get(file_name) + if replace_path: + clip.media_reference.target_url = replace_path + if clip.name == file_name: + clip.name = os.path.basename(replace_path) return otio_data diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py index 869dc73811..ce545610ea 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py @@ -47,8 +47,9 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): missing_files.add(target_basename) if missing_files: - raise PublishValidationError("Otio file contains missing files " - f"'{missing_files}'.") + raise PublishValidationError( + "Otio file contains missing files `{missing_files}`.\n\n" + f"Please add them to `{folder_path}` and republish.") instance.data["editorial_pckg"]["otio_data"] = otio_data From 4cfc90bbb3b7bf97315b993028edc201280fabe4 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 10 May 2024 16:29:56 +0300 Subject: [PATCH 150/469] Add OPMenu Stencil --- .../hosts/houdini/startup/OPmenu.xml | 528 ++++++++++++++++++ 1 file changed, 528 insertions(+) create mode 100644 client/ayon_core/hosts/houdini/startup/OPmenu.xml diff --git a/client/ayon_core/hosts/houdini/startup/OPmenu.xml b/client/ayon_core/hosts/houdini/startup/OPmenu.xml new file mode 100644 index 0000000000..bdb559a084 --- /dev/null +++ b/client/ayon_core/hosts/houdini/startup/OPmenu.xml @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 2c12a540c184b7d7323bdf5306d3dbae9031a787 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 10 May 2024 16:36:18 +0300 Subject: [PATCH 151/469] update OPMenu: add 'Create New (AYON)...' script item --- client/ayon_core/hosts/houdini/startup/OPmenu.xml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/client/ayon_core/hosts/houdini/startup/OPmenu.xml b/client/ayon_core/hosts/houdini/startup/OPmenu.xml index bdb559a084..0d58cf53fe 100644 --- a/client/ayon_core/hosts/houdini/startup/OPmenu.xml +++ b/client/ayon_core/hosts/houdini/startup/OPmenu.xml @@ -432,6 +432,21 @@ examples.load_token(kwargs['selectedtoken'], kwargs['node'], shift=kwargs['shift + + + + + + + + From 171ecf2be41c9d6e13e862b7479713d5f3ce221e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 15:53:50 +0200 Subject: [PATCH 152/469] AY-4801-bump up version of OpenTimelineIO --- client/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/pyproject.toml b/client/pyproject.toml index 1a0ad7e5f2..5e811321f8 100644 --- a/client/pyproject.toml +++ b/client/pyproject.toml @@ -16,7 +16,7 @@ aiohttp_json_rpc = "*" # TVPaint server aiohttp-middlewares = "^2.0.0" wsrpc_aiohttp = "^3.1.1" # websocket server Click = "^8" -OpenTimelineIO = "0.14.1" +OpenTimelineIO = "0.16.0" opencolorio = "2.2.1" Pillow = "9.5.0" pynput = "^1.7.2" # Timers manager - TODO remove From c976261786de427ba2cff49afee44d5a6e28c99e Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 16:04:02 +0200 Subject: [PATCH 153/469] AY-4801-added default setting to .mp4 conversion --- .../server/settings/publish_plugins.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server_addon/traypublisher/server/settings/publish_plugins.py b/server_addon/traypublisher/server/settings/publish_plugins.py index 2afe20c865..dc659f6110 100644 --- a/server_addon/traypublisher/server/settings/publish_plugins.py +++ b/server_addon/traypublisher/server/settings/publish_plugins.py @@ -100,6 +100,21 @@ DEFAULT_PUBLISH_PLUGINS = { }, "ExtractEditorialPckgConversion": { "optional": False, - "active": True + "conversion_enabled": True, + "output": { + "ext": "", + "ffmpeg_args": { + "video_filters": [], + "audio_filters": [], + "input": [ + "-apply_trc gamma22" + ], + "output": [ + "-pix_fmt yuv420p", + "-crf 18", + "-intra" + ] + } + } } } From e19986a792972962be07d060249cfe3c56764ca3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Fri, 10 May 2024 16:26:10 +0200 Subject: [PATCH 154/469] AY-4801-bump up version of traypublisher package --- server_addon/traypublisher/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/traypublisher/package.py b/server_addon/traypublisher/package.py index 4ca8ae9fd3..c138a2296d 100644 --- a/server_addon/traypublisher/package.py +++ b/server_addon/traypublisher/package.py @@ -1,3 +1,3 @@ name = "traypublisher" title = "TrayPublisher" -version = "0.1.4" +version = "0.1.5" From 922db60bd031f5a071c5de84b595e9a7a6d5bab2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 10 May 2024 17:18:36 +0200 Subject: [PATCH 155/469] Add quotes to file paths in ExtractEditorialPckgConversion, improve error message handling in ValidateEditorialPackage. --- .../traypublisher/plugins/publish/extract_editorial_pckg.py | 5 ++--- .../plugins/publish/validate_editorial_package.py | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index d25a7146a0..a4d8d2c6fb 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -201,9 +201,9 @@ class ExtractEditorialPckgConversion(publish.Extractor): final_transfers.append((source, dest_path)) all_args = copy.deepcopy(generic_args) - all_args.append(f"-i {source}") + all_args.append(f"-i \"{source}\"") all_args.extend(ffmpeg_output_args) # order matters - all_args.append(f"{dest_path}") + all_args.append(f"\"{dest_path}\"") subprcs_cmd = " ".join(all_args) # run subprocess @@ -232,4 +232,3 @@ class ExtractEditorialPckgConversion(publish.Extractor): if arg and arg not in splitted_args: splitted_args.append(arg) return splitted_args - diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py index ce545610ea..89594ce441 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py @@ -48,7 +48,7 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): if missing_files: raise PublishValidationError( - "Otio file contains missing files `{missing_files}`.\n\n" + f"Otio file contains missing files `{missing_files}`.\n\n" f"Please add them to `{folder_path}` and republish.") instance.data["editorial_pckg"]["otio_data"] = otio_data @@ -67,5 +67,3 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): target_urls.append(target_url) return target_urls - - From 86b2f3b5b52431f6cb11b91e771552c717fa6df8 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 10 May 2024 18:45:15 +0300 Subject: [PATCH 156/469] remove redundant elements --- .../hosts/houdini/startup/OPmenu.xml | 520 +----------------- 1 file changed, 3 insertions(+), 517 deletions(-) diff --git a/client/ayon_core/hosts/houdini/startup/OPmenu.xml b/client/ayon_core/hosts/houdini/startup/OPmenu.xml index 0d58cf53fe..0a7b265fa1 100644 --- a/client/ayon_core/hosts/houdini/startup/OPmenu.xml +++ b/client/ayon_core/hosts/houdini/startup/OPmenu.xml @@ -1,438 +1,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + opmenu.unsynchronize + opmenu.vhda_create @@ -447,97 +24,6 @@ create_interactive("io.openpype.creators.houdini.hda", **kwargs) ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 8dc0043d0308b3e823bd055ae7a54217d95462d6 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Sat, 11 May 2024 00:00:52 +0800 Subject: [PATCH 157/469] add joint into accepted_controllers & make sure the bake animation doesn't get resample when it is exported --- .../hosts/maya/plugins/publish/extract_fbx_animation.py | 1 + .../hosts/maya/plugins/publish/validate_animated_reference.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py index ee66ed2fb7..36dc1b1544 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py +++ b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py @@ -36,6 +36,7 @@ class ExtractFBXAnimation(publish.Extractor): out_members = instance.data.get("animated_skeleton", []) # Export instance.data["constraints"] = True + instance.data["bakeResampleAnimation"] = False instance.data["skeletonDefinitions"] = True instance.data["referencedAssetsContent"] = True fbx_exporter.set_options_from_instance(instance) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py index 2ba2bff6fc..c9dcc662af 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py +++ b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py @@ -16,7 +16,7 @@ class ValidateAnimatedReferenceRig(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["animation.fbx"] label = "Animated Reference Rig" - accepted_controllers = ["transform", "locator"] + accepted_controllers = ["transform", "locator", "joint"] actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] optional = False From 2d4bc1e7ca9546692a242a40e273d1e88fe6fcdf Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Sat, 11 May 2024 00:23:53 +0800 Subject: [PATCH 158/469] add inputchildren as options --- client/ayon_core/hosts/maya/api/fbx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/maya/api/fbx.py b/client/ayon_core/hosts/maya/api/fbx.py index 3f1395cb40..437d64abbf 100644 --- a/client/ayon_core/hosts/maya/api/fbx.py +++ b/client/ayon_core/hosts/maya/api/fbx.py @@ -102,6 +102,7 @@ class FBXExtractor: "constraints": False, "lights": True, "embeddedTextures": False, + "includeChildren": True, "inputConnections": True, "upAxis": "y", "triangulate": False, From 828fe3ad266324fa64d20ec2cd17c7a9a4803a6f Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 10 May 2024 19:14:34 +0200 Subject: [PATCH 159/469] Fix call to `create_context_node` --- .../ayon_core/hosts/houdini/plugins/create/create_workfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py b/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py index a958509e25..40a607e81a 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py +++ b/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py @@ -95,7 +95,7 @@ class CreateWorkfile(plugin.HoudiniCreatorBase, AutoCreator): # write workfile information to context container. op_ctx = hou.node(CONTEXT_CONTAINER) if not op_ctx: - op_ctx = self.create_context_node() + op_ctx = self.host.create_context_node() workfile_data = {"workfile": current_instance.data_to_store()} imprint(op_ctx, workfile_data) From f820050f7eb7ac95d3c4f07174a5a409e47d2d3a Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 13 May 2024 18:39:33 +0800 Subject: [PATCH 160/469] add inputChildren into the dict from options function --- client/ayon_core/hosts/maya/api/fbx.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/hosts/maya/api/fbx.py b/client/ayon_core/hosts/maya/api/fbx.py index 437d64abbf..fd1bf2c901 100644 --- a/client/ayon_core/hosts/maya/api/fbx.py +++ b/client/ayon_core/hosts/maya/api/fbx.py @@ -59,6 +59,7 @@ class FBXExtractor: "constraints": bool, "lights": bool, "embeddedTextures": bool, + "includeChildren": bool, "inputConnections": bool, "upAxis": str, # x, y or z, "triangulate": bool, From 4a70e5bb0084285062527937c3b2d3858d36e506 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 13 May 2024 18:56:56 +0800 Subject: [PATCH 161/469] make sure the constraint is false when exporting --- .../hosts/maya/plugins/publish/extract_fbx_animation.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py index 36dc1b1544..21a8abd46f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py +++ b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py @@ -35,8 +35,7 @@ class ExtractFBXAnimation(publish.Extractor): fbx_exporter = fbx.FBXExtractor(log=self.log) out_members = instance.data.get("animated_skeleton", []) # Export - instance.data["constraints"] = True - instance.data["bakeResampleAnimation"] = False + instance.data["constraints"] = False instance.data["skeletonDefinitions"] = True instance.data["referencedAssetsContent"] = True fbx_exporter.set_options_from_instance(instance) From 8cf1d53e2b66eccc6040ebbc48f4f99c9e4a19d0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 13 May 2024 22:42:37 +0800 Subject: [PATCH 162/469] add TODO --- .../hosts/maya/plugins/publish/extract_fbx_animation.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py index 21a8abd46f..77b5b79b5f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py +++ b/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py @@ -35,7 +35,8 @@ class ExtractFBXAnimation(publish.Extractor): fbx_exporter = fbx.FBXExtractor(log=self.log) out_members = instance.data.get("animated_skeleton", []) # Export - instance.data["constraints"] = False + # TODO: need to set up the options for users to set up + # the flags they intended to export instance.data["skeletonDefinitions"] = True instance.data["referencedAssetsContent"] = True fbx_exporter.set_options_from_instance(instance) From b2b8cb132f78b4bc807e0dcaf0ef71d906f10f73 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 13 May 2024 17:59:23 +0300 Subject: [PATCH 163/469] add CreateModel --- server_addon/houdini/package.py | 2 +- server_addon/houdini/server/settings/create.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 6c81eba439..06b034da38 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,3 @@ name = "houdini" title = "Houdini" -version = "0.2.14" +version = "0.2.15" diff --git a/server_addon/houdini/server/settings/create.py b/server_addon/houdini/server/settings/create.py index 203ca4f9d6..cd1e110c23 100644 --- a/server_addon/houdini/server/settings/create.py +++ b/server_addon/houdini/server/settings/create.py @@ -57,6 +57,9 @@ class CreatePluginsModel(BaseSettingsModel): CreateMantraROP: CreatorModel = SettingsField( default_factory=CreatorModel, title="Create Mantra ROP") + CreateModel: CreatorModel = SettingsField( + default_factory=CreatorModel, + title="Create Model") CreatePointCache: CreatorModel = SettingsField( default_factory=CreatorModel, title="Create PointCache (Abc)") @@ -124,6 +127,10 @@ DEFAULT_HOUDINI_CREATE_SETTINGS = { "enabled": True, "default_variants": ["Main"] }, + "CreateModel": { + "enabled": True, + "default_variants": ["Main"] + }, "CreatePointCache": { "enabled": True, "default_variants": ["Main"] From fb2714005999c262d5e023afd17c76ae9c296dca Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 13 May 2024 23:39:49 +0800 Subject: [PATCH 164/469] remove joint --- .../hosts/maya/plugins/publish/validate_animated_reference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py index c9dcc662af..2ba2bff6fc 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py +++ b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py @@ -16,7 +16,7 @@ class ValidateAnimatedReferenceRig(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["animation.fbx"] label = "Animated Reference Rig" - accepted_controllers = ["transform", "locator", "joint"] + accepted_controllers = ["transform", "locator"] actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] optional = False From aa6b254326f052b05f95fee20e91fad784a54c1a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 14 May 2024 11:14:06 +0200 Subject: [PATCH 165/469] do not try to fix own overrides --- server/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/__init__.py b/server/__init__.py index 82473927b6..79f505ccd5 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -26,10 +26,14 @@ class CoreAddon(BaseServerAddon): def _convert_imagio_configs_0_3_1(self, overrides): """Imageio config settings did change to profiles since 0.3.1. .""" imageio_overrides = overrides.get("imageio") or {} - if "ocio_config" not in imageio_overrides: + if ( + "ocio_config" not in imageio_overrides + or "filepath" not in imageio_overrides["ocio_config"] + ): return ocio_config = imageio_overrides.pop("ocio_config") + filepath = ocio_config["filepath"] if not filepath: return From 37cd670f40a89206023adc0da2e6b11aff0ed273 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 14 May 2024 11:40:47 +0200 Subject: [PATCH 166/469] removed deprecated function 'get_template_data_from_session' --- client/ayon_core/pipeline/context_tools.py | 30 ---------------------- 1 file changed, 30 deletions(-) diff --git a/client/ayon_core/pipeline/context_tools.py b/client/ayon_core/pipeline/context_tools.py index 33567d7280..c32d04c44c 100644 --- a/client/ayon_core/pipeline/context_tools.py +++ b/client/ayon_core/pipeline/context_tools.py @@ -459,36 +459,6 @@ def is_representation_from_latest(representation): ) -def get_template_data_from_session(session=None, settings=None): - """Template data for template fill from session keys. - - Args: - session (Union[Dict[str, str], None]): The Session to use. If not - provided use the currently active global Session. - settings (Optional[Dict[str, Any]]): Prepared studio or project - settings. - - Returns: - Dict[str, Any]: All available data from session. - """ - - if session is not None: - project_name = session["AYON_PROJECT_NAME"] - folder_path = session["AYON_FOLDER_PATH"] - task_name = session["AYON_TASK_NAME"] - host_name = session["AYON_HOST_NAME"] - else: - context = get_current_context() - project_name = context["project_name"] - folder_path = context["folder_path"] - task_name = context["task_name"] - host_name = get_current_host_name() - - return get_template_data_with_names( - project_name, folder_path, task_name, host_name, settings - ) - - def get_current_context_template_data(settings=None): """Prepare template data for current context. From 217cd06f9a7c94b4bc0e12c54e2da5c48e73855d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 14 May 2024 12:31:50 +0200 Subject: [PATCH 167/469] fix ruff comments --- .../traypublisher/plugins/create/create_editorial_package.py | 1 - .../traypublisher/plugins/publish/extract_editorial_pckg.py | 2 -- .../plugins/publish/validate_editorial_package.py | 3 +-- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py index 830cfa5564..82b109be28 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py @@ -8,7 +8,6 @@ from ayon_core.lib.attribute_definitions import ( FileDef, BoolDef, TextDef, - HiddenDef ) from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py index a4d8d2c6fb..6dd4e84704 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py @@ -56,8 +56,6 @@ class ExtractEditorialPckgConversion(publish.Extractor): if conversion_enabled and output_def["ext"]: transfers = self._convert_resources(output_def, transfers) - if not "transfers" in instance.data: - instance.data["transfers"] = [] instance.data["transfers"] = transfers source_to_rootless = self._get_resource_path_mapping(instance, diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py index 89594ce441..c63c4a6a73 100644 --- a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py +++ b/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py @@ -22,8 +22,7 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): def process(self, instance): editorial_pckg_data = instance.data.get("editorial_pckg") if not editorial_pckg_data: - raise PublishValidationError( - f"Editorial package not collected") + raise PublishValidationError("Editorial package not collected") folder_path = editorial_pckg_data["folder_path"] From 4dc893dfd571365337594ac2e764e69c230e352c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 May 2024 12:32:21 +0200 Subject: [PATCH 168/469] Nuke: Refactor metadata imprinting - Simplified code by removing 'author' attribute from metadata imprinting in various plugins. --- client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py | 4 ++-- client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py | 4 ++-- client/ayon_core/hosts/nuke/plugins/load/load_clip.py | 4 +--- client/ayon_core/hosts/nuke/plugins/load/load_effects.py | 2 -- client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py | 2 -- client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py | 2 -- client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py | 2 -- client/ayon_core/hosts/nuke/plugins/load/load_image.py | 3 +-- client/ayon_core/hosts/nuke/plugins/load/load_model.py | 4 ++-- .../ayon_core/hosts/nuke/plugins/load/load_script_precomp.py | 2 -- 10 files changed, 8 insertions(+), 21 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py b/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py index 7d823919dc..50af8a4eb9 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py @@ -62,7 +62,7 @@ class LoadBackdropNodes(load.LoaderPlugin): } # add attributes from the version to imprint to metadata knob - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # getting file path @@ -206,7 +206,7 @@ class LoadBackdropNodes(load.LoaderPlugin): "colorspaceInput": colorspace, } - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # adding nodes to node graph diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py b/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py index 14c54c3adc..3c7d4f3bb2 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py @@ -48,7 +48,7 @@ class AlembicCameraLoader(load.LoaderPlugin): "frameEnd": last, "version": version_entity["version"], } - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # getting file path @@ -123,7 +123,7 @@ class AlembicCameraLoader(load.LoaderPlugin): } # add attributes from the version to imprint to metadata knob - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # getting file path diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py index df8f2ab018..22203a5978 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py @@ -197,7 +197,6 @@ class LoadClip(plugin.NukeLoader): "frameStart", "frameEnd", "source", - "author", "fps", "handleStart", "handleEnd", @@ -347,8 +346,7 @@ class LoadClip(plugin.NukeLoader): "source": version_attributes.get("source"), "handleStart": str(self.handle_start), "handleEnd": str(self.handle_end), - "fps": str(version_attributes.get("fps")), - "author": version_attributes.get("author") + "fps": str(version_attributes.get("fps")) } last_version_entity = ayon_api.get_last_version_by_product_id( diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_effects.py b/client/ayon_core/hosts/nuke/plugins/load/load_effects.py index a87c81295a..be7420fcf0 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_effects.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_effects.py @@ -69,7 +69,6 @@ class LoadEffects(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] @@ -189,7 +188,6 @@ class LoadEffects(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps", ]: data_imprint[k] = version_attributes[k] diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py b/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py index 8fa1347598..9bb430b37b 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py @@ -69,7 +69,6 @@ class LoadEffectsInputProcess(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] @@ -192,7 +191,6 @@ class LoadEffectsInputProcess(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py b/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py index 95f85bacfc..57d00795ae 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py @@ -71,7 +71,6 @@ class LoadGizmo(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] @@ -139,7 +138,6 @@ class LoadGizmo(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py b/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py index 3112e27811..ed2b1ec458 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py @@ -73,7 +73,6 @@ class LoadGizmoInputProcess(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] @@ -145,7 +144,6 @@ class LoadGizmoInputProcess(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_image.py b/client/ayon_core/hosts/nuke/plugins/load/load_image.py index d825b621fc..b5fccd8a0d 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_image.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_image.py @@ -133,7 +133,7 @@ class LoadImage(load.LoaderPlugin): "version": version_entity["version"], "colorspace": colorspace, } - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes.get(k, str(None)) r["tile_color"].setValue(int("0x4ecd25ff", 16)) @@ -207,7 +207,6 @@ class LoadImage(load.LoaderPlugin): "colorspace": version_attributes.get("colorSpace"), "source": version_attributes.get("source"), "fps": str(version_attributes.get("fps")), - "author": version_attributes.get("author") } # change color of node diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_model.py b/client/ayon_core/hosts/nuke/plugins/load/load_model.py index 0326e0a4fc..40862cd1e0 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_model.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_model.py @@ -47,7 +47,7 @@ class AlembicModelLoader(load.LoaderPlugin): "version": version_entity["version"] } # add attributes from the version to imprint to metadata knob - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # getting file path @@ -130,7 +130,7 @@ class AlembicModelLoader(load.LoaderPlugin): } # add additional metadata from the version to imprint to Avalon knob - for k in ["source", "author", "fps"]: + for k in ["source", "fps"]: data_imprint[k] = version_attributes[k] # getting file path diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py b/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py index 3e554f9d3b..d6699be164 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py @@ -55,7 +55,6 @@ class LinkAsGroup(load.LoaderPlugin): "handleStart", "handleEnd", "source", - "author", "fps" ]: data_imprint[k] = version_attributes[k] @@ -131,7 +130,6 @@ class LinkAsGroup(load.LoaderPlugin): "colorspace": version_attributes.get("colorSpace"), "source": version_attributes.get("source"), "fps": version_attributes.get("fps"), - "author": version_attributes.get("author") } # Update the imprinted representation From 7f4385c9a23020b044a7a34a3de4aec6f3491543 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 14 May 2024 12:33:44 +0200 Subject: [PATCH 169/469] remove unused imports --- server_addon/traypublisher/server/settings/publish_plugins.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server_addon/traypublisher/server/settings/publish_plugins.py b/server_addon/traypublisher/server/settings/publish_plugins.py index dc659f6110..99a0bbf107 100644 --- a/server_addon/traypublisher/server/settings/publish_plugins.py +++ b/server_addon/traypublisher/server/settings/publish_plugins.py @@ -1,10 +1,6 @@ -from pydantic import validator - from ayon_server.settings import ( BaseSettingsModel, SettingsField, - task_types_enum, - ensure_unique_names ) From 53b25cb77e65a48ca10149d2eff743e6cf13fd3c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 14 May 2024 13:28:41 +0200 Subject: [PATCH 170/469] fix import --- client/ayon_core/modules/royalrender/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/royalrender/api.py b/client/ayon_core/modules/royalrender/api.py index a69f88c43c..ef715811c5 100644 --- a/client/ayon_core/modules/royalrender/api.py +++ b/client/ayon_core/modules/royalrender/api.py @@ -7,7 +7,7 @@ from ayon_core.lib import Logger, run_subprocess, AYONSettingsRegistry from ayon_core.lib.vendor_bin_utils import find_tool_in_custom_paths from .rr_job import SubmitFile -from .rr_job import RRjob, SubmitterParameter # noqa F401 +from .rr_job import RRJob, SubmitterParameter # noqa F401 class Api: From d93d03abf0e6238f0a17b1ade96e0d43fdf63082 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 May 2024 13:47:54 +0200 Subject: [PATCH 171/469] update resolve documentation --- ...ld6.txt => RESOLVE_API_v19.0B-build20.txt} | 170 +++++++++++++++--- 1 file changed, 150 insertions(+), 20 deletions(-) rename client/ayon_core/hosts/resolve/{RESOLVE_API_v18.5.1-build6.txt => RESOLVE_API_v19.0B-build20.txt} (86%) diff --git a/client/ayon_core/hosts/resolve/RESOLVE_API_v18.5.1-build6.txt b/client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt similarity index 86% rename from client/ayon_core/hosts/resolve/RESOLVE_API_v18.5.1-build6.txt rename to client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt index 7d1d6edf61..a2f3fa6f73 100644 --- a/client/ayon_core/hosts/resolve/RESOLVE_API_v18.5.1-build6.txt +++ b/client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt @@ -1,26 +1,23 @@ -Updated as of 26 May 2023 +Last Updated: 1 April 2024 ---------------------------- In this package, you will find a brief introduction to the Scripting API for DaVinci Resolve Studio. Apart from this README.txt file, this package contains folders containing the basic import modules for scripting access (DaVinciResolve.py) and some representative examples. From v16.2.0 onwards, the nodeIndex parameters accepted by SetLUT() and SetCDL() are 1-based instead of 0-based, i.e. 1 <= nodeIndex <= total number of nodes. - Overview -------- -As with Blackmagic Design Fusion scripts, user scripts written in Lua and Python programming languages are supported. By default, scripts can be invoked from the Console window in the Fusion page, +As with Blackmagic Fusion scripts, user scripts written in Lua and Python programming languages are supported. By default, scripts can be invoked from the Console window in the Fusion page, or via command line. This permission can be changed in Resolve Preferences, to be only from Console, or to be invoked from the local network. Please be aware of the security implications when allowing scripting access from outside of the Resolve application. - Prerequisites ------------- DaVinci Resolve scripting requires one of the following to be installed (for all users): Lua 5.1 - Python 2.7 64-bit Python >= 3.6 64-bit - + Python 2.7 64-bit Using a script -------------- @@ -64,6 +61,7 @@ The interactive Console window allows for an easy way to execute simple scriptin and Lua and evaluates and executes them immediately. For more information on how to use the Console, please refer to the DaVinci Resolve User Manual. This example Python script creates a simple project: + #!/usr/bin/env python import DaVinciResolveScript as dvr_script resolve = dvr_script.scriptapp("Resolve") @@ -80,9 +78,8 @@ Running DaVinci Resolve in headless mode DaVinci Resolve can be launched in a headless mode without the user interface using the -nogui command line option. When DaVinci Resolve is launched using this option, the user interface is disabled. However, the various scripting APIs will continue to work as expected. - -Basic Resolve API ------------------ +DaVinci Resolve API +------------------- Some commonly used API functions are described below (*). As with the resolve object, each object is inspectable for properties and functions. Resolve @@ -101,6 +98,12 @@ Resolve SaveLayoutPreset(presetName) --> Bool # Saves current UI layout as a preset named 'presetName'. ImportLayoutPreset(presetFilePath, presetName) --> Bool # Imports preset from path 'presetFilePath'. The optional argument 'presetName' specifies how the preset shall be named. If not specified, the preset is named based on the filename. Quit() --> None # Quits the Resolve App. + ImportRenderPreset(presetPath) --> Bool # Import a preset from presetPath (string) and set it as current preset for rendering. + ExportRenderPreset(presetName, exportPath) --> Bool # Export a preset to a given path (string) if presetName(string) exists. + ImportBurnInPreset(presetPath) --> Bool # Import a data burn in preset from a given presetPath (string) + ExportBurnInPreset(presetName, exportPath) --> Bool # Export a data burn in preset to a given path (string) if presetName (string) exists. + GetKeyframeMode() --> keyframeMode # Returns the currently set keyframe mode (int). Refer to section 'Keyframe Mode information' below for details. + SetKeyframeMode(keyframeMode) --> Bool # Returns True when 'keyframeMode'(enum) is successfully set. Refer to section 'Keyframe Mode information' below for details. ProjectManager ArchiveProject(projectName, @@ -131,6 +134,14 @@ ProjectManager # 'DbType': 'Disk' or 'PostgreSQL' (string) # 'DbName': database name (string) # 'IpAddress': IP address of the PostgreSQL server (string, optional key - defaults to '127.0.0.1') + CreateCloudProject({cloudSettings}) --> Project # Creates and returns a cloud project. + # '{cloudSettings}': Check 'Cloud Projects Settings' subsection below for more information. + ImportCloudProject(filePath, {cloudSettings}) --> Bool # Returns True if import cloud project is successful; False otherwise + # 'filePath': String; filePath of file to import + # '{cloudSettings}': Check 'Cloud Projects Settings' subsection below for more information. + RestoreCloudProject(folderPath, {cloudSettings}) --> Bool # Returns True if restore cloud project is successful; False otherwise + # 'folderPath': String; path of folder to restore + # '{cloudSettings}': Check 'Cloud Projects Settings' subsection below for more information. Project GetMediaPool() --> MediaPool # Returns the Media Pool object. @@ -175,6 +186,9 @@ Project startOffsetInSamples, durationInSamples) LoadBurnInPreset(presetName) --> Bool # Loads user defined data burn in preset for project when supplied presetName (string). Returns true if successful. ExportCurrentFrameAsStill(filePath) --> Bool # Exports current frame as still to supplied filePath. filePath must end in valid export file format. Returns True if succssful, False otherwise. + GetColorGroupsList() --> [ColorGroups...] # Returns a list of all group objects in the timeline. + AddColorGroup(groupName) --> ColorGroup # Creates a new ColorGroup. groupName must be a unique string. + DeleteColorGroup(colorGroup) --> Bool # Deletes the given color group and sets clips to ungrouped. MediaStorage GetMountedVolumeList() --> [paths...] # Returns list of folder paths corresponding to mounted volumes displayed in Resolve’s Media Storage. @@ -198,7 +212,7 @@ MediaPool CreateTimelineFromClips(name, clip1, clip2,...) --> Timeline # Creates new timeline with specified name, and appends the specified MediaPoolItem objects. CreateTimelineFromClips(name, [clips]) --> Timeline # Creates new timeline with specified name, and appends the specified MediaPoolItem objects. CreateTimelineFromClips(name, [{clipInfo}]) --> Timeline # Creates new timeline with specified name, appending the list of clipInfos specified as a dict of "mediaPoolItem", "startFrame" (int), "endFrame" (int), "recordFrame" (int). - ImportTimelineFromFile(filePath, {importOptions}) --> Timeline # Creates timeline based on parameters within given file (AAF/EDL/XML/FCPXML/DRT/ADL) and optional importOptions dict, with support for the keys: + ImportTimelineFromFile(filePath, {importOptions}) --> Timeline # Creates timeline based on parameters within given file (AAF/EDL/XML/FCPXML/DRT/ADL/OTIO) and optional importOptions dict, with support for the keys: # "timelineName": string, specifies the name of the timeline to be created. Not valid for DRT import # "importSourceClips": Bool, specifies whether source clips should be imported, True by default. Not valid for DRT import # "sourceClipsPath": string, specifies a filesystem path to search for source clips if the media is inaccessible in their original path and if "importSourceClips" is True @@ -225,6 +239,8 @@ MediaPool ExportMetadata(fileName, [clips]) --> Bool # Exports metadata of specified clips to 'fileName' in CSV format. # If no clips are specified, all clips from media pool will be used. GetUniqueId() --> string # Returns a unique ID for the media pool + CreateStereoClip(LeftMediaPoolItem, + RightMediaPoolItem) --> MediaPoolItem # Takes in two existing media pool items and creates a new 3D stereoscopic media pool entry replacing the input media in the media pool. Folder GetClipList() --> [clips...] # Returns a list of clips (items) within the folder. @@ -233,6 +249,8 @@ Folder GetIsFolderStale() --> bool # Returns true if folder is stale in collaboration mode, false otherwise GetUniqueId() --> string # Returns a unique ID for the media pool folder Export(filePath) --> bool # Returns true if export of DRB folder to filePath is successful, false otherwise + TranscribeAudio() --> Bool # Transcribes audio of the MediaPoolItems within the folder and nested folders. Returns True if successful; False otherwise + ClearTranscription() --> Bool # Clears audio transcription of the MediaPoolItems within the folder and nested folders. Returns True if successful; False otherwise. MediaPoolItem GetName() --> string # Returns the clip name. @@ -340,8 +358,12 @@ Timeline GrabStill() --> galleryStill # Grabs still from the current video clip. Returns a GalleryStill object. GrabAllStills(stillFrameSource) --> [galleryStill] # Grabs stills from all the clips of the timeline at 'stillFrameSource' (1 - First frame, 2 - Middle frame). Returns the list of GalleryStill objects. GetUniqueId() --> string # Returns a unique ID for the timeline - CreateSubtitlesFromAudio() --> Bool # Creates subtitles from audio for the timeline. Returns True on success, False otherwise. + CreateSubtitlesFromAudio({autoCaptionSettings}) --> Bool # Creates subtitles from audio for the timeline. + # Takes in optional dictionary {autoCaptionSettings}. Check 'Auto Caption Settings' subsection below for more information. + # Returns True on success, False otherwise. DetectSceneCuts() --> Bool # Detects and makes scene cuts along the timeline. Returns True if successful, False otherwise. + ConvertTimelineToStereo() --> Bool # Converts timeline to stereo. Returns True if successful; False otherwise. + GetNodeGraph() --> Graph # Returns the timeline's node graph object. TimelineItem GetName() --> string # Returns the item name. @@ -390,12 +412,7 @@ TimelineItem GetStereoConvergenceValues() --> {keyframes...} # Returns a dict (offset -> value) of keyframe offsets and respective convergence values. GetStereoLeftFloatingWindowParams() --> {keyframes...} # For the LEFT eye -> returns a dict (offset -> dict) of keyframe offsets and respective floating window params. Value at particular offset includes the left, right, top and bottom floating window values. GetStereoRightFloatingWindowParams() --> {keyframes...} # For the RIGHT eye -> returns a dict (offset -> dict) of keyframe offsets and respective floating window params. Value at particular offset includes the left, right, top and bottom floating window values. - GetNumNodes() --> int # Returns the number of nodes in the current graph for the timeline item ApplyArriCdlLut() --> Bool # Applies ARRI CDL and LUT. Returns True if successful, False otherwise. - SetLUT(nodeIndex, lutPath) --> Bool # Sets LUT on the node mapping the node index provided, 1 <= nodeIndex <= total number of nodes. - # The lutPath can be an absolute path, or a relative path (based off custom LUT paths or the master LUT path). - # The operation is successful for valid lut paths that Resolve has already discovered (see Project.RefreshLUTList). - GetLUT(nodeIndex) --> String # Gets relative LUT path based on the node index provided, 1 <= nodeIndex <= total number of nodes. SetCDL([CDL map]) --> Bool # Keys of map are: "NodeIndex", "Slope", "Offset", "Power", "Saturation", where 1 <= NodeIndex <= total number of nodes. # Example python code - SetCDL({"NodeIndex" : "1", "Slope" : "0.5 0.4 0.2", "Offset" : "0.4 0.3 0.2", "Power" : "0.6 0.7 0.8", "Saturation" : "0.65"}) AddTake(mediaPoolItem, startFrame, endFrame) --> Bool # Adds mediaPoolItem as a new take. Initializes a take selector for the timeline item if needed. By default, the full clip extents is added. startFrame (int) and endFrame (int) are optional arguments used to specify the extents. @@ -411,11 +428,17 @@ TimelineItem UpdateSidecar() --> Bool # Updates sidecar file for BRAW clips or RMD file for R3D clips. GetUniqueId() --> string # Returns a unique ID for the timeline item LoadBurnInPreset(presetName) --> Bool # Loads user defined data burn in preset for clip when supplied presetName (string). Returns true if successful. - GetNodeLabel(nodeIndex) --> string # Returns the label of the node at nodeIndex. CreateMagicMask(mode) --> Bool # Returns True if magic mask was created successfully, False otherwise. mode can "F" (forward), "B" (backward), or "BI" (bidirection) RegenerateMagicMask() --> Bool # Returns True if magic mask was regenerated successfully, False otherwise. Stabilize() --> Bool # Returns True if stabilization was successful, False otherwise SmartReframe() --> Bool # Performs Smart Reframe. Returns True if successful, False otherwise. + GetNodeGraph() --> Graph # Returns the clip's node graph object. + GetColorGroup() --> ColorGroup # Returns the clip's color group if one exists. + AssignToColorGroup(ColorGroup) --> Bool # Returns True if TiItem to successfully assigned to given ColorGroup. ColorGroup must be an existing group in the current project. + RemoveFromColorGroup() --> Bool # Returns True if the TiItem is successfully removed from the ColorGroup it is in. + ExportLUT(exportType, path) --> Bool # Exports LUTs from tiItem referring to value passed in 'exportType' (enum) for LUT size. Refer to. 'ExportLUT notes' section for possible values. + # Saves generated LUT in the provided 'path' (string). 'path' should include the intended file name. + # If an empty or incorrect extension is provided, the appropriate extension (.cube/.vlt) will be appended at the end of the path. Gallery GetAlbumName(galleryStillAlbum) --> string # Returns the name of the GalleryStillAlbum object 'galleryStillAlbum'. @@ -428,17 +451,63 @@ GalleryStillAlbum GetStills() --> [galleryStill] # Returns the list of GalleryStill objects in the album. GetLabel(galleryStill) --> string # Returns the label of the galleryStill. SetLabel(galleryStill, label) --> Bool # Sets the new 'label' to GalleryStill object 'galleryStill'. - ExportStills([galleryStill], folderPath, filePrefix, format) --> Bool # Exports list of GalleryStill objects '[galleryStill]' to directory 'folderPath', with filename prefix 'filePrefix', using file format 'format' (supported formats: dpx, cin, tif, jpg, png, ppm, bmp, xpm). + ImportStills([filePaths]) --> Bool # Imports GalleryStill from each filePath in [filePaths] list. True if at least one still is imported successfully. False otherwise. + ExportStills([galleryStill], folderPath, filePrefix, format) --> Bool # Exports list of GalleryStill objects '[galleryStill]' to directory 'folderPath', with filename prefix 'filePrefix', using file format 'format' (supported formats: dpx, cin, tif, jpg, png, ppm, bmp, xpm, drx). DeleteStills([galleryStill]) --> Bool # Deletes specified list of GalleryStill objects '[galleryStill]'. GalleryStill # This class does not provide any API functions but the object type is used by functions in other classes. +Graph + GetNumNodes() --> int # Returns the number of nodes in the graph + SetLUT(nodeIndex, lutPath) --> Bool # Sets LUT on the node mapping the node index provided, 1 <= nodeIndex <= self.GetNumNodes(). + # The lutPath can be an absolute path, or a relative path (based off custom LUT paths or the master LUT path). + # The operation is successful for valid lut paths that Resolve has already discovered (see Project.RefreshLUTList). + GetLUT(nodeIndex) --> String # Gets relative LUT path based on the node index provided, 1 <= nodeIndex <= total number of nodes. + GetNodeLabel(nodeIndex) --> string # Returns the label of the node at nodeIndex. + GetToolsInNode(nodeIndex) --> [toolsList] # Returns toolsList (list of strings) of the tools used in the node indicated by given nodeIndex (int). + +ColorGroup + GetName() --> String # Returns the name (string) of the ColorGroup. + SetName(groupName) --> Bool # Renames ColorGroup to groupName (string). + GetClipsInTimeline(Timeline=CurrTimeline) --> [TimelineItem] # Returns a list of TimelineItem that are in colorGroup in the given Timeline. Timeline is Current Timeline by default. + GetPreClipNodeGraph() --> Graph # Returns the ColorGroup Pre-clip graph. + GetPostClipNodeGraph() --> Graph # Returns the ColorGroup Post-clip graph. + List and Dict Data Structures ----------------------------- Beside primitive data types, Resolve's Python API mainly uses list and dict data structures. Lists are denoted by [ ... ] and dicts are denoted by { ... } above. As Lua does not support list and dict data structures, the Lua API implements "list" as a table with indices, e.g. { [1] = listValue1, [2] = listValue2, ... }. Similarly the Lua API implements "dict" as a table with the dictionary key as first element, e.g. { [dictKey1] = dictValue1, [dictKey2] = dictValue2, ... }. +Keyframe Mode information +------------------------- +This section covers additional notes for the functions Resolve.GetKeyframeMode() and Resolve.SetKeyframeMode(keyframeMode). + +'keyframeMode' can be one of the following enums: + - resolve.KEYFRAME_MODE_ALL == 0 + - resolve.KEYFRAME_MODE_COLOR == 1 + - resolve.KEYFRAME_MODE_SIZING == 2 + +Integer values returned by Resolve.GetKeyframeMode() will correspond to the enums above. + +Cloud Projects Settings +-------------------------------------- +This section covers additional notes for the functions "ProjectManager:CreateCloudProject," "ProjectManager:ImportCloudProject," and "ProjectManager:RestoreCloudProject" + +All three functions take in a {cloudSettings} dict, that have the following keys: +* resolve.CLOUD_SETTING_PROJECT_NAME: String, ["" by default] +* resolve.CLOUD_SETTING_PROJECT_MEDIA_PATH: String, ["" by default] +* resolve.CLOUD_SETTING_IS_COLLAB: Bool, [False by default] +* resolve.CLOUD_SETTING_SYNC_MODE: syncMode (see below), [resolve.CLOUD_SYNC_PROXY_ONLY by default] +* resolve.CLOUD_SETTING_IS_CAMERA_ACCESS: Bool [False by default] + +Where syncMode is one of the following values: +* resolve.CLOUD_SYNC_NONE, +* resolve.CLOUD_SYNC_PROXY_ONLY, +* resolve.CLOUD_SYNC_PROXY_AND_ORIG + +All three "ProjectManager:CreateCloudProject," "ProjectManager:ImportCloudProject," and "ProjectManager:RestoreCloudProject" require resolve.PROJECT_MEDIA_PATH to be defined. "ProjectManager:CreateCloudProject" also requires resolve.PROJECT_NAME to be defined. + Looking up Project and Clip properties -------------------------------------- This section covers additional notes for the functions "Project:GetSetting", "Project:SetSetting", "Timeline:GetSetting", "Timeline:SetSetting", "MediaPoolItem:GetClipProperty" and @@ -478,6 +547,49 @@ Affects: • x = MediaPoolItem:GetClipProperty('Super Scale') and MediaPoolItem:SetClipProperty('Super Scale', x) • for '2x Enhanced' --> MediaPoolItem:SetClipProperty('Super Scale', 2, sharpnessValue, noiseReductionValue), where sharpnessValue is a float in the range [0.0, 1.0] and noiseReductionValue is a float in the range [0.0, 1.0] +Auto Caption Settings +---------------------- +This section covers the supported settings for the method Timeline.CreateSubtitlesFromAudio({autoCaptionSettings}) + +The parameter setting is a dictionary containing the following keys: +* resolve.SUBTITLE_LANGUAGE: languageID (see below), [resolve.AUTO_CAPTION_AUTO by default] +* resolve.SUBTITLE_CAPTION_PRESET: presetType (see below), [resolve.AUTO_CAPTION_SUBTITLE_DEFAULT by default] +* resolve.SUBTITLE_CHARS_PER_LINE: Number between 1 and 60 inclusive [42 by default] +* resolve.SUBTITLE_LINE_BREAK: lineBreakType (see below), [resolve.AUTO_CAPTION_LINE_SINGLE by default] +* resolve.SUBTITLE_GAP: Number between 0 and 10 inclusive [0 by default] + +Note that the default values for some keys may change based on values defined for other keys, as per the UI. +For example, if the following dictionary is supplied, + CreateSubtitlesFromAudio( { resolve.SUBTITLE_LANGUAGE = resolve.AUTO_CAPTION_KOREAN, + resolve.SUBTITLE_CAPTION_PRESET = resolve.AUTO_CAPTION_NETFLIX } ) +the default value for resolve.SUBTITLE_CHARS_PER_LINE will be 16 instead of 42 + +languageIDs: +* resolve.AUTO_CAPTION_AUTO +* resolve.AUTO_CAPTION_DANISH +* resolve.AUTO_CAPTION_DUTCH +* resolve.AUTO_CAPTION_ENGLISH +* resolve.AUTO_CAPTION_FRENCH +* resolve.AUTO_CAPTION_GERMAN +* resolve.AUTO_CAPTION_ITALIAN +* resolve.AUTO_CAPTION_JAPANESE +* resolve.AUTO_CAPTION_KOREAN +* resolve.AUTO_CAPTION_MANDARIN_SIMPLIFIED +* resolve.AUTO_CAPTION_MANDARIN_TRADITIONAL +* resolve.AUTO_CAPTION_NORWEGIAN +* resolve.AUTO_CAPTION_PORTUGUESE +* resolve.AUTO_CAPTION_RUSSIAN +* resolve.AUTO_CAPTION_SPANISH +* resolve.AUTO_CAPTION_SWEDISH + +presetTypes: +* resolve.AUTO_CAPTION_SUBTITLE_DEFAULT +* resolve.AUTO_CAPTION_TELETEXT +* resolve.AUTO_CAPTION_NETFLIX + +lineBreakTypes: +* resolve.AUTO_CAPTION_LINE_SINGLE +* resolve.AUTO_CAPTION_LINE_DOUBLE Looking up Render Settings -------------------------- @@ -531,6 +643,8 @@ exportType can be one of the following constants: - resolve.EXPORT_DOLBY_VISION_VER_4_0 - resolve.EXPORT_DOLBY_VISION_VER_5_1 - resolve.EXPORT_OTIO + - resolve.EXPORT_ALE + - resolve.EXPORT_ALE_CDL exportSubtype can be one of the following enums: - resolve.EXPORT_NONE - resolve.EXPORT_AAF_NEW @@ -627,7 +741,8 @@ The supported keys with their accepted values are: - MOTION_EST_STANDARD_BETTER - MOTION_EST_ENHANCED_FASTER - MOTION_EST_ENHANCED_BETTER - - MOTION_EST_SPEED_WRAP + - MOTION_EST_SPEED_WARP_BETTER + - MOTION_EST_SPEED_WARP_FASTER "Scaling" : A value from the following constants - SCALE_USE_PROJECT = 0 - SCALE_CROP @@ -659,6 +774,16 @@ as a single argument. Getting the values for the keys that uses constants will return the number which is in the constant +ExportLUT notes +--------------- +The following section covers additional notes for TimelineItem.ExportLUT(exportType, path). + +Supported values for 'exportType' (enum) are: + - resolve.EXPORT_LUT_17PTCUBE + - resolve.EXPORT_LUT_33PTCUBE + - resolve.EXPORT_LUT_65PTCUBE + - resolve.EXPORT_LUT_PANASONICVLUT + Deprecated Resolve API Functions -------------------------------- The following API functions are deprecated. @@ -693,7 +818,12 @@ TimelineItem GetFusionCompNames() --> {names...} # Returns a dict of Fusion composition names associated with the timeline item. GetFlags() --> {colors...} # Returns a dict of flag colors assigned to the item. GetVersionNames(versionType) --> {names...} # Returns a dict of version names by provided versionType: 0 - local, 1 - remote. - + GetNumNodes() --> int # Returns the number of nodes in the current graph for the timeline item + SetLUT(nodeIndex, lutPath) --> Bool # Sets LUT on the node mapping the node index provided, 1 <= nodeIndex <= total number of nodes. + # The lutPath can be an absolute path, or a relative path (based off custom LUT paths or the master LUT path). + # The operation is successful for valid lut paths that Resolve has already discovered (see Project.RefreshLUTList). + GetLUT(nodeIndex) --> String # Gets relative LUT path based on the node index provided, 1 <= nodeIndex <= total number of nodes. + GetNodeLabel(nodeIndex) --> string # Returns the label of the node at nodeIndex. Unsupported Resolve API Functions --------------------------------- From ee4be82e13eb3bfdc913e5c6f67cb392e97de4a9 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 May 2024 13:48:05 +0200 Subject: [PATCH 172/469] package loader wip --- .../plugins/load/load_editorial_package.py | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py new file mode 100644 index 0000000000..fd1e53ea6c --- /dev/null +++ b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py @@ -0,0 +1,29 @@ +from ayon_core.pipeline import ( + load, + get_representation_path, +) + + + +class LoadEditorialPackage(load.LoaderPlugin): + """Load editorial package to timeline. + + Loading timeline from OTIO file included media sources + and timeline structure. + """ + + product_types = {"editorial_pckg"} + + representations = {"*"} + extensions = {"otio"} + + label = "Load as Timeline" + order = -10 + icon = "code-fork" + color = "orange" + + def load(self, context, name, namespace, data): + # load clip to timeline and get main variables + files = get_representation_path(context["representation"]) + + print("Loading editorial package: ", files) From 2a35544a05dacb0ae86868d6d6b07e50ae340402 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 14 May 2024 14:14:26 +0200 Subject: [PATCH 173/469] loading otio as timeline --- .../plugins/load/load_editorial_package.py | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py index fd1e53ea6c..9b723b0130 100644 --- a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py +++ b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py @@ -1,8 +1,11 @@ +from pathlib import Path + from ayon_core.pipeline import ( load, get_representation_path, ) +from ayon_core.hosts.resolve.api import lib class LoadEditorialPackage(load.LoaderPlugin): @@ -19,11 +22,25 @@ class LoadEditorialPackage(load.LoaderPlugin): label = "Load as Timeline" order = -10 - icon = "code-fork" + icon = "ei.align-left" color = "orange" def load(self, context, name, namespace, data): - # load clip to timeline and get main variables files = get_representation_path(context["representation"]) - print("Loading editorial package: ", files) + search_folder_path = Path(files).parent / "resources" + + project = lib.get_current_project() + media_pool = project.GetMediaPool() + import_options = { + "timelineName": "Editorial Package Timeline", + "importSourceClips": True, + "sourceClipsPath": search_folder_path.as_posix(), + } + + timeline = media_pool.ImportTimelineFromFile(files, import_options) + print("Timeline imported: ", timeline) + + def update(self, container, context): + # TODO: implement update method in future + pass From c5b0a1e0cebf5c4c6cbf8768d41ead634ba07a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Tue, 14 May 2024 14:19:00 +0200 Subject: [PATCH 174/469] :bug: fix merge --- client/ayon_core/plugins/publish/integrate.py | 68 ------------------- 1 file changed, 68 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate.py b/client/ayon_core/plugins/publish/integrate.py index 33dc3024d1..865b566e6e 100644 --- a/client/ayon_core/plugins/publish/integrate.py +++ b/client/ayon_core/plugins/publish/integrate.py @@ -108,75 +108,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): label = "Integrate Asset" order = pyblish.api.IntegratorOrder -<<<<<<< enhancement/AY-4138_remove-explicit-products-type-list -- Incoming Change -======= - families = ["workfile", - "pointcache", - "pointcloud", - "proxyAbc", - "camera", - "animation", - "model", - "maxScene", - "mayaAscii", - "mayaScene", - "setdress", - "layout", - "ass", - "assProxy", - "vdbcache", - "scene", - "vrayproxy", - "vrayscene_layer", - "render", - "prerender", - "imagesequence", - "review", - "rendersetup", - "rig", - "plate", - "look", - "ociolook", - "audio", - "yetiRig", - "yeticache", - "nukenodes", - "gizmo", - "source", - "matchmove", - "image", - "assembly", - "fbx", - "gltf", - "textures", - "action", - "harmony.template", - "harmony.palette", - "editorial", - "background", - "camerarig", - "redshiftproxy", - "effect", - "xgen", - "hda", - "usd", - "staticMesh", - "skeletalMesh", - "mvLook", - "mvUsd", - "mvUsdComposition", - "mvUsdOverride", - "online", - "uasset", - "blendScene", - "yeticacheUE", - "tycache", - "csv_ingest_file", - "editorial_pckg", - "render.local.hou", - ] ->>>>>>> develop -- Current Change default_template_name = "publish" # Representation context keys that should always be written to From cef5787f29064012fa84d38c7ccb9f0bada8cda7 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 22:01:53 +0300 Subject: [PATCH 175/469] move houdini client code to its dedicated place and update imports --- .../houdini/client/ayon_houdini}/__init__.py | 0 .../houdini/client/ayon_houdini}/addon.py | 0 .../houdini/client/ayon_houdini}/api/__init__.py | 0 .../houdini/client/ayon_houdini}/api/action.py | 0 .../houdini/client/ayon_houdini}/api/colorspace.py | 2 +- .../client/ayon_houdini}/api/creator_node_shelves.py | 4 ++-- .../houdini/client/ayon_houdini}/api/lib.py | 4 ++-- .../houdini/client/ayon_houdini}/api/pipeline.py | 6 +++--- .../houdini/client/ayon_houdini}/api/plugin.py | 0 .../houdini/client/ayon_houdini}/api/shelves.py | 2 +- .../houdini/client/ayon_houdini}/api/usd.py | 0 .../ayon_houdini}/hooks/set_default_display_and_view.py | 0 .../houdini/client/ayon_houdini}/hooks/set_paths.py | 0 .../client/ayon_houdini}/plugins/create/convert_legacy.py | 2 +- .../ayon_houdini}/plugins/create/create_alembic_camera.py | 2 +- .../ayon_houdini}/plugins/create/create_arnold_ass.py | 2 +- .../ayon_houdini}/plugins/create/create_arnold_rop.py | 2 +- .../client/ayon_houdini}/plugins/create/create_bgeo.py | 2 +- .../ayon_houdini}/plugins/create/create_composite.py | 2 +- .../client/ayon_houdini}/plugins/create/create_hda.py | 2 +- .../ayon_houdini}/plugins/create/create_karma_rop.py | 2 +- .../ayon_houdini}/plugins/create/create_mantra_ifd.py | 2 +- .../ayon_houdini}/plugins/create/create_mantra_rop.py | 2 +- .../ayon_houdini}/plugins/create/create_pointcache.py | 4 ++-- .../ayon_houdini}/plugins/create/create_redshift_proxy.py | 2 +- .../ayon_houdini}/plugins/create/create_redshift_rop.py | 2 +- .../client/ayon_houdini}/plugins/create/create_review.py | 4 ++-- .../ayon_houdini}/plugins/create/create_staticmesh.py | 2 +- .../client/ayon_houdini}/plugins/create/create_usd.py | 2 +- .../ayon_houdini}/plugins/create/create_usdrender.py | 2 +- .../ayon_houdini}/plugins/create/create_vbd_cache.py | 2 +- .../ayon_houdini}/plugins/create/create_vray_rop.py | 2 +- .../ayon_houdini}/plugins/create/create_workfile.py | 6 +++--- .../plugins/inventory/set_camera_resolution.py | 2 +- .../houdini/client/ayon_houdini}/plugins/load/actions.py | 0 .../client/ayon_houdini}/plugins/load/load_alembic.py | 2 +- .../ayon_houdini}/plugins/load/load_alembic_archive.py | 3 ++- .../houdini/client/ayon_houdini}/plugins/load/load_ass.py | 2 +- .../client/ayon_houdini}/plugins/load/load_bgeo.py | 2 +- .../client/ayon_houdini}/plugins/load/load_camera.py | 4 ++-- .../houdini/client/ayon_houdini}/plugins/load/load_fbx.py | 2 +- .../client/ayon_houdini}/plugins/load/load_filepath.py | 2 +- .../houdini/client/ayon_houdini}/plugins/load/load_hda.py | 2 +- .../client/ayon_houdini}/plugins/load/load_image.py | 2 +- .../ayon_houdini}/plugins/load/load_redshift_proxy.py | 2 +- .../client/ayon_houdini}/plugins/load/load_usd_layer.py | 2 +- .../ayon_houdini}/plugins/load/load_usd_reference.py | 2 +- .../client/ayon_houdini}/plugins/load/load_usd_sop.py | 2 +- .../houdini/client/ayon_houdini}/plugins/load/load_vdb.py | 2 +- .../client/ayon_houdini}/plugins/load/show_usdview.py | 0 .../ayon_houdini}/plugins/publish/collect_active_state.py | 0 .../ayon_houdini}/plugins/publish/collect_arnold_rop.py | 4 ++-- .../plugins/publish/collect_asset_handles.py | 0 .../ayon_houdini}/plugins/publish/collect_cache_farm.py | 2 +- .../ayon_houdini}/plugins/publish/collect_chunk_size.py | 0 .../ayon_houdini}/plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_farm_instances.py | 0 .../ayon_houdini}/plugins/publish/collect_frames.py | 2 +- .../ayon_houdini}/plugins/publish/collect_inputs.py | 0 .../plugins/publish/collect_instances_usd_layered.py | 4 ++-- .../ayon_houdini}/plugins/publish/collect_karma_rop.py | 4 ++-- .../plugins/publish/collect_local_render_instances.py | 0 .../ayon_houdini}/plugins/publish/collect_mantra_rop.py | 4 ++-- .../ayon_houdini}/plugins/publish/collect_output_node.py | 0 .../plugins/publish/collect_pointcache_type.py | 0 .../ayon_houdini}/plugins/publish/collect_redshift_rop.py | 4 ++-- .../plugins/publish/collect_remote_publish.py | 2 +- .../plugins/publish/collect_render_products.py | 0 .../ayon_houdini}/plugins/publish/collect_review_data.py | 0 .../plugins/publish/collect_reviewable_instances.py | 0 .../plugins/publish/collect_rop_frame_range.py | 2 +- .../plugins/publish/collect_staticmesh_type.py | 0 .../plugins/publish/collect_usd_bootstrap.py | 0 .../ayon_houdini}/plugins/publish/collect_usd_layers.py | 2 +- .../ayon_houdini}/plugins/publish/collect_vray_rop.py | 4 ++-- .../ayon_houdini}/plugins/publish/collect_workfile.py | 0 .../plugins/publish/collect_workscene_fps.py | 0 .../plugins/publish/extract_active_view_thumbnail.py | 4 ++-- .../ayon_houdini}/plugins/publish/extract_alembic.py | 2 +- .../client/ayon_houdini}/plugins/publish/extract_ass.py | 2 +- .../client/ayon_houdini}/plugins/publish/extract_bgeo.py | 4 ++-- .../ayon_houdini}/plugins/publish/extract_composite.py | 2 +- .../client/ayon_houdini}/plugins/publish/extract_fbx.py | 2 +- .../client/ayon_houdini}/plugins/publish/extract_hda.py | 0 .../ayon_houdini}/plugins/publish/extract_mantra_ifd.py | 0 .../ayon_houdini}/plugins/publish/extract_opengl.py | 2 +- .../plugins/publish/extract_redshift_proxy.py | 2 +- .../ayon_houdini}/plugins/publish/extract_render.py | 2 +- .../client/ayon_houdini}/plugins/publish/extract_usd.py | 3 ++- .../ayon_houdini}/plugins/publish/extract_usd_layered.py | 4 ++-- .../ayon_houdini}/plugins/publish/extract_vdb_cache.py | 2 +- .../plugins/publish/help/validate_vdb_output_node.xml | 2 +- .../plugins/publish/increment_current_file.py | 0 .../client/ayon_houdini}/plugins/publish/save_scene.py | 0 .../plugins/publish/validate_abc_primitive_to_detail.py | 0 .../plugins/publish/validate_alembic_face_sets.py | 0 .../plugins/publish/validate_alembic_input_node.py | 0 .../plugins/publish/validate_animation_settings.py | 2 +- .../ayon_houdini}/plugins/publish/validate_bypass.py | 0 .../ayon_houdini}/plugins/publish/validate_camera_rop.py | 0 .../plugins/publish/validate_cop_output_node.py | 0 .../plugins/publish/validate_fbx_output_node.py | 4 ++-- .../plugins/publish/validate_file_extension.py | 2 +- .../ayon_houdini}/plugins/publish/validate_frame_range.py | 2 +- .../ayon_houdini}/plugins/publish/validate_frame_token.py | 2 +- .../plugins/publish/validate_houdini_license_category.py | 0 .../plugins/publish/validate_instance_in_context.py | 2 +- .../plugins/publish/validate_mesh_is_static.py | 4 ++-- .../plugins/publish/validate_mkpaths_toggled.py | 0 .../ayon_houdini}/plugins/publish/validate_no_errors.py | 0 .../plugins/publish/validate_primitive_hierarchy_paths.py | 0 .../plugins/publish/validate_remote_publish.py | 2 +- .../plugins/publish/validate_remote_publish_enabled.py | 0 .../plugins/publish/validate_review_colorspace.py | 6 +++--- .../plugins/publish/validate_scene_review.py | 0 .../plugins/publish/validate_sop_output_node.py | 2 +- .../ayon_houdini}/plugins/publish/validate_subset_name.py | 2 +- .../plugins/publish/validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_usd_layer_path_backslashes.py | 2 +- .../plugins/publish/validate_usd_model_and_shade.py | 2 +- .../plugins/publish/validate_usd_output_node.py | 0 .../plugins/publish/validate_usd_render_product_names.py | 0 .../plugins/publish/validate_usd_setdress.py | 2 +- .../plugins/publish/validate_usd_shade_model_exists.py | 0 .../plugins/publish/validate_usd_shade_workspace.py | 0 .../plugins/publish/validate_vdb_output_node.py | 2 +- .../plugins/publish/validate_workfile_paths.py | 0 .../client/ayon_houdini}/startup/MainMenuCommon.xml | 8 ++++---- .../ayon_houdini}/startup/python2.7libs/pythonrc.py | 2 +- .../ayon_houdini}/startup/python3.10libs/pythonrc.py | 2 +- .../ayon_houdini}/startup/python3.7libs/pythonrc.py | 2 +- .../ayon_houdini}/startup/python3.9libs/pythonrc.py | 2 +- server_addon/houdini/package.py | 2 +- 133 files changed, 114 insertions(+), 112 deletions(-) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/__init__.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/addon.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/__init__.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/action.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/colorspace.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/creator_node_shelves.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/lib.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/pipeline.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/plugin.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/shelves.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/api/usd.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/hooks/set_default_display_and_view.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/hooks/set_paths.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/convert_legacy.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_alembic_camera.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_arnold_ass.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_arnold_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_bgeo.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_composite.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_hda.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_karma_rop.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_mantra_ifd.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_mantra_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_pointcache.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_redshift_proxy.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_redshift_rop.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_review.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_staticmesh.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_usd.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_usdrender.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_vbd_cache.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_vray_rop.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/create/create_workfile.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/inventory/set_camera_resolution.py (93%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/actions.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_alembic.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_alembic_archive.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_ass.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_bgeo.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_camera.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_fbx.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_filepath.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_hda.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_image.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_redshift_proxy.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_usd_layer.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_usd_reference.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_usd_sop.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/load_vdb.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/load/show_usdview.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_active_state.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_arnold_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_asset_handles.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_cache_farm.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_chunk_size.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_farm_instances.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_frames.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_inputs.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_instances_usd_layered.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_karma_rop.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_local_render_instances.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_mantra_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_output_node.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_pointcache_type.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_redshift_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_remote_publish.py (94%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_render_products.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_review_data.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_reviewable_instances.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_rop_frame_range.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_staticmesh_type.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_usd_bootstrap.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_usd_layers.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_vray_rop.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/collect_workscene_fps.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_active_view_thumbnail.py (94%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_alembic.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_ass.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_bgeo.py (93%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_composite.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_fbx.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_hda.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_mantra_ifd.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_opengl.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_redshift_proxy.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_render.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_usd.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_usd_layered.py (99%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/extract_vdb_cache.py (96%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/help/validate_vdb_output_node.xml (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/increment_current_file.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/save_scene.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_abc_primitive_to_detail.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_alembic_face_sets.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_alembic_input_node.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_animation_settings.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_bypass.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_camera_rop.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_cop_output_node.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_fbx_output_node.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_file_extension.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_frame_range.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_frame_token.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_houdini_license_category.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_instance_in_context.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_mesh_is_static.py (92%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_mkpaths_toggled.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_no_errors.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_primitive_hierarchy_paths.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_remote_publish.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_remote_publish_enabled.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_review_colorspace.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_scene_review.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_sop_output_node.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_subset_name.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_unreal_staticmesh_naming.py (95%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_layer_path_backslashes.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_model_and_shade.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_output_node.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_render_product_names.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_setdress.py (97%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_shade_model_exists.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_usd_shade_workspace.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_vdb_output_node.py (98%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/plugins/publish/validate_workfile_paths.py (100%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/startup/MainMenuCommon.xml (94%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/startup/python2.7libs/pythonrc.py (78%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/startup/python3.10libs/pythonrc.py (78%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/startup/python3.7libs/pythonrc.py (78%) rename {client/ayon_core/hosts/houdini => server_addon/houdini/client/ayon_houdini}/startup/python3.9libs/pythonrc.py (78%) diff --git a/client/ayon_core/hosts/houdini/__init__.py b/server_addon/houdini/client/ayon_houdini/__init__.py similarity index 100% rename from client/ayon_core/hosts/houdini/__init__.py rename to server_addon/houdini/client/ayon_houdini/__init__.py diff --git a/client/ayon_core/hosts/houdini/addon.py b/server_addon/houdini/client/ayon_houdini/addon.py similarity index 100% rename from client/ayon_core/hosts/houdini/addon.py rename to server_addon/houdini/client/ayon_houdini/addon.py diff --git a/client/ayon_core/hosts/houdini/api/__init__.py b/server_addon/houdini/client/ayon_houdini/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/houdini/api/__init__.py rename to server_addon/houdini/client/ayon_houdini/api/__init__.py diff --git a/client/ayon_core/hosts/houdini/api/action.py b/server_addon/houdini/client/ayon_houdini/api/action.py similarity index 100% rename from client/ayon_core/hosts/houdini/api/action.py rename to server_addon/houdini/client/ayon_houdini/api/action.py diff --git a/client/ayon_core/hosts/houdini/api/colorspace.py b/server_addon/houdini/client/ayon_houdini/api/colorspace.py similarity index 95% rename from client/ayon_core/hosts/houdini/api/colorspace.py rename to server_addon/houdini/client/ayon_houdini/api/colorspace.py index 66581d6f20..ec6e4c2091 100644 --- a/client/ayon_core/hosts/houdini/api/colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/api/colorspace.py @@ -1,6 +1,6 @@ import attr import hou -from ayon_core.hosts.houdini.api.lib import get_color_management_preferences +from ayon_houdini.api.lib import get_color_management_preferences from ayon_core.pipeline.colorspace import get_display_view_colorspace_name @attr.s diff --git a/client/ayon_core/hosts/houdini/api/creator_node_shelves.py b/server_addon/houdini/client/ayon_houdini/api/creator_node_shelves.py similarity index 98% rename from client/ayon_core/hosts/houdini/api/creator_node_shelves.py rename to server_addon/houdini/client/ayon_houdini/api/creator_node_shelves.py index 72c157f187..4d5a706749 100644 --- a/client/ayon_core/hosts/houdini/api/creator_node_shelves.py +++ b/server_addon/houdini/client/ayon_houdini/api/creator_node_shelves.py @@ -35,7 +35,7 @@ CATEGORY_GENERIC_TOOL = { CREATE_SCRIPT = """ -from ayon_core.hosts.houdini.api.creator_node_shelves import create_interactive +from ayon_houdini.api.creator_node_shelves import create_interactive create_interactive("{identifier}", **kwargs) """ @@ -153,7 +153,7 @@ def install(): This function is re-entrant and can be called again to reinstall and update the node definitions. For example during development it can be useful to call it manually: - >>> from ayon_core.hosts.houdini.api.creator_node_shelves import install + >>> from ayon_houdini.api.creator_node_shelves import install >>> install() Returns: diff --git a/client/ayon_core/hosts/houdini/api/lib.py b/server_addon/houdini/client/ayon_houdini/api/lib.py similarity index 99% rename from client/ayon_core/hosts/houdini/api/lib.py rename to server_addon/houdini/client/ayon_houdini/api/lib.py index 7ca8f7f8f0..671265fae9 100644 --- a/client/ayon_core/hosts/houdini/api/lib.py +++ b/server_addon/houdini/client/ayon_houdini/api/lib.py @@ -1027,7 +1027,7 @@ def add_self_publish_button(node): button_parm = hou.ButtonParmTemplate( "ayon_self_publish", "{} Publish".format(label), - script_callback="from ayon_core.hosts.houdini.api.lib import " + script_callback="from ayon_houdini.api.lib import " "self_publish; self_publish()", script_callback_language=hou.scriptLanguage.Python, join_with_next=True @@ -1070,7 +1070,7 @@ def sceneview_snapshot( Example: This is how the function can be used:: - from ayon_core.hosts.houdini.api import lib + from ayon_houdini.api import lib sceneview = hou.ui.paneTabOfType(hou.paneTabType.SceneViewer) lib.sceneview_snapshot(sceneview) diff --git a/client/ayon_core/hosts/houdini/api/pipeline.py b/server_addon/houdini/client/ayon_houdini/api/pipeline.py similarity index 98% rename from client/ayon_core/hosts/houdini/api/pipeline.py rename to server_addon/houdini/client/ayon_houdini/api/pipeline.py index 4797cf36a0..6af4993d25 100644 --- a/client/ayon_core/hosts/houdini/api/pipeline.py +++ b/server_addon/houdini/client/ayon_houdini/api/pipeline.py @@ -17,8 +17,8 @@ from ayon_core.pipeline import ( AYON_CONTAINER_ID, ) from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.houdini import HOUDINI_HOST_DIR -from ayon_core.hosts.houdini.api import lib, shelves, creator_node_shelves +from ayon_houdini import HOUDINI_HOST_DIR +from ayon_houdini.api import lib, shelves, creator_node_shelves from ayon_core.lib import ( register_event_callback, @@ -26,7 +26,7 @@ from ayon_core.lib import ( ) -log = logging.getLogger("ayon_core.hosts.houdini") +log = logging.getLogger("ayon_houdini") AVALON_CONTAINERS = "/obj/AVALON_CONTAINERS" CONTEXT_CONTAINER = "/obj/OpenPypeContext" diff --git a/client/ayon_core/hosts/houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/houdini/api/plugin.py rename to server_addon/houdini/client/ayon_houdini/api/plugin.py diff --git a/client/ayon_core/hosts/houdini/api/shelves.py b/server_addon/houdini/client/ayon_houdini/api/shelves.py similarity index 99% rename from client/ayon_core/hosts/houdini/api/shelves.py rename to server_addon/houdini/client/ayon_houdini/api/shelves.py index b178139020..2987568af1 100644 --- a/client/ayon_core/hosts/houdini/api/shelves.py +++ b/server_addon/houdini/client/ayon_houdini/api/shelves.py @@ -12,7 +12,7 @@ import hou from .lib import get_current_context_template_data_with_folder_attrs -log = logging.getLogger("ayon_core.hosts.houdini.shelves") +log = logging.getLogger("ayon_houdini.shelves") def generate_shelves(): diff --git a/client/ayon_core/hosts/houdini/api/usd.py b/server_addon/houdini/client/ayon_houdini/api/usd.py similarity index 100% rename from client/ayon_core/hosts/houdini/api/usd.py rename to server_addon/houdini/client/ayon_houdini/api/usd.py diff --git a/client/ayon_core/hosts/houdini/hooks/set_default_display_and_view.py b/server_addon/houdini/client/ayon_houdini/hooks/set_default_display_and_view.py similarity index 100% rename from client/ayon_core/hosts/houdini/hooks/set_default_display_and_view.py rename to server_addon/houdini/client/ayon_houdini/hooks/set_default_display_and_view.py diff --git a/client/ayon_core/hosts/houdini/hooks/set_paths.py b/server_addon/houdini/client/ayon_houdini/hooks/set_paths.py similarity index 100% rename from client/ayon_core/hosts/houdini/hooks/set_paths.py rename to server_addon/houdini/client/ayon_houdini/hooks/set_paths.py diff --git a/client/ayon_core/hosts/houdini/plugins/create/convert_legacy.py b/server_addon/houdini/client/ayon_houdini/plugins/create/convert_legacy.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/convert_legacy.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/convert_legacy.py index 1a4761172a..4c8c8062ce 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/convert_legacy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/convert_legacy.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Converter for legacy Houdini products.""" from ayon_core.pipeline.create.creator_plugins import ProductConvertorPlugin -from ayon_core.hosts.houdini.api.lib import imprint +from ayon_houdini.api.lib import imprint class HoudiniLegacyConvertor(ProductConvertorPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_alembic_camera.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_alembic_camera.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_alembic_camera.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_alembic_camera.py index 0ab5e2794e..4a92e24671 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_alembic_camera.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_alembic_camera.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating alembic camera products.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.pipeline import CreatorError import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_ass.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_arnold_ass.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_ass.py index be5604c01c..4f5fb5833e 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_ass.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating Arnold ASS files.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_rop.py index 1208cfc1ea..43875ccbd6 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_arnold_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_arnold_rop.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import EnumDef, BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_bgeo.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_bgeo.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_bgeo.py index 3749598b1d..93cf0e0998 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_bgeo.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache bgeo files.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.pipeline import CreatorError import hou from ayon_core.lib import EnumDef, BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_composite.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_composite.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_composite.py index a25faf0e8e..8c0ee8a099 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_composite.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating composite sequences.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.pipeline import CreatorError import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_hda.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_hda.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_hda.py index d399aa5e15..6a1adce8cc 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_hda.py @@ -3,7 +3,7 @@ import ayon_api from ayon_core.pipeline import CreatorError -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_karma_rop.py similarity index 99% rename from client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_karma_rop.py index 48cf5057ab..693e6295e2 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_karma_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_karma_rop.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin to create Karma ROP.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef, EnumDef, NumberDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_ifd.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_mantra_ifd.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_ifd.py index e0cf035c35..fc5c4819d0 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_ifd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_ifd.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache alembics.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_rop.py index 05b4431aba..ce1c96f8b2 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_mantra_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_mantra_rop.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin to create Mantra ROP.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import EnumDef, BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_pointcache.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_pointcache.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_pointcache.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_pointcache.py index 9e0a335c3a..6a63659053 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_pointcache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_pointcache.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache alembics.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef import hou @@ -105,7 +105,7 @@ class CreatePointCache(plugin.HoudiniCreator): elif len(outputs) == 1: return outputs[0] - # if there are more than one, then it have multiple ouput nodes + # if there are more than one, then it have multiple output nodes # return the one with the minimum 'outputidx' else: return min(outputs, diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_proxy.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_redshift_proxy.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_proxy.py index 6a9321b95a..0e3eb03ddd 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_proxy.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating Redshift proxies.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin import hou from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_rop.py similarity index 99% rename from client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_rop.py index 3ecb09ee9b..d63e584692 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_redshift_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_redshift_rop.py @@ -3,7 +3,7 @@ import hou # noqa from ayon_core.pipeline import CreatorError -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import EnumDef, BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_review.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_review.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/create/create_review.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_review.py index f5e4d4ce64..b27264f400 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_review.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_review.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating openGL reviews.""" -from ayon_core.hosts.houdini.api import lib, plugin +from ayon_houdini.api import lib, plugin from ayon_core.lib import EnumDef, BoolDef, NumberDef import os @@ -103,7 +103,7 @@ class CreateReview(plugin.HoudiniCreator): # cls.review_color_space is an empty string # when the imageio/workfile setting is disabled or # when the Review colorspace setting is empty. - from ayon_core.hosts.houdini.api.colorspace import get_default_display_view_colorspace # noqa + from ayon_houdini.api.colorspace import get_default_display_view_colorspace # noqa self.review_color_space = get_default_display_view_colorspace() lib.set_review_color_space(instance_node, diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_staticmesh.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_staticmesh.py similarity index 99% rename from client/ayon_core/hosts/houdini/plugins/create/create_staticmesh.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_staticmesh.py index 3271107c6e..17b646040c 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_staticmesh.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_staticmesh.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator for Unreal Static Meshes.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef, EnumDef import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usd.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/create/create_usd.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_usd.py index 700f7eefd6..b8aede677b 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usd.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating USDs.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_usdrender.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/create/create_usdrender.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py index 36197e349e..a34de1fec4 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_usdrender.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_usdrender.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating USD renders.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin class CreateUSDRender(plugin.HoudiniCreator): diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vbd_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_vbd_cache.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/create/create_vbd_cache.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_vbd_cache.py index c34cd2b4b5..e8c0920ec8 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vbd_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_vbd_cache.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating VDB Caches.""" -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.lib import BoolDef import hou diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_vray_rop.py similarity index 99% rename from client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_vray_rop.py index 9e4633e745..d15ee23825 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_vray_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_vray_rop.py @@ -2,7 +2,7 @@ """Creator plugin to create VRay ROP.""" import hou -from ayon_core.hosts.houdini.api import plugin +from ayon_houdini.api import plugin from ayon_core.pipeline import CreatorError from ayon_core.lib import EnumDef, BoolDef diff --git a/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py b/server_addon/houdini/client/ayon_houdini/plugins/create/create_workfile.py similarity index 95% rename from client/ayon_core/hosts/houdini/plugins/create/create_workfile.py rename to server_addon/houdini/client/ayon_houdini/plugins/create/create_workfile.py index 40a607e81a..babf602855 100644 --- a/client/ayon_core/hosts/houdini/plugins/create/create_workfile.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/create/create_workfile.py @@ -2,9 +2,9 @@ """Creator plugin for creating workfiles.""" import ayon_api -from ayon_core.hosts.houdini.api import plugin -from ayon_core.hosts.houdini.api.lib import read, imprint -from ayon_core.hosts.houdini.api.pipeline import CONTEXT_CONTAINER +from ayon_houdini.api import plugin +from ayon_houdini.api.lib import read, imprint +from ayon_houdini.api.pipeline import CONTEXT_CONTAINER from ayon_core.pipeline import CreatedInstance, AutoCreator import hou diff --git a/client/ayon_core/hosts/houdini/plugins/inventory/set_camera_resolution.py b/server_addon/houdini/client/ayon_houdini/plugins/inventory/set_camera_resolution.py similarity index 93% rename from client/ayon_core/hosts/houdini/plugins/inventory/set_camera_resolution.py rename to server_addon/houdini/client/ayon_houdini/plugins/inventory/set_camera_resolution.py index 4cebd537bb..e2f8fcfa9b 100644 --- a/client/ayon_core/hosts/houdini/plugins/inventory/set_camera_resolution.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/inventory/set_camera_resolution.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import InventoryAction -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( get_camera_from_container, set_camera_resolution ) diff --git a/client/ayon_core/hosts/houdini/plugins/load/actions.py b/server_addon/houdini/client/ayon_houdini/plugins/load/actions.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/load/actions.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/actions.py diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_alembic.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py index 5f04781501..7a610ce8b3 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class AbcLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_alembic_archive.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/load/load_alembic_archive.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py index a231bd9993..672734879d 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_alembic_archive.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py @@ -1,9 +1,10 @@ + import os from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class AbcArchiveLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_ass.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py index 6e0922e305..a7e558feb4 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class AssLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_bgeo.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py index a318b71963..b9f3b2b085 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py @@ -6,7 +6,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class BgeoLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_camera.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_camera.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py index b7912f88f1..0f8c4936a3 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_camera.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py @@ -2,9 +2,9 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( set_camera_resolution, get_camera_from_container ) diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_fbx.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py index 398019a3bd..33b0688435 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py @@ -4,7 +4,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class FbxLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_filepath.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_filepath.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py index d189a027fd..5c99f8bdb1 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_filepath.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py @@ -2,7 +2,7 @@ import os import re from ayon_core.pipeline import load -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline import hou diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/load/load_hda.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py index 10fc03be03..c0255614a5 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py @@ -4,7 +4,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class HdaLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_image.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_image.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py index dfbd3c11eb..6163e6d77a 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_image.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py @@ -6,7 +6,7 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.houdini.api import lib, pipeline +from ayon_houdini.api import lib, pipeline import hou diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_redshift_proxy.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py index f09856a970..f11ac065a1 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py @@ -4,7 +4,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline from ayon_core.pipeline.load import LoadError import hou diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_usd_layer.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_usd_layer.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py index 4e6954c531..af6f470674 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_usd_layer.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class USDSublayerLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_usd_reference.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_usd_reference.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py index 7e82a6abd0..41d84922f7 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_usd_reference.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class USDReferenceLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_usd_sop.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/load/load_usd_sop.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py index 506f6140bf..99e2c4375f 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_usd_sop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py @@ -1,7 +1,7 @@ import os from ayon_core.pipeline import load -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class SopUsdImportLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/load_vdb.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/load/load_vdb.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py index 0008f0d5f8..13fab288fa 100644 --- a/client/ayon_core/hosts/houdini/plugins/load/load_vdb.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.houdini.api import pipeline +from ayon_houdini.api import pipeline class VdbLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/load/show_usdview.py b/server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/load/show_usdview.py rename to server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_active_state.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_active_state.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py index 53a3e52717..7b693c2d6f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_arnold_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py @@ -4,8 +4,8 @@ import re import hou import pyblish.api -from ayon_core.hosts.houdini.api import colorspace -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api import colorspace +from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_asset_handles.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_asset_handles.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py index e931c7bf1b..ea3c237b13 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_cache_farm.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py @@ -1,7 +1,7 @@ import os import pyblish.api import hou -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class CollectDataforCache(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_chunk_size.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_current_file.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_farm_instances.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_frames.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_frames.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py index b38ebc6e2f..7805d8ec35 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_frames.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py @@ -5,7 +5,7 @@ import re import hou # noqa import pyblish.api -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class CollectFrames(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_inputs.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_inputs.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_instances_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_instances_usd_layered.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py index 9377a9fcd0..ddf4b60c66 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_instances_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py @@ -1,7 +1,7 @@ import hou import pyblish.api -from ayon_core.hosts.houdini.api import lib -import ayon_core.hosts.houdini.api.usd as hou_usdlib +from ayon_houdini.api import lib +import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import usdlib diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py index 662ed7ae30..62ceed9999 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_karma_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py @@ -4,11 +4,11 @@ import os import hou import pyblish.api -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences ) -from ayon_core.hosts.houdini.api import ( +from ayon_houdini.api import ( colorspace ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py index 7b247768fc..09d4c82226 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_mantra_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py @@ -4,11 +4,11 @@ import os import hou import pyblish.api -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences ) -from ayon_core.hosts.houdini.api import ( +from ayon_houdini.api import ( colorspace ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_pointcache_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_pointcache_type.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py index ce90ae2413..7982b53a7e 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_redshift_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py @@ -4,11 +4,11 @@ import os import hou import pyblish.api -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences ) -from ayon_core.hosts.houdini.api import ( +from ayon_houdini.api import ( colorspace ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py similarity index 94% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_remote_publish.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py index 5d459f525e..845a7c4a1f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py @@ -2,7 +2,7 @@ import pyblish.api import hou from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class CollectRemotePublishSettings(pyblish.api.ContextPlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_render_products.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_render_products.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_review_data.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_reviewable_instances.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_rop_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py similarity index 95% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_rop_frame_range.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py index 44afaf2466..b0d69a14e7 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_rop_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py @@ -2,7 +2,7 @@ """Collector plugin for frames data on ROP instances.""" import hou # noqa import pyblish.api -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib class CollectRopFrameRange(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_staticmesh_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_staticmesh_type.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_usd_bootstrap.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_usd_bootstrap.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_usd_layers.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_usd_layers.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py index 93add6806e..41990d84d9 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_usd_layers.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py @@ -1,7 +1,7 @@ import os import pyblish.api -import ayon_core.hosts.houdini.api.usd as usdlib +import ayon_houdini.api.usd as usdlib import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py index c39b1db103..2fd2dbd599 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_vray_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py @@ -4,11 +4,11 @@ import os import hou import pyblish.api -from ayon_core.hosts.houdini.api.lib import ( +from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences ) -from ayon_core.hosts.houdini.api import ( +from ayon_houdini.api import ( colorspace ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_workfile.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_workfile.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_workscene_fps.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/collect_workscene_fps.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py similarity index 94% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_active_view_thumbnail.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index aedcb1da02..172399479f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -1,8 +1,8 @@ import pyblish.api import tempfile from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api import lib -from ayon_core.hosts.houdini.api.pipeline import IS_HEADLESS +from ayon_houdini.api import lib +from ayon_houdini.api.pipeline import IS_HEADLESS class ExtractActiveViewThumbnail(publish.Extractor): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_alembic.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py index 7ae476d2b4..824ac468a2 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_ass.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py index 24b956ad81..23fe6678d4 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py similarity index 93% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_bgeo.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py index 448cf97848..e477b7a552 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py @@ -3,8 +3,8 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api.lib import render_rop +from ayon_houdini.api import lib import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_composite.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py index 0fab69ef4a..ca4c738a6a 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop, splitext +from ayon_houdini.api.lib import render_rop, splitext import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_fbx.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py index 7ef004d7cb..de1d8d3b3b 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py @@ -4,7 +4,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_hda.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_mantra_ifd.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py index 26a216e335..6d608aacfa 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_opengl.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_redshift_proxy.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py index e08a73ae8e..634322b310 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_render.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 7b4762a25f..0506c7c8d5 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -1,7 +1,7 @@ import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou import os diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py similarity index 95% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_usd.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py index 0aeed06643..54051934d7 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py @@ -1,9 +1,10 @@ + import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py similarity index 99% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_usd_layered.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py index 2e5c9a892c..df2bd0c4b6 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py @@ -11,8 +11,8 @@ from ayon_core.pipeline import ( get_representation_path, publish, ) -import ayon_core.hosts.houdini.api.usd as hou_usdlib -from ayon_core.hosts.houdini.api.lib import render_rop +import ayon_houdini.api.usd as hou_usdlib +from ayon_houdini.api.lib import render_rop class ExitStack(object): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_vdb_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py similarity index 96% rename from client/ayon_core/hosts/houdini/plugins/publish/extract_vdb_cache.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py index 4544d33e57..e1146e4978 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_vdb_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.houdini.api.lib import render_rop +from ayon_houdini.api.lib import render_rop import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/help/validate_vdb_output_node.xml b/server_addon/houdini/client/ayon_houdini/plugins/publish/help/validate_vdb_output_node.xml similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/help/validate_vdb_output_node.xml rename to server_addon/houdini/client/ayon_houdini/plugins/publish/help/validate_vdb_output_node.xml index eb83bfffe3..8aac9a6a07 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/help/validate_vdb_output_node.xml +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/help/validate_vdb_output_node.xml @@ -25,4 +25,4 @@ ROP node `{rop_path}` is set to export SOP path `{sop_path}`. - \ No newline at end of file + diff --git a/client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/increment_current_file.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/save_scene.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/save_scene.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_abc_primitive_to_detail.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_alembic_face_sets.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_alembic_face_sets.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_alembic_input_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_alembic_input_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_animation_settings.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_animation_settings.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py index e28c38ece0..14bd3a05bd 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_animation_settings.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py @@ -1,7 +1,7 @@ import pyblish.api from ayon_core.pipeline.publish import PublishValidationError -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_bypass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_bypass.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_camera_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_camera_rop.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_cop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_cop_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_fbx_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_fbx_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py index 08eaa182c0..24d8c27bd6 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_fbx_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.houdini.api.action import ( +from ayon_houdini.api.action import ( SelectInvalidAction, SelectROPAction, ) -from ayon_core.hosts.houdini.api.lib import get_obj_node_output +from ayon_houdini.api.lib import get_obj_node_output import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_file_extension.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_file_extension.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py index e9a0397a58..43083feeea 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_file_extension.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py @@ -2,7 +2,7 @@ import os import pyblish.api -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib from ayon_core.pipeline import PublishValidationError import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_frame_range.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py index 2a3418ee7e..08f82e12b8 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py @@ -2,7 +2,7 @@ import pyblish.api from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.houdini.api.action import SelectInvalidAction +from ayon_houdini.api.action import SelectInvalidAction import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_frame_token.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_frame_token.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py index 20fb859146..1b8c167869 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_frame_token.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_houdini_license_category.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_houdini_license_category.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_instance_in_context.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_instance_in_context.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py index 26708e306b..b2d839497f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_instance_in_context.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py @@ -2,7 +2,7 @@ """Validate if instance asset is the same as context asset.""" import pyblish.api -from ayon_core.hosts.houdini.api.action import SelectROPAction +from ayon_houdini.api.action import SelectROPAction from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py similarity index 92% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py index 289e00339b..4db309f0ed 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_mesh_is_static.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py @@ -7,8 +7,8 @@ from ayon_core.pipeline import ( ) from ayon_core.pipeline.publish import ValidateContentsOrder -from ayon_core.hosts.houdini.api.action import SelectInvalidAction -from ayon_core.hosts.houdini.api.lib import get_output_children +from ayon_houdini.api.action import SelectInvalidAction +from ayon_houdini.api.lib import get_output_children class ValidateMeshIsStatic(pyblish.api.InstancePlugin, diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_mkpaths_toggled.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_no_errors.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_no_errors.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_primitive_hierarchy_paths.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_remote_publish.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py index 133b45e8c3..801ed08ce6 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py @@ -1,7 +1,7 @@ # -*-coding: utf-8 -*- import pyblish.api -from ayon_core.hosts.houdini.api import lib +from ayon_houdini.api import lib from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline import PublishValidationError diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_remote_publish_enabled.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py similarity index 95% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py index fa532c5437..3f783f9fbe 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_review_colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, apply_plugin_settings_automatically ) -from ayon_core.hosts.houdini.api.action import SelectROPAction +from ayon_houdini.api.action import SelectROPAction import os import hou @@ -123,14 +123,14 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin, As if OCIO is disabled the whole validation is skipped and this repair action won't show up. """ - from ayon_core.hosts.houdini.api.lib import set_review_color_space + from ayon_houdini.api.lib import set_review_color_space # Fall to the default value if cls.review_color_space is empty. if not cls.review_color_space: # cls.review_color_space is an empty string # when the imageio/workfile setting is disabled or # when the Review colorspace setting is empty. - from ayon_core.hosts.houdini.api.colorspace import get_default_display_view_colorspace # noqa + from ayon_houdini.api.colorspace import get_default_display_view_colorspace # noqa cls.review_color_space = get_default_display_view_colorspace() rop_node = hou.node(instance.data["instance_node"]) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_scene_review.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py index 61cf7596ac..59fa8cb134 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_sop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.houdini.api.action import ( +from ayon_houdini.api.action import ( SelectInvalidAction, SelectROPAction, ) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_subset_name.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_subset_name.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py index 0481929824..a1fc0bf062 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_subset_name.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, ) -from ayon_core.hosts.houdini.api.action import SelectInvalidAction +from ayon_houdini.api.action import SelectInvalidAction from ayon_core.pipeline.create import get_product_name import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py similarity index 95% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_unreal_staticmesh_naming.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py index ae00bc9db4..43cf6029f6 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py @@ -7,8 +7,8 @@ from ayon_core.pipeline import ( ) from ayon_core.pipeline.publish import ValidateContentsOrder -from ayon_core.hosts.houdini.api.action import SelectInvalidAction -from ayon_core.hosts.houdini.api.lib import get_output_children +from ayon_houdini.api.action import SelectInvalidAction +from ayon_houdini.api.lib import get_output_children import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py index 2b727670ad..3dcf7206f1 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_layer_path_backslashes.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api -import ayon_core.hosts.houdini.api.usd as hou_usdlib +import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError import hou diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py index dc1a19cae0..34440b70b0 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_model_and_shade.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api -import ayon_core.hosts.houdini.api.usd as hou_usdlib +import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError from pxr import UsdShade, UsdRender, UsdLux diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_render_product_names.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_render_product_names.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_setdress.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py similarity index 97% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_setdress.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py index 40b67e896a..dc773b6770 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_setdress.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api -import ayon_core.hosts.houdini.api.usd as hou_usdlib +import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_shade_model_exists.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_usd_shade_workspace.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_vdb_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py similarity index 98% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_vdb_output_node.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py index 319a9a4b50..5c662c0084 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_vdb_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py @@ -5,7 +5,7 @@ import pyblish.api import hou from ayon_core.pipeline import PublishXmlValidationError -from ayon_core.hosts.houdini.api.action import SelectInvalidAction +from ayon_houdini.api.action import SelectInvalidAction def group_consecutive_numbers(nums): diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_workfile_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py similarity index 100% rename from client/ayon_core/hosts/houdini/plugins/publish/validate_workfile_paths.py rename to server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py diff --git a/client/ayon_core/hosts/houdini/startup/MainMenuCommon.xml b/server_addon/houdini/client/ayon_houdini/startup/MainMenuCommon.xml similarity index 94% rename from client/ayon_core/hosts/houdini/startup/MainMenuCommon.xml rename to server_addon/houdini/client/ayon_houdini/startup/MainMenuCommon.xml index b6e78cbdc8..5b383f0085 100644 --- a/client/ayon_core/hosts/houdini/startup/MainMenuCommon.xml +++ b/server_addon/houdini/client/ayon_houdini/startup/MainMenuCommon.xml @@ -81,16 +81,16 @@ host_tools.show_workfiles(parent) diff --git a/client/ayon_core/hosts/houdini/startup/python2.7libs/pythonrc.py b/server_addon/houdini/client/ayon_houdini/startup/python2.7libs/pythonrc.py similarity index 78% rename from client/ayon_core/hosts/houdini/startup/python2.7libs/pythonrc.py rename to server_addon/houdini/client/ayon_houdini/startup/python2.7libs/pythonrc.py index 6e45eb6a10..40ff7fb758 100644 --- a/client/ayon_core/hosts/houdini/startup/python2.7libs/pythonrc.py +++ b/server_addon/houdini/client/ayon_houdini/startup/python2.7libs/pythonrc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """OpenPype startup script.""" from ayon_core.pipeline import install_host -from ayon_core.hosts.houdini.api import HoudiniHost +from ayon_houdini.api import HoudiniHost def main(): diff --git a/client/ayon_core/hosts/houdini/startup/python3.10libs/pythonrc.py b/server_addon/houdini/client/ayon_houdini/startup/python3.10libs/pythonrc.py similarity index 78% rename from client/ayon_core/hosts/houdini/startup/python3.10libs/pythonrc.py rename to server_addon/houdini/client/ayon_houdini/startup/python3.10libs/pythonrc.py index 6e45eb6a10..40ff7fb758 100644 --- a/client/ayon_core/hosts/houdini/startup/python3.10libs/pythonrc.py +++ b/server_addon/houdini/client/ayon_houdini/startup/python3.10libs/pythonrc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """OpenPype startup script.""" from ayon_core.pipeline import install_host -from ayon_core.hosts.houdini.api import HoudiniHost +from ayon_houdini.api import HoudiniHost def main(): diff --git a/client/ayon_core/hosts/houdini/startup/python3.7libs/pythonrc.py b/server_addon/houdini/client/ayon_houdini/startup/python3.7libs/pythonrc.py similarity index 78% rename from client/ayon_core/hosts/houdini/startup/python3.7libs/pythonrc.py rename to server_addon/houdini/client/ayon_houdini/startup/python3.7libs/pythonrc.py index 6e45eb6a10..40ff7fb758 100644 --- a/client/ayon_core/hosts/houdini/startup/python3.7libs/pythonrc.py +++ b/server_addon/houdini/client/ayon_houdini/startup/python3.7libs/pythonrc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """OpenPype startup script.""" from ayon_core.pipeline import install_host -from ayon_core.hosts.houdini.api import HoudiniHost +from ayon_houdini.api import HoudiniHost def main(): diff --git a/client/ayon_core/hosts/houdini/startup/python3.9libs/pythonrc.py b/server_addon/houdini/client/ayon_houdini/startup/python3.9libs/pythonrc.py similarity index 78% rename from client/ayon_core/hosts/houdini/startup/python3.9libs/pythonrc.py rename to server_addon/houdini/client/ayon_houdini/startup/python3.9libs/pythonrc.py index 6e45eb6a10..40ff7fb758 100644 --- a/client/ayon_core/hosts/houdini/startup/python3.9libs/pythonrc.py +++ b/server_addon/houdini/client/ayon_houdini/startup/python3.9libs/pythonrc.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """OpenPype startup script.""" from ayon_core.pipeline import install_host -from ayon_core.hosts.houdini.api import HoudiniHost +from ayon_houdini.api import HoudiniHost def main(): diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 6c81eba439..c3be99b5c3 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,3 @@ name = "houdini" title = "Houdini" -version = "0.2.14" +version = "0.3.14" From 6fdce1f212aaee776deb21541002d2cc04bd7670 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 22:32:34 +0300 Subject: [PATCH 176/469] update ayon_houdini package.py --- server_addon/houdini/package.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index c3be99b5c3..e4c2f8b415 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,10 @@ name = "houdini" title = "Houdini" version = "0.3.14" + +client_dir = "ayon_houdini" + +ayon_required_addons = { + "core": ">=0.3.0", +} +ayon_compatible_addons = {} From 2768fb7d6839f400edfc255c02fd62503d742c09 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 22:38:42 +0300 Subject: [PATCH 177/469] fix typo in base.py --- client/ayon_core/addon/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 21b1193b07..6b2788d861 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -1321,7 +1321,7 @@ class TrayAddonsManager(AddonsManager): self.doubleclick_callback = None def add_doubleclick_callback(self, addon, callback): - """Register doubleclick callbacks on tray icon. + """Register double-click callbacks on tray icon. Currently, there is no way how to determine which is launched. Name of callback can be defined with `doubleclick_callback` attribute. From 66bb9aac8304d338f1511094832ef053d05bc244 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 22:39:19 +0300 Subject: [PATCH 178/469] add houdini to MOVED_ADDON_MILESTONE_VERSIONS --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 6b2788d861..9cf557f96e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "houdini": VersionInfo(0, 3, 14), } # Inherit from `object` for Python 2 hosts From 3f91a29471928f6a2257d2c0c74e59bdc848f78b Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 23:15:54 +0300 Subject: [PATCH 179/469] add settings_category --- server_addon/houdini/client/ayon_houdini/api/plugin.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index a9c8c313b9..bb29c534f3 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -169,6 +169,8 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): settings_name = None add_publish_button = False + settings_category = "houdini" + def create(self, product_name, instance_data, pre_create_data): try: self.selected_nodes = [] From b62ae6b73cf41a6e786f0077d62a9afcd4f3523c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 14 May 2024 23:17:24 +0300 Subject: [PATCH 180/469] add version.py for Houdini addon --- server_addon/houdini/client/ayon_houdini/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/houdini/client/ayon_houdini/version.py diff --git a/server_addon/houdini/client/ayon_houdini/version.py b/server_addon/houdini/client/ayon_houdini/version.py new file mode 100644 index 0000000000..a38ff316cd --- /dev/null +++ b/server_addon/houdini/client/ayon_houdini/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring Houdini addon version.""" +__version__ = "0.3.14" From 700967a28b86690cff6b95b8d8b771cbb8d552ac Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 16:06:10 +0800 Subject: [PATCH 181/469] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../client/ayon_substancepainter}/__init__.py | 0 .../client/ayon_substancepainter}/addon.py | 0 .../ayon_substancepainter}/api/__init__.py | 0 .../ayon_substancepainter}/api/colorspace.py | 0 .../client/ayon_substancepainter}/api/lib.py | 0 .../ayon_substancepainter/api/pipeline.py | 425 ++++++++++++ .../deploy/plugins/openpype_plugin.py | 0 .../startup/openpype_load_on_first_run.py | 0 .../plugins/create/create_textures.py | 0 .../plugins/create/create_workfile.py | 0 .../plugins/load/load_mesh.py | 0 .../plugins/publish/collect_current_file.py | 0 .../publish/collect_textureset_images.py | 0 .../collect_workfile_representation.py | 0 .../plugins/publish/extract_textures.py | 0 .../plugins/publish/increment_workfile.py | 0 .../plugins/publish/save_workfile.py | 0 .../plugins/publish/validate_ouput_maps.py | 0 .../client/substancepainter/__init__.py | 10 + .../client/substancepainter/addon.py | 31 + .../client/substancepainter/api/__init__.py | 8 + .../client/substancepainter/api/colorspace.py | 157 +++++ .../client/substancepainter/api/lib.py | 642 ++++++++++++++++++ .../client}/substancepainter/api/pipeline.py | 0 .../deploy/plugins/openpype_plugin.py | 36 + .../startup/openpype_load_on_first_run.py | 43 ++ .../plugins/create/create_textures.py | 175 +++++ .../plugins/create/create_workfile.py | 124 ++++ .../plugins/load/load_mesh.py | 246 +++++++ .../plugins/publish/collect_current_file.py | 17 + .../publish/collect_textureset_images.py | 211 ++++++ .../collect_workfile_representation.py | 26 + .../plugins/publish/extract_textures.py | 62 ++ .../plugins/publish/increment_workfile.py | 23 + .../plugins/publish/save_workfile.py | 28 + .../plugins/publish/validate_ouput_maps.py | 110 +++ 36 files changed, 2374 insertions(+) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/__init__.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/addon.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/__init__.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/colorspace.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/lib.py (100%) create mode 100644 server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/deploy/plugins/openpype_plugin.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/deploy/startup/openpype_load_on_first_run.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/create/create_textures.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/load/load_mesh.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_textureset_images.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_workfile_representation.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/extract_textures.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/increment_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/save_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/validate_ouput_maps.py (100%) create mode 100644 server_addon/substancepainter/client/substancepainter/__init__.py create mode 100644 server_addon/substancepainter/client/substancepainter/addon.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/__init__.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/colorspace.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/lib.py rename {client/ayon_core/hosts => server_addon/substancepainter/client}/substancepainter/api/pipeline.py (100%) create mode 100644 server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py create mode 100644 server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/client/ayon_core/hosts/substancepainter/__init__.py b/server_addon/substancepainter/client/ayon_substancepainter/__init__.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/__init__.py rename to server_addon/substancepainter/client/ayon_substancepainter/__init__.py diff --git a/client/ayon_core/hosts/substancepainter/addon.py b/server_addon/substancepainter/client/ayon_substancepainter/addon.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/addon.py rename to server_addon/substancepainter/client/ayon_substancepainter/addon.py diff --git a/client/ayon_core/hosts/substancepainter/api/__init__.py b/server_addon/substancepainter/client/ayon_substancepainter/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/__init__.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/__init__.py diff --git a/client/ayon_core/hosts/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/ayon_substancepainter/api/colorspace.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/colorspace.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/colorspace.py diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/server_addon/substancepainter/client/ayon_substancepainter/api/lib.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/lib.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/lib.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py new file mode 100644 index 0000000000..6e0ca0145b --- /dev/null +++ b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py @@ -0,0 +1,425 @@ +# -*- coding: utf-8 -*- +"""Pipeline tools for OpenPype Substance Painter integration.""" +import os +import logging +from functools import partial + +# Substance 3D Painter modules +import substance_painter.ui +import substance_painter.event +import substance_painter.project + +import pyblish.api + +from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost +from ayon_core.settings import get_current_project_settings + +from ayon_core.pipeline.template_data import get_template_data_with_names +from ayon_core.pipeline import ( + register_creator_plugin_path, + register_loader_plugin_path, + AVALON_CONTAINER_ID, + Anatomy, +) +from ayon_core.lib import ( + StringTemplate, + register_event_callback, + emit_event, +) +from ayon_core.pipeline.load import any_outdated_containers +from ayon_substancepainter import SUBSTANCE_HOST_DIR + +from . import lib + +log = logging.getLogger("ayon_core.hosts.substance") + +PLUGINS_DIR = os.path.join(SUBSTANCE_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") + +OPENPYPE_METADATA_KEY = "OpenPype" +OPENPYPE_METADATA_CONTAINERS_KEY = "containers" # child key +OPENPYPE_METADATA_CONTEXT_KEY = "context" # child key +OPENPYPE_METADATA_INSTANCES_KEY = "instances" # child key + + +class SubstanceHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): + name = "substancepainter" + + def __init__(self): + super(SubstanceHost, self).__init__() + self._has_been_setup = False + self.menu = None + self.callbacks = [] + self.shelves = [] + + def install(self): + pyblish.api.register_host("substancepainter") + + pyblish.api.register_plugin_path(PUBLISH_PATH) + register_loader_plugin_path(LOAD_PATH) + register_creator_plugin_path(CREATE_PATH) + + log.info("Installing callbacks ... ") + # register_event_callback("init", on_init) + self._register_callbacks() + # register_event_callback("before.save", before_save) + # register_event_callback("save", on_save) + register_event_callback("open", on_open) + # register_event_callback("new", on_new) + + log.info("Installing menu ... ") + self._install_menu() + + project_settings = get_current_project_settings() + self._install_shelves(project_settings) + + self._has_been_setup = True + + def uninstall(self): + self._uninstall_shelves() + self._uninstall_menu() + self._deregister_callbacks() + + def workfile_has_unsaved_changes(self): + + if not substance_painter.project.is_open(): + return False + + return substance_painter.project.needs_saving() + + def get_workfile_extensions(self): + return [".spp", ".toc"] + + def save_workfile(self, dst_path=None): + + if not substance_painter.project.is_open(): + return False + + if not dst_path: + dst_path = self.get_current_workfile() + + full_save_mode = substance_painter.project.ProjectSaveMode.Full + substance_painter.project.save_as(dst_path, full_save_mode) + + return dst_path + + def open_workfile(self, filepath): + + if not os.path.exists(filepath): + raise RuntimeError("File does not exist: {}".format(filepath)) + + # We must first explicitly close current project before opening another + if substance_painter.project.is_open(): + substance_painter.project.close() + + substance_painter.project.open(filepath) + return filepath + + def get_current_workfile(self): + if not substance_painter.project.is_open(): + return None + + filepath = substance_painter.project.file_path() + if filepath and filepath.endswith(".spt"): + # When currently in a Substance Painter template assume our + # scene isn't saved. This can be the case directly after doing + # "New project", the path will then be the template used. This + # avoids Workfiles tool trying to save as .spt extension if the + # file hasn't been saved before. + return + + return filepath + + def get_containers(self): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) + if containers: + for key, container in containers.items(): + container["objectName"] = key + yield container + + def update_context_data(self, data, changes): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + metadata.set(OPENPYPE_METADATA_CONTEXT_KEY, data) + + def get_context_data(self): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + return metadata.get(OPENPYPE_METADATA_CONTEXT_KEY) or {} + + def _install_menu(self): + from PySide2 import QtWidgets + from ayon_core.tools.utils import host_tools + + parent = substance_painter.ui.get_main_window() + + tab_menu_label = os.environ.get("AYON_MENU_LABEL") or "AYON" + menu = QtWidgets.QMenu(tab_menu_label) + + action = menu.addAction("Create...") + action.triggered.connect( + lambda: host_tools.show_publisher(parent=parent, + tab="create") + ) + + action = menu.addAction("Load...") + action.triggered.connect( + lambda: host_tools.show_loader(parent=parent, use_context=True) + ) + + action = menu.addAction("Publish...") + action.triggered.connect( + lambda: host_tools.show_publisher(parent=parent, + tab="publish") + ) + + action = menu.addAction("Manage...") + action.triggered.connect( + lambda: host_tools.show_scene_inventory(parent=parent) + ) + + action = menu.addAction("Library...") + action.triggered.connect( + lambda: host_tools.show_library_loader(parent=parent) + ) + + menu.addSeparator() + action = menu.addAction("Work Files...") + action.triggered.connect( + lambda: host_tools.show_workfiles(parent=parent) + ) + + substance_painter.ui.add_menu(menu) + + def on_menu_destroyed(): + self.menu = None + + menu.destroyed.connect(on_menu_destroyed) + + self.menu = menu + + def _uninstall_menu(self): + if self.menu: + self.menu.destroy() + self.menu = None + + def _register_callbacks(self): + # Prepare emit event callbacks + open_callback = partial(emit_event, "open") + + # Connect to the Substance Painter events + dispatcher = substance_painter.event.DISPATCHER + for event, callback in [ + (substance_painter.event.ProjectOpened, open_callback) + ]: + dispatcher.connect(event, callback) + # Keep a reference so we can deregister if needed + self.callbacks.append((event, callback)) + + def _deregister_callbacks(self): + for event, callback in self.callbacks: + substance_painter.event.DISPATCHER.disconnect(event, callback) + self.callbacks.clear() + + def _install_shelves(self, project_settings): + + shelves = project_settings["substancepainter"].get("shelves", []) + if not shelves: + return + + # Prepare formatting data if we detect any path which might have + # template tokens like {folder[name]} in there. + formatting_data = {} + has_formatting_entries = any("{" in item["value"] for item in shelves) + if has_formatting_entries: + project_name = self.get_current_project_name() + folder_path = self.get_current_folder_path() + task_name = self.get_current_task_name() + formatting_data = get_template_data_with_names( + project_name, folder_path, task_name, project_settings + ) + anatomy = Anatomy(project_name) + formatting_data["root"] = anatomy.roots + + for shelve_item in shelves: + + # Allow formatting with anatomy for the paths + path = shelve_item["value"] + if "{" in path: + path = StringTemplate.format_template(path, formatting_data) + + name = shelve_item["name"] + shelf_name = None + try: + shelf_name = lib.load_shelf(path, name=name) + except ValueError as exc: + print(f"Failed to load shelf -> {exc}") + + if shelf_name: + self.shelves.append(shelf_name) + + def _uninstall_shelves(self): + for shelf_name in self.shelves: + substance_painter.resource.Shelves.remove(shelf_name) + self.shelves.clear() + + +def on_open(): + log.info("Running callback on open..") + + if any_outdated_containers(): + from ayon_core.tools.utils import SimplePopup + + log.warning("Scene has outdated content.") + + # Get main window + parent = substance_painter.ui.get_main_window() + if parent is None: + log.info("Skipping outdated content pop-up " + "because Substance window can't be found.") + else: + + # Show outdated pop-up + def _on_show_inventory(): + from ayon_core.tools.utils import host_tools + host_tools.show_scene_inventory(parent=parent) + + dialog = SimplePopup(parent=parent) + dialog.setWindowTitle("Substance scene has outdated content") + dialog.set_message("There are outdated containers in " + "your Substance scene.") + dialog.on_clicked.connect(_on_show_inventory) + dialog.show() + + +def imprint_container(container, + name, + namespace, + context, + loader): + """Imprint a loaded container with metadata. + + Containerisation enables a tracking of version, author and origin + for loaded assets. + + Arguments: + container (dict): The (substance metadata) dictionary to imprint into. + name (str): Name of resulting assembly + namespace (str): Namespace under which to host container + context (dict): Asset information + loader (load.LoaderPlugin): loader instance used to produce container. + + Returns: + None + + """ + + data = [ + ("schema", "openpype:container-2.0"), + ("id", AVALON_CONTAINER_ID), + ("name", str(name)), + ("namespace", str(namespace) if namespace else None), + ("loader", str(loader.__class__.__name__)), + ("representation", context["representation"]["id"]), + ] + for key, value in data: + container[key] = value + + +def set_container_metadata(object_name, container_data, update=False): + """Helper method to directly set the data for a specific container + + Args: + object_name (str): The unique object name identifier for the container + container_data (dict): The data for the container. + Note 'objectName' data is derived from `object_name` and key in + `container_data` will be ignored. + update (bool): Whether to only update the dict data. + + """ + # The objectName is derived from the key in the metadata so won't be stored + # in the metadata in the container's data. + container_data.pop("objectName", None) + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) or {} + if update: + existing_data = containers.setdefault(object_name, {}) + existing_data.update(container_data) # mutable dict, in-place update + else: + containers[object_name] = container_data + metadata.set("containers", containers) + + +def remove_container_metadata(object_name): + """Helper method to remove the data for a specific container""" + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) + if containers: + containers.pop(object_name, None) + metadata.set("containers", containers) + + +def set_instance(instance_id, instance_data, update=False): + """Helper method to directly set the data for a specific container + + Args: + instance_id (str): Unique identifier for the instance + instance_data (dict): The instance data to store in the metaadata. + """ + set_instances({instance_id: instance_data}, update=update) + + +def set_instances(instance_data_by_id, update=False): + """Store data for multiple instances at the same time. + + This is more optimal than querying and setting them in the metadata one + by one. + """ + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + + for instance_id, instance_data in instance_data_by_id.items(): + if update: + existing_data = instances.get(instance_id, {}) + existing_data.update(instance_data) + else: + instances[instance_id] = instance_data + + metadata.set("instances", instances) + + +def remove_instance(instance_id): + """Helper method to remove the data for a specific container""" + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + instances.pop(instance_id, None) + metadata.set("instances", instances) + + +def get_instances_by_id(): + """Return all instances stored in the project instances metadata""" + if not substance_painter.project.is_open(): + return {} + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + return metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + + +def get_instances(): + """Return all instances stored in the project instances as a list""" + return list(get_instances_by_id().values()) diff --git a/client/ayon_core/hosts/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/deploy/plugins/openpype_plugin.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py diff --git a/client/ayon_core/hosts/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/deploy/startup/openpype_load_on_first_run.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/create/create_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/load/load_mesh.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_current_file.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_workfile_representation.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_workfile_representation.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_workfile_representation.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/increment_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/increment_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/increment_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/save_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/save_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/save_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/validate_ouput_maps.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/server_addon/substancepainter/client/substancepainter/__init__.py b/server_addon/substancepainter/client/substancepainter/__init__.py new file mode 100644 index 0000000000..4c33b9f507 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/__init__.py @@ -0,0 +1,10 @@ +from .addon import ( + SubstanceAddon, + SUBSTANCE_HOST_DIR, +) + + +__all__ = ( + "SubstanceAddon", + "SUBSTANCE_HOST_DIR" +) diff --git a/server_addon/substancepainter/client/substancepainter/addon.py b/server_addon/substancepainter/client/substancepainter/addon.py new file mode 100644 index 0000000000..26829d3153 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/addon.py @@ -0,0 +1,31 @@ +import os +from ayon_core.addon import AYONAddon, IHostAddon + +SUBSTANCE_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class SubstanceAddon(AYONAddon, IHostAddon): + name = "substancepainter" + host_name = "substancepainter" + + def add_implementation_envs(self, env, _app): + # Add requirements to SUBSTANCE_PAINTER_PLUGINS_PATH + plugin_path = os.path.join(SUBSTANCE_HOST_DIR, "deploy") + plugin_path = plugin_path.replace("\\", "/") + if env.get("SUBSTANCE_PAINTER_PLUGINS_PATH"): + plugin_path += os.pathsep + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] + + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] = plugin_path + + # Log in Substance Painter doesn't support custom terminal colors + env["AYON_LOG_NO_COLORS"] = "1" + + def get_launch_hook_paths(self, app): + if app.host_name != self.host_name: + return [] + return [ + os.path.join(SUBSTANCE_HOST_DIR, "hooks") + ] + + def get_workfile_extensions(self): + return [".spp", ".toc"] diff --git a/server_addon/substancepainter/client/substancepainter/api/__init__.py b/server_addon/substancepainter/client/substancepainter/api/__init__.py new file mode 100644 index 0000000000..937d0c429e --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/__init__.py @@ -0,0 +1,8 @@ +from .pipeline import ( + SubstanceHost, + +) + +__all__ = [ + "SubstanceHost", +] diff --git a/server_addon/substancepainter/client/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/substancepainter/api/colorspace.py new file mode 100644 index 0000000000..375b61b39b --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/colorspace.py @@ -0,0 +1,157 @@ +"""Substance Painter OCIO management + +Adobe Substance 3D Painter supports OCIO color management using a per project +configuration. Output color spaces are defined at the project level + +More information see: + - https://substance3d.adobe.com/documentation/spdoc/color-management-223053233.html # noqa + - https://substance3d.adobe.com/documentation/spdoc/color-management-with-opencolorio-225969419.html # noqa + +""" +import substance_painter.export +import substance_painter.js +import json + +from .lib import ( + get_document_structure, + get_channel_format +) + + +def _iter_document_stack_channels(): + """Yield all stack paths and channels project""" + + for material in get_document_structure()["materials"]: + material_name = material["name"] + for stack in material["stacks"]: + stack_name = stack["name"] + if stack_name: + stack_path = [material_name, stack_name] + else: + stack_path = material_name + for channel in stack["channels"]: + yield stack_path, channel + + +def _get_first_color_and_data_stack_and_channel(): + """Return first found color channel and data channel.""" + color_channel = None + data_channel = None + for stack_path, channel in _iter_document_stack_channels(): + channel_format = get_channel_format(stack_path, channel) + if channel_format["color"]: + color_channel = (stack_path, channel) + else: + data_channel = (stack_path, channel) + + if color_channel and data_channel: + return color_channel, data_channel + + return color_channel, data_channel + + +def get_project_channel_data(): + """Return colorSpace settings for the current substance painter project. + + In Substance Painter only color channels have Color Management enabled + whereas data channels have no color management applied. This can't be + changed. The artist can only customize the export color space for color + channels per bit-depth for 8 bpc, 16 bpc and 32 bpc. + + As such this returns the color space for 'data' and for per bit-depth + for color channels. + + Example output: + { + "data": {'colorSpace': 'Utility - Raw'}, + "8": {"colorSpace": "ACES - AcesCG"}, + "16": {"colorSpace": "ACES - AcesCG"}, + "16f": {"colorSpace": "ACES - AcesCG"}, + "32f": {"colorSpace": "ACES - AcesCG"} + } + + """ + + keys = ["colorSpace"] + query = {key: f"${key}" for key in keys} + + config = { + "exportPath": "/", + "exportShaderParams": False, + "defaultExportPreset": "query_preset", + + "exportPresets": [{ + "name": "query_preset", + + # List of maps making up this export preset. + "maps": [{ + "fileName": json.dumps(query), + # List of source/destination defining which channels will + # make up the texture file. + "channels": [], + "parameters": { + "fileFormat": "exr", + "bitDepth": "32f", + "dithering": False, + "sizeLog2": 4, + "paddingAlgorithm": "passthrough", + "dilationDistance": 16 + } + }] + }], + } + + def _get_query_output(config): + # Return the basename of the single output path we defined + result = substance_painter.export.list_project_textures(config) + path = next(iter(result.values()))[0] + # strip extension and slash since we know relevant json data starts + # and ends with { and } characters + path = path.strip("/\\.exr") + return json.loads(path) + + # Query for each type of channel (color and data) + color_channel, data_channel = _get_first_color_and_data_stack_and_channel() + colorspaces = {} + for key, channel_data in { + "data": data_channel, + "color": color_channel + }.items(): + if channel_data is None: + # No channel of that datatype anywhere in the Stack. We're + # unable to identify the output color space of the project + colorspaces[key] = None + continue + + stack, channel = channel_data + + # Stack must be a string + if not isinstance(stack, str): + # Assume iterable + stack = "/".join(stack) + + # Define the temp output config + config["exportList"] = [{"rootPath": stack}] + config_map = config["exportPresets"][0]["maps"][0] + config_map["channels"] = [ + { + "destChannel": x, + "srcChannel": x, + "srcMapType": "documentMap", + "srcMapName": channel + } for x in "RGB" + ] + + if key == "color": + # Query for each bit depth + # Color space definition can have a different OCIO config set + # for 8-bit, 16-bit and 32-bit outputs so we need to check each + # bit depth + for depth in ["8", "16", "16f", "32f"]: + config_map["parameters"]["bitDepth"] = depth # noqa + colorspaces[key + depth] = _get_query_output(config) + else: + # Data channel (not color managed) + colorspaces[key] = _get_query_output(config) + + return colorspaces diff --git a/server_addon/substancepainter/client/substancepainter/api/lib.py b/server_addon/substancepainter/client/substancepainter/api/lib.py new file mode 100644 index 0000000000..64c39943ce --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/lib.py @@ -0,0 +1,642 @@ +import os +import re +import json +from collections import defaultdict + +import substance_painter.project +import substance_painter.resource +import substance_painter.js +import substance_painter.export + +from qtpy import QtGui, QtWidgets, QtCore + + +def get_export_presets(): + """Return Export Preset resource URLs for all available Export Presets. + + Returns: + dict: {Resource url: GUI Label} + + """ + # TODO: Find more optimal way to find all export templates + + preset_resources = {} + for shelf in substance_painter.resource.Shelves.all(): + shelf_path = os.path.normpath(shelf.path()) + + presets_path = os.path.join(shelf_path, "export-presets") + if not os.path.exists(presets_path): + continue + + for filename in os.listdir(presets_path): + if filename.endswith(".spexp"): + template_name = os.path.splitext(filename)[0] + + resource = substance_painter.resource.ResourceID( + context=shelf.name(), + name=template_name + ) + resource_url = resource.url() + + preset_resources[resource_url] = template_name + + # Sort by template name + export_templates = dict(sorted(preset_resources.items(), + key=lambda x: x[1])) + + # Add default built-ins at the start + # TODO: find the built-ins automatically; scraped with https://gist.github.com/BigRoy/97150c7c6f0a0c916418207b9a2bc8f1 # noqa + result = { + "export-preset-generator://viewport2d": "2D View", # noqa + "export-preset-generator://doc-channel-normal-no-alpha": "Document channels + Normal + AO (No Alpha)", # noqa + "export-preset-generator://doc-channel-normal-with-alpha": "Document channels + Normal + AO (With Alpha)", # noqa + "export-preset-generator://sketchfab": "Sketchfab", # noqa + "export-preset-generator://adobe-standard-material": "Substance 3D Stager", # noqa + "export-preset-generator://usd": "USD PBR Metal Roughness", # noqa + "export-preset-generator://gltf": "glTF PBR Metal Roughness", # noqa + "export-preset-generator://gltf-displacement": "glTF PBR Metal Roughness + Displacement texture (experimental)" # noqa + } + result.update(export_templates) + return result + + +def _convert_stack_path_to_cmd_str(stack_path): + """Convert stack path `str` or `[str, str]` for javascript query + + Example usage: + >>> stack_path = _convert_stack_path_to_cmd_str(stack_path) + >>> cmd = f"alg.mapexport.channelIdentifiers({stack_path})" + >>> substance_painter.js.evaluate(cmd) + + Args: + stack_path (list or str): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + + Returns: + str: Stack path usable as argument in javascript query. + + """ + return json.dumps(stack_path) + + +def get_channel_identifiers(stack_path=None): + """Return the list of channel identifiers. + + If a context is passed (texture set/stack), + return only used channels with resolved user channels. + + Channel identifiers are: + basecolor, height, specular, opacity, emissive, displacement, + glossiness, roughness, anisotropylevel, anisotropyangle, transmissive, + scattering, reflection, ior, metallic, normal, ambientOcclusion, + diffuse, specularlevel, blendingmask, [custom user names]. + + Args: + stack_path (list or str, Optional): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + + Returns: + list: List of channel identifiers. + + """ + if stack_path is None: + stack_path = "" + else: + stack_path = _convert_stack_path_to_cmd_str(stack_path) + cmd = f"alg.mapexport.channelIdentifiers({stack_path})" + return substance_painter.js.evaluate(cmd) + + +def get_channel_format(stack_path, channel): + """Retrieve the channel format of a specific stack channel. + + See `alg.mapexport.channelFormat` (javascript API) for more details. + + The channel format data is: + "label" (str): The channel format label: could be one of + [sRGB8, L8, RGB8, L16, RGB16, L16F, RGB16F, L32F, RGB32F] + "color" (bool): True if the format is in color, False is grayscale + "floating" (bool): True if the format uses floating point + representation, false otherwise + "bitDepth" (int): Bit per color channel (could be 8, 16 or 32 bpc) + + Arguments: + stack_path (list or str): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + channel (str): Identifier of the channel to export + (see `get_channel_identifiers`) + + Returns: + dict: The channel format data. + + """ + stack_path = _convert_stack_path_to_cmd_str(stack_path) + cmd = f"alg.mapexport.channelFormat({stack_path}, '{channel}')" + return substance_painter.js.evaluate(cmd) + + +def get_document_structure(): + """Dump the document structure. + + See `alg.mapexport.documentStructure` (javascript API) for more details. + + Returns: + dict: Document structure or None when no project is open + + """ + return substance_painter.js.evaluate("alg.mapexport.documentStructure()") + + +def get_export_templates(config, format="png", strip_folder=True): + """Return export config outputs. + + This use the Javascript API `alg.mapexport.getPathsExportDocumentMaps` + which returns a different output than using the Python equivalent + `substance_painter.export.list_project_textures(config)`. + + The nice thing about the Javascript API version is that it returns the + output textures grouped by filename template. + + A downside is that it doesn't return all the UDIM tiles but per template + always returns a single file. + + Note: + The file format needs to be explicitly passed to the Javascript API + but upon exporting through the Python API the file format can be based + on the output preset. So it's likely the file extension will mismatch + + Warning: + Even though the function appears to solely get the expected outputs + the Javascript API will actually create the config's texture output + folder if it does not exist yet. As such, a valid path must be set. + + Example output: + { + "DefaultMaterial": { + "$textureSet_BaseColor(_$colorSpace)(.$udim)": "DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", # noqa + "$textureSet_Emissive(_$colorSpace)(.$udim)": "DefaultMaterial_Emissive_ACES - ACEScg.1002.png", # noqa + "$textureSet_Height(_$colorSpace)(.$udim)": "DefaultMaterial_Height_Utility - Raw.1002.png", # noqa + "$textureSet_Metallic(_$colorSpace)(.$udim)": "DefaultMaterial_Metallic_Utility - Raw.1002.png", # noqa + "$textureSet_Normal(_$colorSpace)(.$udim)": "DefaultMaterial_Normal_Utility - Raw.1002.png", # noqa + "$textureSet_Roughness(_$colorSpace)(.$udim)": "DefaultMaterial_Roughness_Utility - Raw.1002.png" # noqa + } + } + + Arguments: + config (dict) Export config + format (str, Optional): Output format to write to, defaults to 'png' + strip_folder (bool, Optional): Whether to strip the output folder + from the output filenames. + + Returns: + dict: The expected output maps. + + """ + folder = config["exportPath"].replace("\\", "/") + preset = config["defaultExportPreset"] + cmd = f'alg.mapexport.getPathsExportDocumentMaps("{preset}", "{folder}", "{format}")' # noqa + result = substance_painter.js.evaluate(cmd) + + if strip_folder: + for _stack, maps in result.items(): + for map_template, map_filepath in maps.items(): + map_filepath = map_filepath.replace("\\", "/") + assert map_filepath.startswith(folder) + map_filename = map_filepath[len(folder):].lstrip("/") + maps[map_template] = map_filename + + return result + + +def _templates_to_regex(templates, + texture_set, + colorspaces, + project, + mesh): + """Return regex based on a Substance Painter expot filename template. + + This converts Substance Painter export filename templates like + `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` into a regex + which can be used to query an output filename to help retrieve: + + - Which template filename the file belongs to. + - Which color space the file is written with. + - Which udim tile it is exactly. + + This is used by `get_parsed_export_maps` which tries to as explicitly + as possible match the filename pattern against the known possible outputs. + That's why Texture Set name, Color spaces, Project path and mesh path must + be provided. By doing so we get the best shot at correctly matching the + right template because otherwise $texture_set could basically be any string + and thus match even that of a color space or mesh. + + Arguments: + templates (list): List of templates to convert to regex. + texture_set (str): The texture set to match against. + colorspaces (list): The colorspaces defined in the current project. + project (str): Filepath of current substance project. + mesh (str): Path to mesh file used in current project. + + Returns: + dict: Template: Template regex pattern + + """ + def _filename_no_ext(path): + return os.path.splitext(os.path.basename(path))[0] + + if colorspaces and any(colorspaces): + colorspace_match = "|".join(re.escape(c) for c in set(colorspaces)) + colorspace_match = f"({colorspace_match})" + else: + # No colorspace support enabled + colorspace_match = "" + + # Key to regex valid search values + key_matches = { + "$project": re.escape(_filename_no_ext(project)), + "$mesh": re.escape(_filename_no_ext(mesh)), + "$textureSet": re.escape(texture_set), + "$colorSpace": colorspace_match, + "$udim": "([0-9]{4})" + } + + # Turn the templates into regexes + regexes = {} + for template in templates: + + # We need to tweak a temp + search_regex = re.escape(template) + + # Let's assume that any ( and ) character in the file template was + # intended as an optional template key and do a simple `str.replace` + # Note: we are matching against re.escape(template) so will need to + # search for the escaped brackets. + search_regex = search_regex.replace(re.escape("("), "(") + search_regex = search_regex.replace(re.escape(")"), ")?") + + # Substitute each key into a named group + for key, key_expected_regex in key_matches.items(): + + # We want to use the template as a regex basis in the end so will + # escape the whole thing first. Note that thus we'll need to + # search for the escaped versions of the keys too. + escaped_key = re.escape(key) + key_label = key[1:] # key without $ prefix + + key_expected_grp_regex = f"(?P<{key_label}>{key_expected_regex})" + search_regex = search_regex.replace(escaped_key, + key_expected_grp_regex) + + # The filename templates don't include the extension so we add it + # to be able to match the out filename beginning to end + ext_regex = r"(?P\.[A-Za-z][A-Za-z0-9-]*)" + search_regex = rf"^{search_regex}{ext_regex}$" + + regexes[template] = search_regex + + return regexes + + +def strip_template(template, strip="._ "): + """Return static characters in a substance painter filename template. + + >>> strip_template("$textureSet_HELLO(.$udim)") + # HELLO + >>> strip_template("$mesh_$textureSet_HELLO_WORLD_$colorSpace(.$udim)") + # HELLO_WORLD + >>> strip_template("$textureSet_HELLO(.$udim)", strip=None) + # _HELLO + >>> strip_template("$mesh_$textureSet_$colorSpace(.$udim)", strip=None) + # _HELLO_ + >>> strip_template("$textureSet_HELLO(.$udim)") + # _HELLO + + Arguments: + template (str): Filename template to strip. + strip (str, optional): Characters to strip from beginning and end + of the static string in template. Defaults to: `._ `. + + Returns: + str: The static string in filename template. + + """ + # Return only characters that were part of the template that were static. + # Remove all keys + keys = ["$project", "$mesh", "$textureSet", "$udim", "$colorSpace"] + stripped_template = template + for key in keys: + stripped_template = stripped_template.replace(key, "") + + # Everything inside an optional bracket space is excluded since it's not + # static. We keep a counter to track whether we are currently iterating + # over parts of the template that are inside an 'optional' group or not. + counter = 0 + result = "" + for char in stripped_template: + if char == "(": + counter += 1 + elif char == ")": + counter -= 1 + if counter < 0: + counter = 0 + else: + if counter == 0: + result += char + + if strip: + # Strip of any trailing start/end characters. Technically these are + # static but usually start and end separators like space or underscore + # aren't wanted. + result = result.strip(strip) + + return result + + +def get_parsed_export_maps(config): + """Return Export Config's expected output textures with parsed data. + + This tries to parse the texture outputs using a Python API export config. + + Parses template keys: $project, $mesh, $textureSet, $colorSpace, $udim + + Example: + {("DefaultMaterial", ""): { + "$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)": [ + { + // OUTPUT DATA FOR FILE #1 OF THE TEMPLATE + }, + { + // OUTPUT DATA FOR FILE #2 OF THE TEMPLATE + }, + ] + }, + }} + + File output data (all outputs are `str`). + 1) Parsed tokens: These are parsed tokens from the template, they will + only exist if found in the filename template and output filename. + + project: Workfile filename without extension + mesh: Filename of the loaded mesh without extension + textureSet: The texture set, e.g. "DefaultMaterial", + colorSpace: The color space, e.g. "ACES - ACEScg", + udim: The udim tile, e.g. "1001" + + 2) Template output and filepath + + filepath: Full path to the resulting texture map, e.g. + "/path/to/mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", + output: "mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png" + Note: if template had slashes (folders) then `output` will too. + So `output` might include a folder. + + Returns: + dict: [texture_set, stack]: {template: [file1_data, file2_data]} + + """ + # Import is here to avoid recursive lib <-> colorspace imports + from .colorspace import get_project_channel_data + + outputs = substance_painter.export.list_project_textures(config) + templates = get_export_templates(config, strip_folder=False) + + # Get all color spaces set for the current project + project_colorspaces = set( + data["colorSpace"] for data in get_project_channel_data().values() + ) + + # Get current project mesh path and project path to explicitly match + # the $mesh and $project tokens + project_mesh_path = substance_painter.project.last_imported_mesh_path() + project_path = substance_painter.project.file_path() + + # Get the current export path to strip this of the beginning of filepath + # results, since filename templates don't have these we'll match without + # that part of the filename. + export_path = config["exportPath"] + export_path = export_path.replace("\\", "/") + if not export_path.endswith("/"): + export_path += "/" + + # Parse the outputs + result = {} + for key, filepaths in outputs.items(): + texture_set, stack = key + + if stack: + stack_path = f"{texture_set}/{stack}" + else: + stack_path = texture_set + + stack_templates = list(templates[stack_path].keys()) + + template_regex = _templates_to_regex(stack_templates, + texture_set=texture_set, + colorspaces=project_colorspaces, + mesh=project_mesh_path, + project=project_path) + + # Let's precompile the regexes + for template, regex in template_regex.items(): + template_regex[template] = re.compile(regex) + + stack_results = defaultdict(list) + for filepath in sorted(filepaths): + # We strip explicitly using the full parent export path instead of + # using `os.path.basename` because export template is allowed to + # have subfolders in its template which we want to match against + filepath = filepath.replace("\\", "/") + assert filepath.startswith(export_path), ( + f"Filepath {filepath} must start with folder {export_path}" + ) + filename = filepath[len(export_path):] + + for template, regex in template_regex.items(): + match = regex.match(filename) + if match: + parsed = match.groupdict(default={}) + + # Include some special outputs for convenience + parsed["filepath"] = filepath + parsed["output"] = filename + + stack_results[template].append(parsed) + break + else: + raise ValueError(f"Unable to match {filename} against any " + f"template in: {list(template_regex.keys())}") + + result[key] = dict(stack_results) + + return result + + +def load_shelf(path, name=None): + """Add shelf to substance painter (for current application session) + + This will dynamically add a Shelf for the current session. It's good + to note however that these will *not* persist on restart of the host. + + Note: + Consider the loaded shelf a static library of resources. + + The shelf will *not* be visible in application preferences in + Edit > Settings > Libraries. + + The shelf will *not* show in the Assets browser if it has no existing + assets + + The shelf will *not* be a selectable option for selecting it as a + destination to import resources too. + + """ + + # Ensure expanded path with forward slashes + path = os.path.expandvars(path) + path = os.path.abspath(path) + path = path.replace("\\", "/") + + # Path must exist + if not os.path.isdir(path): + raise ValueError(f"Path is not an existing folder: {path}") + + # This name must be unique and must only contain lowercase letters, + # numbers, underscores or hyphens. + if name is None: + name = os.path.basename(path) + + name = name.lower() + name = re.sub(r"[^a-z0-9_\-]", "_", name) # sanitize to underscores + + if substance_painter.resource.Shelves.exists(name): + shelf = next( + shelf for shelf in substance_painter.resource.Shelves.all() + if shelf.name() == name + ) + if os.path.normpath(shelf.path()) != os.path.normpath(path): + raise ValueError(f"Shelf with name '{name}' already exists " + f"for a different path: '{shelf.path()}") + + return + + print(f"Adding Shelf '{name}' to path: {path}") + substance_painter.resource.Shelves.add(name, path) + + return name + + +def _get_new_project_action(): + """Return QAction which triggers Substance Painter's new project dialog""" + + main_window = substance_painter.ui.get_main_window() + + # Find the file menu's New file action + menubar = main_window.menuBar() + new_action = None + for action in menubar.actions(): + menu = action.menu() + if not menu: + continue + + if menu.objectName() != "file": + continue + + # Find the action with the CTRL+N key sequence + new_action = next(action for action in menu.actions() + if action.shortcut() == QtGui.QKeySequence.New) + break + + return new_action + + +def prompt_new_file_with_mesh(mesh_filepath): + """Prompts the user for a new file using Substance Painter's own dialog. + + This will set the mesh path to load to the given mesh and disables the + dialog box to disallow the user to change the path. This way we can allow + user configuration of a project but set the mesh path ourselves. + + Warning: + This is very hacky and experimental. + + Note: + If a project is currently open using the same mesh filepath it can't + accurately detect whether the user had actually accepted the new project + dialog or whether the project afterwards is still the original project, + for example when the user might have cancelled the operation. + + """ + + app = QtWidgets.QApplication.instance() + assert os.path.isfile(mesh_filepath), \ + f"Mesh filepath does not exist: {mesh_filepath}" + + def _setup_file_dialog(): + """Set filepath in QFileDialog and trigger accept result""" + file_dialog = app.activeModalWidget() + assert isinstance(file_dialog, QtWidgets.QFileDialog) + + # Quickly hide the dialog + file_dialog.hide() + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) + + file_dialog.setDirectory(os.path.dirname(mesh_filepath)) + url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) + file_dialog.selectUrl(url) + # TODO: find a way to improve the process event to + # load more complicated mesh + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) + file_dialog.done(file_dialog.Accepted) + app.processEvents(QtCore.QEventLoop.AllEvents) + + def _setup_prompt(): + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents) + dialog = app.activeModalWidget() + assert dialog.objectName() == "NewProjectDialog" + + # Set the window title + mesh = os.path.basename(mesh_filepath) + dialog.setWindowTitle(f"New Project with mesh: {mesh}") + + # Get the select mesh file button + mesh_select = dialog.findChild(QtWidgets.QPushButton, "meshSelect") + + # Hide the select mesh button to the user to block changing of mesh + mesh_select.setVisible(False) + + # Ensure UI is visually up-to-date + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 8000) + + # Trigger the 'select file' dialog to set the path and have the + # new file dialog to use the path. + QtCore.QTimer.singleShot(10, _setup_file_dialog) + mesh_select.click() + + app.processEvents(QtCore.QEventLoop.AllEvents, 5000) + + mesh_filename = dialog.findChild(QtWidgets.QFrame, "meshFileName") + mesh_filename_label = mesh_filename.findChild(QtWidgets.QLabel) + if not mesh_filename_label.text(): + dialog.close() + substance_painter.logging.warning( + "Failed to set mesh path with the prompt dialog:" + f"{mesh_filepath}\n\n" + "Creating new project directly with the mesh path instead.") + + new_action = _get_new_project_action() + if not new_action: + raise RuntimeError("Unable to detect new file action..") + + QtCore.QTimer.singleShot(0, _setup_prompt) + new_action.trigger() + app.processEvents(QtCore.QEventLoop.AllEvents, 5000) + + if not substance_painter.project.is_open(): + return + + # Confirm mesh was set as expected + project_mesh = substance_painter.project.last_imported_mesh_path() + if os.path.normpath(project_mesh) != os.path.normpath(mesh_filepath): + return + + return project_mesh diff --git a/client/ayon_core/hosts/substancepainter/api/pipeline.py b/server_addon/substancepainter/client/substancepainter/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/pipeline.py rename to server_addon/substancepainter/client/substancepainter/api/pipeline.py diff --git a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py new file mode 100644 index 0000000000..8ced463367 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py @@ -0,0 +1,36 @@ + + +def cleanup_openpype_qt_widgets(): + """ + Workaround for Substance failing to shut down correctly + when a Qt window was still open at the time of shutting down. + + This seems to work sometimes, but not all the time. + + """ + # TODO: Create a more reliable method to close down all OpenPype Qt widgets + from PySide2 import QtWidgets + import substance_painter.ui + + # Kill OpenPype Qt widgets + print("Killing OpenPype Qt widgets..") + for widget in QtWidgets.QApplication.topLevelWidgets(): + if widget.__module__.startswith("openpype."): + print(f"Deleting widget: {widget.__class__.__name__}") + substance_painter.ui.delete_ui_element(widget) + + +def start_plugin(): + from ayon_core.pipeline import install_host + from ayon_core.hosts.substancepainter.api import SubstanceHost + install_host(SubstanceHost()) + + +def close_plugin(): + from ayon_core.pipeline import uninstall_host + cleanup_openpype_qt_widgets() + uninstall_host() + + +if __name__ == "__main__": + start_plugin() diff --git a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py new file mode 100644 index 0000000000..04b610b4df --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py @@ -0,0 +1,43 @@ +"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" + +OPENPYPE_PLUGIN_NAME = "openpype_plugin" + + +def start_plugin(): + try: + # This isn't exposed in the official API so we keep it in a try-except + from painter_plugins_ui import ( + get_settings, + LAUNCH_AT_START_KEY, + ON_STATE, + PLUGINS_MENU, + plugin_manager + ) + + # The `painter_plugins_ui` plug-in itself is also a startup plug-in + # we need to take into account that it could run either earlier or + # later than this startup script, we check whether its menu initialized + is_before_plugins_menu = PLUGINS_MENU is None + + settings = get_settings(OPENPYPE_PLUGIN_NAME) + if settings.value(LAUNCH_AT_START_KEY, None) is None: + print("Initializing OpenPype plug-in on first run...") + if is_before_plugins_menu: + print("- running before 'painter_plugins_ui'") + # Delay the launch to the painter_plugins_ui initialization + settings.setValue(LAUNCH_AT_START_KEY, ON_STATE) + else: + # Launch now + print("- running after 'painter_plugins_ui'") + plugin_manager(OPENPYPE_PLUGIN_NAME)(True) + + # Set the checked state in the menu to avoid confusion + action = next(action for action in PLUGINS_MENU._menu.actions() + if action.text() == OPENPYPE_PLUGIN_NAME) + if action is not None: + action.blockSignals(True) + action.setChecked(True) + action.blockSignals(False) + + except Exception as exc: + print(exc) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py new file mode 100644 index 0000000000..f46afadb5a --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +"""Creator plugin for creating textures.""" + +from ayon_core.pipeline import CreatedInstance, Creator, CreatorError +from ayon_core.lib import ( + EnumDef, + UILabelDef, + NumberDef, + BoolDef +) + +from ayon_core.hosts.substancepainter.api.pipeline import ( + get_instances, + set_instance, + set_instances, + remove_instance +) +from ayon_core.hosts.substancepainter.api.lib import get_export_presets + +import substance_painter.project + + +class CreateTextures(Creator): + """Create a texture set.""" + identifier = "io.openpype.creators.substancepainter.textureset" + label = "Textures" + product_type = "textureSet" + icon = "picture-o" + + default_variant = "Main" + + def create(self, product_name, instance_data, pre_create_data): + + if not substance_painter.project.is_open(): + raise CreatorError("Can't create a Texture Set instance without " + "an open project.") + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in [ + "exportPresetUrl", + "exportFileFormat", + "exportSize", + "exportPadding", + "exportDilationDistance" + ]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] + + instance = self.create_instance_in_context(product_name, + instance_data) + set_instance( + instance_id=instance["instance_id"], + instance_data=instance.data_to_store() + ) + + def collect_instances(self): + for instance in get_instances(): + if (instance.get("creator_identifier") == self.identifier or + instance.get("productType") == self.product_type): + self.create_instance_in_context_from_existing(instance) + + def update_instances(self, update_list): + instance_data_by_id = {} + for instance, _changes in update_list: + # Persist the data + instance_id = instance.get("instance_id") + instance_data = instance.data_to_store() + instance_data_by_id[instance_id] = instance_data + set_instances(instance_data_by_id, update=True) + + def remove_instances(self, instances): + for instance in instances: + remove_instance(instance["instance_id"]) + self._remove_instance_from_context(instance) + + # Helper methods (this might get moved into Creator class) + def create_instance_in_context(self, product_name, data): + instance = CreatedInstance( + self.product_type, product_name, data, self + ) + self.create_context.creator_adds_instance(instance) + return instance + + def create_instance_in_context_from_existing(self, data): + instance = CreatedInstance.from_existing(data, self) + self.create_context.creator_adds_instance(instance) + return instance + + def get_instance_attr_defs(self): + + return [ + EnumDef("exportPresetUrl", + items=get_export_presets(), + label="Output Template"), + BoolDef("allowSkippedMaps", + label="Allow Skipped Output Maps", + tooltip="When enabled this allows the publish to ignore " + "output maps in the used output template if one " + "or more maps are skipped due to the required " + "channels not being present in the current file.", + default=True), + EnumDef("exportFileFormat", + items={ + None: "Based on output template", + # TODO: Get available extensions from substance API + "bmp": "bmp", + "ico": "ico", + "jpeg": "jpeg", + "jng": "jng", + "pbm": "pbm", + "pgm": "pgm", + "png": "png", + "ppm": "ppm", + "tga": "targa", + "tif": "tiff", + "wap": "wap", + "wbmp": "wbmp", + "xpm": "xpm", + "gif": "gif", + "hdr": "hdr", + "exr": "exr", + "j2k": "j2k", + "jp2": "jp2", + "pfm": "pfm", + "webp": "webp", + # TODO: Unsure why jxr format fails to export + # "jxr": "jpeg-xr", + # TODO: File formats that combine the exported textures + # like psd are not correctly supported due to + # publishing only a single file + # "psd": "psd", + # "sbsar": "sbsar", + }, + default=None, + label="File type"), + EnumDef("exportSize", + items={ + None: "Based on each Texture Set's size", + # The key is size of the texture file in log2. + # (i.e. 10 means 2^10 = 1024) + 7: "128", + 8: "256", + 9: "512", + 10: "1024", + 11: "2048", + 12: "4096", + 13: "8192" + }, + default=None, + label="Size"), + + EnumDef("exportPadding", + items={ + "passthrough": "No padding (passthrough)", + "infinite": "Dilation infinite", + "transparent": "Dilation + transparent", + "color": "Dilation + default background color", + "diffusion": "Dilation + diffusion" + }, + default="infinite", + label="Padding"), + NumberDef("exportDilationDistance", + minimum=0, + maximum=256, + decimals=0, + default=16, + label="Dilation Distance"), + UILabelDef("*only used with " + "'Dilation + ' padding"), + ] + + def get_pre_create_attr_defs(self): + # Use same attributes as for instance attributes + return self.get_instance_attr_defs() diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py new file mode 100644 index 0000000000..63b1c6c7da --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +"""Creator plugin for creating workfiles.""" + +import ayon_api + +from ayon_core.pipeline import CreatedInstance, AutoCreator + +from ayon_core.hosts.substancepainter.api.pipeline import ( + set_instances, + set_instance, + get_instances +) + +import substance_painter.project + + +class CreateWorkfile(AutoCreator): + """Workfile auto-creator.""" + identifier = "io.openpype.creators.substancepainter.workfile" + label = "Workfile" + product_type = "workfile" + icon = "document" + + default_variant = "Main" + + def create(self): + + if not substance_painter.project.is_open(): + return + + variant = self.default_variant + project_name = self.project_name + folder_path = self.create_context.get_current_folder_path() + task_name = self.create_context.get_current_task_name() + host_name = self.create_context.host_name + + # Workfile instance should always exist and must only exist once. + # As such we'll first check if it already exists and is collected. + current_instance = next( + ( + instance for instance in self.create_context.instances + if instance.creator_identifier == self.identifier + ), None) + + current_folder_path = None + if current_instance is not None: + current_folder_path = current_instance["folderPath"] + + if current_instance is None: + self.log.info("Auto-creating workfile instance...") + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + product_name = self.get_product_name( + project_name, + folder_entity, + task_entity, + variant, + host_name, + ) + data = { + "folderPath": folder_path, + "task": task_name, + "variant": variant + } + current_instance = self.create_instance_in_context(product_name, + data) + elif ( + current_folder_path != folder_path + or current_instance["task"] != task_name + ): + # Update instance context if is not the same + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + product_name = self.get_product_name( + project_name, + folder_entity, + task_entity, + variant, + host_name, + ) + current_instance["folderPath"] = folder_path + current_instance["task"] = task_name + current_instance["productName"] = product_name + + set_instance( + instance_id=current_instance.get("instance_id"), + instance_data=current_instance.data_to_store() + ) + + def collect_instances(self): + for instance in get_instances(): + if (instance.get("creator_identifier") == self.identifier or + instance.get("productType") == self.product_type): + self.create_instance_in_context_from_existing(instance) + + def update_instances(self, update_list): + instance_data_by_id = {} + for instance, _changes in update_list: + # Persist the data + instance_id = instance.get("instance_id") + instance_data = instance.data_to_store() + instance_data_by_id[instance_id] = instance_data + set_instances(instance_data_by_id, update=True) + + # Helper methods (this might get moved into Creator class) + def create_instance_in_context(self, product_name, data): + instance = CreatedInstance( + self.product_type, product_name, data, self + ) + self.create_context.creator_adds_instance(instance) + return instance + + def create_instance_in_context_from_existing(self, data): + instance = CreatedInstance.from_existing(data, self) + self.create_context.creator_adds_instance(instance) + return instance diff --git a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py new file mode 100644 index 0000000000..d5aac1191c --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py @@ -0,0 +1,246 @@ +import copy +from qtpy import QtWidgets, QtCore +from ayon_core.pipeline import ( + load, + get_representation_path, +) +from ayon_core.pipeline.load import LoadError +from ayon_core.hosts.substancepainter.api.pipeline import ( + imprint_container, + set_container_metadata, + remove_container_metadata +) + +import substance_painter.project + + +def _convert(substance_attr): + """Return Substance Painter Python API Project attribute from string. + + This converts a string like "ProjectWorkflow.Default" to for example + the Substance Painter Python API equivalent object, like: + `substance_painter.project.ProjectWorkflow.Default` + + Args: + substance_attr (str): The `substance_painter.project` attribute, + for example "ProjectWorkflow.Default" + + Returns: + Any: Substance Python API object of the project attribute. + + Raises: + ValueError: If attribute does not exist on the + `substance_painter.project` python api. + """ + root = substance_painter.project + for attr in substance_attr.split("."): + root = getattr(root, attr, None) + if root is None: + raise ValueError( + "Substance Painter project attribute" + f" does not exist: {substance_attr}") + + return root + + +def get_template_by_name(name: str, templates: list[dict]) -> dict: + return next( + template for template in templates + if template["name"] == name + ) + + +class SubstanceProjectConfigurationWindow(QtWidgets.QDialog): + """The pop-up dialog allows users to choose material + duplicate options for importing Max objects when updating + or switching assets. + """ + def __init__(self, project_templates): + super(SubstanceProjectConfigurationWindow, self).__init__() + self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) + + self.configuration = None + self.template_names = [template["name"] for template + in project_templates] + self.project_templates = project_templates + + self.widgets = { + "label": QtWidgets.QLabel( + "Select your template for project configuration"), + "template_options": QtWidgets.QComboBox(), + "import_cameras": QtWidgets.QCheckBox("Import Cameras"), + "preserve_strokes": QtWidgets.QCheckBox("Preserve Strokes"), + "clickbox": QtWidgets.QWidget(), + "combobox": QtWidgets.QWidget(), + "buttons": QtWidgets.QDialogButtonBox( + QtWidgets.QDialogButtonBox.Ok + | QtWidgets.QDialogButtonBox.Cancel) + } + + self.widgets["template_options"].addItems(self.template_names) + + template_name = self.widgets["template_options"].currentText() + self._update_to_match_template(template_name) + # Build clickboxes + layout = QtWidgets.QHBoxLayout(self.widgets["clickbox"]) + layout.addWidget(self.widgets["import_cameras"]) + layout.addWidget(self.widgets["preserve_strokes"]) + # Build combobox + layout = QtWidgets.QHBoxLayout(self.widgets["combobox"]) + layout.addWidget(self.widgets["template_options"]) + # Build buttons + layout = QtWidgets.QHBoxLayout(self.widgets["buttons"]) + # Build layout. + layout = QtWidgets.QVBoxLayout(self) + layout.addWidget(self.widgets["label"]) + layout.addWidget(self.widgets["combobox"]) + layout.addWidget(self.widgets["clickbox"]) + layout.addWidget(self.widgets["buttons"]) + + self.widgets["template_options"].currentTextChanged.connect( + self._update_to_match_template) + self.widgets["buttons"].accepted.connect(self.on_accept) + self.widgets["buttons"].rejected.connect(self.on_reject) + + def on_accept(self): + self.configuration = self.get_project_configuration() + self.close() + + def on_reject(self): + self.close() + + def _update_to_match_template(self, template_name): + template = get_template_by_name(template_name, self.project_templates) + self.widgets["import_cameras"].setChecked(template["import_cameras"]) + self.widgets["preserve_strokes"].setChecked( + template["preserve_strokes"]) + + def get_project_configuration(self): + templates = self.project_templates + template_name = self.widgets["template_options"].currentText() + template = get_template_by_name(template_name, templates) + template = copy.deepcopy(template) # do not edit the original + template["import_cameras"] = self.widgets["import_cameras"].isChecked() + template["preserve_strokes"] = ( + self.widgets["preserve_strokes"].isChecked() + ) + for key in ["normal_map_format", + "project_workflow", + "tangent_space_mode"]: + template[key] = _convert(template[key]) + return template + + @classmethod + def prompt(cls, templates): + dialog = cls(templates) + dialog.exec_() + configuration = dialog.configuration + dialog.deleteLater() + return configuration + + +class SubstanceLoadProjectMesh(load.LoaderPlugin): + """Load mesh for project""" + + product_types = {"*"} + representations = {"abc", "fbx", "obj", "gltf", "usd", "usda", "usdc"} + + label = "Load mesh" + order = -10 + icon = "code-fork" + color = "orange" + + # Defined via settings + project_templates = [] + + def load(self, context, name, namespace, options=None): + + # Get user inputs + result = SubstanceProjectConfigurationWindow.prompt( + self.project_templates) + if not result: + # cancelling loader action + return + if not substance_painter.project.is_open(): + # Allow to 'initialize' a new project + path = self.filepath_from_context(context) + sp_settings = substance_painter.project.Settings( + import_cameras=result["import_cameras"], + normal_map_format=result["normal_map_format"], + project_workflow=result["project_workflow"], + tangent_space_mode=result["tangent_space_mode"], + default_texture_resolution=result["default_texture_resolution"] + ) + settings = substance_painter.project.create( + mesh_file_path=path, settings=sp_settings + ) + else: + # Reload the mesh + settings = substance_painter.project.MeshReloadingSettings( + import_cameras=result["import_cameras"], + preserve_strokes=result["preserve_strokes"]) + + def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): # noqa + if status == substance_painter.project.ReloadMeshStatus.SUCCESS: # noqa + self.log.info("Reload succeeded") + else: + raise LoadError("Reload of mesh failed") + + path = self.filepath_from_context(context) + substance_painter.project.reload_mesh(path, + settings, + on_mesh_reload) + + # Store container + container = {} + project_mesh_object_name = "_ProjectMesh_" + imprint_container(container, + name=project_mesh_object_name, + namespace=project_mesh_object_name, + context=context, + loader=self) + + # We want store some options for updating to keep consistent behavior + # from the user's original choice. We don't store 'preserve_strokes' + # as we always preserve strokes on updates. + container["options"] = { + "import_cameras": result["import_cameras"], + } + + set_container_metadata(project_mesh_object_name, container) + + def switch(self, container, context): + self.update(container, context) + + def update(self, container, context): + repre_entity = context["representation"] + + path = get_representation_path(repre_entity) + + # Reload the mesh + container_options = container.get("options", {}) + settings = substance_painter.project.MeshReloadingSettings( + import_cameras=container_options.get("import_cameras", True), + preserve_strokes=True + ) + + def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): + if status == substance_painter.project.ReloadMeshStatus.SUCCESS: + self.log.info("Reload succeeded") + else: + raise LoadError("Reload of mesh failed") + + substance_painter.project.reload_mesh(path, settings, on_mesh_reload) + + # Update container representation + object_name = container["objectName"] + update_data = {"representation": repre_entity["id"]} + set_container_metadata(object_name, update_data, update=True) + + def remove(self, container): + + # Remove OpenPype related settings about what model was loaded + # or close the project? + # TODO: This is likely best 'hidden' away to the user because + # this will leave the project's mesh unmanaged. + remove_container_metadata(container["objectName"]) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py new file mode 100644 index 0000000000..db0edafac0 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py @@ -0,0 +1,17 @@ +import pyblish.api + +from ayon_core.pipeline import registered_host + + +class CollectCurrentFile(pyblish.api.ContextPlugin): + """Inject the current working file into context""" + + order = pyblish.api.CollectorOrder - 0.49 + label = "Current Workfile" + hosts = ["substancepainter"] + + def process(self, context): + host = registered_host() + path = host.get_current_workfile() + context.data["currentFile"] = path + self.log.debug(f"Current workfile: {path}") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py new file mode 100644 index 0000000000..20aaa56993 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py @@ -0,0 +1,211 @@ +import os +import copy + +import pyblish.api +import ayon_api + +import substance_painter.textureset +from ayon_core.pipeline import publish +from ayon_core.hosts.substancepainter.api.lib import ( + get_parsed_export_maps, + strip_template +) +from ayon_core.pipeline.create import get_product_name + + +class CollectTextureSet(pyblish.api.InstancePlugin): + """Extract Textures using an output template config""" + # TODO: Production-test usage of color spaces + # TODO: Detect what source data channels end up in each file + + label = "Collect Texture Set images" + hosts = ["substancepainter"] + families = ["textureSet"] + order = pyblish.api.CollectorOrder + + def process(self, instance): + + config = self.get_export_config(instance) + project_name = instance.context.data["projectName"] + folder_entity = ayon_api.get_folder_by_path( + project_name, + instance.data["folderPath"] + ) + task_name = instance.data.get("task") + task_entity = None + if folder_entity and task_name: + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + + instance.data["exportConfig"] = config + maps = get_parsed_export_maps(config) + + # Let's break the instance into multiple instances to integrate + # a product per generated texture or texture UDIM sequence + for (texture_set_name, stack_name), template_maps in maps.items(): + self.log.info(f"Processing {texture_set_name}/{stack_name}") + for template, outputs in template_maps.items(): + self.log.info(f"Processing {template}") + self.create_image_instance(instance, template, outputs, + task_entity=task_entity, + texture_set_name=texture_set_name, + stack_name=stack_name) + + def create_image_instance(self, instance, template, outputs, + task_entity, texture_set_name, stack_name): + """Create a new instance per image or UDIM sequence. + + The new instances will be of product type `image`. + + """ + + context = instance.context + first_filepath = outputs[0]["filepath"] + fnames = [os.path.basename(output["filepath"]) for output in outputs] + ext = os.path.splitext(first_filepath)[1] + assert ext.lstrip("."), f"No extension: {ext}" + + always_include_texture_set_name = False # todo: make this configurable + all_texture_sets = substance_painter.textureset.all_texture_sets() + texture_set = substance_painter.textureset.TextureSet.from_name( + texture_set_name + ) + + # Define the suffix we want to give this particular texture + # set and set up a remapped product naming for it. + suffix = "" + if always_include_texture_set_name or len(all_texture_sets) > 1: + # More than one texture set, include texture set name + suffix += f".{texture_set_name}" + if texture_set.is_layered_material() and stack_name: + # More than one stack, include stack name + suffix += f".{stack_name}" + + # Always include the map identifier + map_identifier = strip_template(template) + suffix += f".{map_identifier}" + + task_name = task_type = None + if task_entity: + task_name = task_entity["name"] + task_type = task_entity["taskType"] + + image_product_name = get_product_name( + # TODO: The product type actually isn't 'texture' currently but + # for now this is only done so the product name starts with + # 'texture' + context.data["projectName"], + task_name, + task_type, + context.data["hostName"], + product_type="texture", + variant=instance.data["variant"] + suffix, + project_settings=context.data["project_settings"] + ) + + # Prepare representation + representation = { + "name": ext.lstrip("."), + "ext": ext.lstrip("."), + "files": fnames if len(fnames) > 1 else fnames[0], + } + + # Mark as UDIM explicitly if it has UDIM tiles. + if bool(outputs[0].get("udim")): + # The representation for a UDIM sequence should have a `udim` key + # that is a list of all udim tiles (str) like: ["1001", "1002"] + # strings. See CollectTextures plug-in and Integrators. + representation["udim"] = [output["udim"] for output in outputs] + + # Set up the representation for thumbnail generation + # TODO: Simplify this once thumbnail extraction is refactored + staging_dir = os.path.dirname(first_filepath) + representation["tags"] = ["review"] + representation["stagingDir"] = staging_dir + + # Clone the instance + product_type = "image" + image_instance = context.create_instance(image_product_name) + image_instance[:] = instance[:] + image_instance.data.update(copy.deepcopy(dict(instance.data))) + image_instance.data["name"] = image_product_name + image_instance.data["label"] = image_product_name + image_instance.data["productName"] = image_product_name + image_instance.data["productType"] = product_type + image_instance.data["family"] = product_type + image_instance.data["families"] = [product_type, "textures"] + image_instance.data["representations"] = [representation] + + # Group the textures together in the loader + image_instance.data["productGroup"] = image_product_name + + # Store the texture set name and stack name on the instance + image_instance.data["textureSetName"] = texture_set_name + image_instance.data["textureStackName"] = stack_name + + # Store color space with the instance + # Note: The extractor will assign it to the representation + colorspace = outputs[0].get("colorSpace") + if colorspace: + self.log.debug(f"{image_product_name} colorspace: {colorspace}") + image_instance.data["colorspace"] = colorspace + + # Store the instance in the original instance as a member + instance.append(image_instance) + + def get_export_config(self, instance): + """Return an export configuration dict for texture exports. + + This config can be supplied to: + - `substance_painter.export.export_project_textures` + - `substance_painter.export.list_project_textures` + + See documentation on substance_painter.export module about the + formatting of the configuration dictionary. + + Args: + instance (pyblish.api.Instance): Texture Set instance to be + published. + + Returns: + dict: Export config + + """ + + creator_attrs = instance.data["creator_attributes"] + preset_url = creator_attrs["exportPresetUrl"] + self.log.debug(f"Exporting using preset: {preset_url}") + + # See: https://substance3d.adobe.com/documentation/ptpy/api/substance_painter/export # noqa + config = { # noqa + "exportShaderParams": True, + "exportPath": publish.get_instance_staging_dir(instance), + "defaultExportPreset": preset_url, + + # Custom overrides to the exporter + "exportParameters": [ + { + "parameters": { + "fileFormat": creator_attrs["exportFileFormat"], + "sizeLog2": creator_attrs["exportSize"], + "paddingAlgorithm": creator_attrs["exportPadding"], + "dilationDistance": creator_attrs["exportDilationDistance"] # noqa + } + } + ] + } + + # Create the list of Texture Sets to export. + config["exportList"] = [] + for texture_set in substance_painter.textureset.all_texture_sets(): + config["exportList"].append({"rootPath": texture_set.name()}) + + # Consider None values from the creator attributes optionals + for override in config["exportParameters"]: + parameters = override.get("parameters") + for key, value in dict(parameters).items(): + if value is None: + parameters.pop(key) + + return config diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py new file mode 100644 index 0000000000..8d98d0b014 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py @@ -0,0 +1,26 @@ +import os +import pyblish.api + + +class CollectWorkfileRepresentation(pyblish.api.InstancePlugin): + """Create a publish representation for the current workfile instance.""" + + order = pyblish.api.CollectorOrder + label = "Workfile representation" + hosts = ["substancepainter"] + families = ["workfile"] + + def process(self, instance): + + context = instance.context + current_file = context.data["currentFile"] + + folder, file = os.path.split(current_file) + filename, ext = os.path.splitext(file) + + instance.data["representations"] = [{ + "name": ext.lstrip("."), + "ext": ext.lstrip("."), + "files": file, + "stagingDir": folder, + }] diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py new file mode 100644 index 0000000000..0fa7b52f45 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py @@ -0,0 +1,62 @@ +import substance_painter.export + +from ayon_core.pipeline import KnownPublishError, publish + + +class ExtractTextures(publish.Extractor, + publish.ColormanagedPyblishPluginMixin): + """Extract Textures using an output template config. + + Note: + This Extractor assumes that `collect_textureset_images` has prepared + the relevant export config and has also collected the individual image + instances for publishing including its representation. That is why this + particular Extractor doesn't specify representations to integrate. + + """ + + label = "Extract Texture Set" + hosts = ["substancepainter"] + families = ["textureSet"] + + # Run before thumbnail extractors + order = publish.Extractor.order - 0.1 + + def process(self, instance): + + config = instance.data["exportConfig"] + result = substance_painter.export.export_project_textures(config) + + if result.status != substance_painter.export.ExportStatus.Success: + raise KnownPublishError( + "Failed to export texture set: {}".format(result.message) + ) + + # Log what files we generated + for (texture_set_name, stack_name), maps in result.textures.items(): + # Log our texture outputs + self.log.info(f"Exported stack: {texture_set_name} {stack_name}") + for texture_map in maps: + self.log.info(f"Exported texture: {texture_map}") + + # We'll insert the color space data for each image instance that we + # added into this texture set. The collector couldn't do so because + # some anatomy and other instance data needs to be collected prior + context = instance.context + for image_instance in instance: + representation = next(iter(image_instance.data["representations"])) + + colorspace = image_instance.data.get("colorspace") + if not colorspace: + self.log.debug("No color space data present for instance: " + f"{image_instance}") + continue + + self.set_representation_colorspace(representation, + context=context, + colorspace=colorspace) + + # The TextureSet instance should not be integrated. It generates no + # output data. Instead the separated texture instances are generated + # from it which themselves integrate into the database. + instance.data["integrate"] = False diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py new file mode 100644 index 0000000000..521a28130b --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py @@ -0,0 +1,23 @@ +import pyblish.api + +from ayon_core.lib import version_up +from ayon_core.pipeline import registered_host + + +class IncrementWorkfileVersion(pyblish.api.ContextPlugin): + """Increment current workfile version.""" + + order = pyblish.api.IntegratorOrder + 1 + label = "Increment Workfile Version" + optional = True + hosts = ["substancepainter"] + + def process(self, context): + + assert all(result["success"] for result in context.data["results"]), ( + "Publishing not successful so version is not increased.") + + host = registered_host() + path = context.data["currentFile"] + self.log.info(f"Incrementing current workfile to: {path}") + host.save_workfile(version_up(path)) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py new file mode 100644 index 0000000000..627fb991aa --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py @@ -0,0 +1,28 @@ +import pyblish.api + +from ayon_core.pipeline import ( + registered_host, + KnownPublishError +) + + +class SaveCurrentWorkfile(pyblish.api.ContextPlugin): + """Save current workfile""" + + label = "Save current workfile" + order = pyblish.api.ExtractorOrder - 0.49 + hosts = ["substancepainter"] + + def process(self, context): + + host = registered_host() + current = host.get_current_workfile() + if context.data["currentFile"] != current: + raise KnownPublishError("Workfile has changed during publishing!") + + if host.workfile_has_unsaved_changes(): + self.log.info("Saving current file: {}".format(current)) + host.save_workfile() + else: + self.log.debug("Skipping workfile save because there are no " + "unsaved changes.") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py new file mode 100644 index 0000000000..720771994c --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py @@ -0,0 +1,110 @@ +import copy +import os + +import pyblish.api + +import substance_painter.export + +from ayon_core.pipeline import PublishValidationError + + +class ValidateOutputMaps(pyblish.api.InstancePlugin): + """Validate all output maps for Output Template are generated. + + Output maps will be skipped by Substance Painter if it is an output + map in the Substance Output Template which uses channels that the current + substance painter project has not painted or generated. + + """ + + order = pyblish.api.ValidatorOrder + label = "Validate output maps" + hosts = ["substancepainter"] + families = ["textureSet"] + + def process(self, instance): + + config = instance.data["exportConfig"] + + # Substance Painter API does not allow to query the actual output maps + # it will generate without actually exporting the files. So we try to + # generate the smallest size / fastest export as possible + config = copy.deepcopy(config) + parameters = config["exportParameters"][0]["parameters"] + parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) + parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) + parameters["dithering"] = False # no dithering (faster) + + result = substance_painter.export.export_project_textures(config) + if result.status != substance_painter.export.ExportStatus.Success: + raise PublishValidationError( + "Failed to export texture set: {}".format(result.message) + ) + + generated_files = set() + for texture_maps in result.textures.values(): + for texture_map in texture_maps: + generated_files.add(os.path.normpath(texture_map)) + # Directly clean up our temporary export + os.remove(texture_map) + + creator_attributes = instance.data.get("creator_attributes", {}) + allow_skipped_maps = creator_attributes.get("allowSkippedMaps", True) + error_report_missing = [] + for image_instance in instance: + + # Confirm whether the instance has its expected files generated. + # We assume there's just one representation and that it is + # the actual texture representation from the collector. + representation = next(iter(image_instance.data["representations"])) + staging_dir = representation["stagingDir"] + filenames = representation["files"] + if not isinstance(filenames, (list, tuple)): + # Convert single file to list + filenames = [filenames] + + missing = [] + for filename in filenames: + filepath = os.path.join(staging_dir, filename) + filepath = os.path.normpath(filepath) + if filepath not in generated_files: + self.log.warning(f"Missing texture: {filepath}") + missing.append(filepath) + + if not missing: + continue + + if allow_skipped_maps: + # TODO: This is changing state on the instance's which + # should not be done during validation. + self.log.warning(f"Disabling texture instance: " + f"{image_instance}") + image_instance.data["active"] = False + image_instance.data["publish"] = False + image_instance.data["integrate"] = False + representation.setdefault("tags", []).append("delete") + continue + else: + error_report_missing.append((image_instance, missing)) + + if error_report_missing: + + message = ( + "The Texture Set skipped exporting some output maps which are " + "defined in the Output Template. This happens if the Output " + "Templates exports maps from channels which you do not " + "have in your current Substance Painter project.\n\n" + "To allow this enable the *Allow Skipped Output Maps* setting " + "on the instance.\n\n" + f"Instance {instance} skipped exporting output maps:\n" + "" + ) + + for image_instance, missing in error_report_missing: + missing_str = ", ".join(missing) + message += f"- **{image_instance}** skipped: {missing_str}\n" + + raise PublishValidationError( + message=message, + title="Missing output maps" + ) From c9d1998cab20f7b49798d27f7c2ff830fd92a71c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 16:06:38 +0800 Subject: [PATCH 182/469] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../client/substancepainter/__init__.py | 10 - .../client/substancepainter/addon.py | 31 - .../client/substancepainter/api/__init__.py | 8 - .../client/substancepainter/api/colorspace.py | 157 ----- .../client/substancepainter/api/lib.py | 642 ------------------ .../client/substancepainter/api/pipeline.py | 425 ------------ .../deploy/plugins/openpype_plugin.py | 36 - .../startup/openpype_load_on_first_run.py | 43 -- .../plugins/create/create_textures.py | 175 ----- .../plugins/create/create_workfile.py | 124 ---- .../plugins/load/load_mesh.py | 246 ------- .../plugins/publish/collect_current_file.py | 17 - .../publish/collect_textureset_images.py | 211 ------ .../collect_workfile_representation.py | 26 - .../plugins/publish/extract_textures.py | 62 -- .../plugins/publish/increment_workfile.py | 23 - .../plugins/publish/save_workfile.py | 28 - .../plugins/publish/validate_ouput_maps.py | 110 --- server_addon/substancepainter/package.py | 9 +- 19 files changed, 8 insertions(+), 2375 deletions(-) delete mode 100644 server_addon/substancepainter/client/substancepainter/__init__.py delete mode 100644 server_addon/substancepainter/client/substancepainter/addon.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/__init__.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/colorspace.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/lib.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/pipeline.py delete mode 100644 server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py delete mode 100644 server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/server_addon/substancepainter/client/substancepainter/__init__.py b/server_addon/substancepainter/client/substancepainter/__init__.py deleted file mode 100644 index 4c33b9f507..0000000000 --- a/server_addon/substancepainter/client/substancepainter/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .addon import ( - SubstanceAddon, - SUBSTANCE_HOST_DIR, -) - - -__all__ = ( - "SubstanceAddon", - "SUBSTANCE_HOST_DIR" -) diff --git a/server_addon/substancepainter/client/substancepainter/addon.py b/server_addon/substancepainter/client/substancepainter/addon.py deleted file mode 100644 index 26829d3153..0000000000 --- a/server_addon/substancepainter/client/substancepainter/addon.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -SUBSTANCE_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) - - -class SubstanceAddon(AYONAddon, IHostAddon): - name = "substancepainter" - host_name = "substancepainter" - - def add_implementation_envs(self, env, _app): - # Add requirements to SUBSTANCE_PAINTER_PLUGINS_PATH - plugin_path = os.path.join(SUBSTANCE_HOST_DIR, "deploy") - plugin_path = plugin_path.replace("\\", "/") - if env.get("SUBSTANCE_PAINTER_PLUGINS_PATH"): - plugin_path += os.pathsep + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] - - env["SUBSTANCE_PAINTER_PLUGINS_PATH"] = plugin_path - - # Log in Substance Painter doesn't support custom terminal colors - env["AYON_LOG_NO_COLORS"] = "1" - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(SUBSTANCE_HOST_DIR, "hooks") - ] - - def get_workfile_extensions(self): - return [".spp", ".toc"] diff --git a/server_addon/substancepainter/client/substancepainter/api/__init__.py b/server_addon/substancepainter/client/substancepainter/api/__init__.py deleted file mode 100644 index 937d0c429e..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from .pipeline import ( - SubstanceHost, - -) - -__all__ = [ - "SubstanceHost", -] diff --git a/server_addon/substancepainter/client/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/substancepainter/api/colorspace.py deleted file mode 100644 index 375b61b39b..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/colorspace.py +++ /dev/null @@ -1,157 +0,0 @@ -"""Substance Painter OCIO management - -Adobe Substance 3D Painter supports OCIO color management using a per project -configuration. Output color spaces are defined at the project level - -More information see: - - https://substance3d.adobe.com/documentation/spdoc/color-management-223053233.html # noqa - - https://substance3d.adobe.com/documentation/spdoc/color-management-with-opencolorio-225969419.html # noqa - -""" -import substance_painter.export -import substance_painter.js -import json - -from .lib import ( - get_document_structure, - get_channel_format -) - - -def _iter_document_stack_channels(): - """Yield all stack paths and channels project""" - - for material in get_document_structure()["materials"]: - material_name = material["name"] - for stack in material["stacks"]: - stack_name = stack["name"] - if stack_name: - stack_path = [material_name, stack_name] - else: - stack_path = material_name - for channel in stack["channels"]: - yield stack_path, channel - - -def _get_first_color_and_data_stack_and_channel(): - """Return first found color channel and data channel.""" - color_channel = None - data_channel = None - for stack_path, channel in _iter_document_stack_channels(): - channel_format = get_channel_format(stack_path, channel) - if channel_format["color"]: - color_channel = (stack_path, channel) - else: - data_channel = (stack_path, channel) - - if color_channel and data_channel: - return color_channel, data_channel - - return color_channel, data_channel - - -def get_project_channel_data(): - """Return colorSpace settings for the current substance painter project. - - In Substance Painter only color channels have Color Management enabled - whereas data channels have no color management applied. This can't be - changed. The artist can only customize the export color space for color - channels per bit-depth for 8 bpc, 16 bpc and 32 bpc. - - As such this returns the color space for 'data' and for per bit-depth - for color channels. - - Example output: - { - "data": {'colorSpace': 'Utility - Raw'}, - "8": {"colorSpace": "ACES - AcesCG"}, - "16": {"colorSpace": "ACES - AcesCG"}, - "16f": {"colorSpace": "ACES - AcesCG"}, - "32f": {"colorSpace": "ACES - AcesCG"} - } - - """ - - keys = ["colorSpace"] - query = {key: f"${key}" for key in keys} - - config = { - "exportPath": "/", - "exportShaderParams": False, - "defaultExportPreset": "query_preset", - - "exportPresets": [{ - "name": "query_preset", - - # List of maps making up this export preset. - "maps": [{ - "fileName": json.dumps(query), - # List of source/destination defining which channels will - # make up the texture file. - "channels": [], - "parameters": { - "fileFormat": "exr", - "bitDepth": "32f", - "dithering": False, - "sizeLog2": 4, - "paddingAlgorithm": "passthrough", - "dilationDistance": 16 - } - }] - }], - } - - def _get_query_output(config): - # Return the basename of the single output path we defined - result = substance_painter.export.list_project_textures(config) - path = next(iter(result.values()))[0] - # strip extension and slash since we know relevant json data starts - # and ends with { and } characters - path = path.strip("/\\.exr") - return json.loads(path) - - # Query for each type of channel (color and data) - color_channel, data_channel = _get_first_color_and_data_stack_and_channel() - colorspaces = {} - for key, channel_data in { - "data": data_channel, - "color": color_channel - }.items(): - if channel_data is None: - # No channel of that datatype anywhere in the Stack. We're - # unable to identify the output color space of the project - colorspaces[key] = None - continue - - stack, channel = channel_data - - # Stack must be a string - if not isinstance(stack, str): - # Assume iterable - stack = "/".join(stack) - - # Define the temp output config - config["exportList"] = [{"rootPath": stack}] - config_map = config["exportPresets"][0]["maps"][0] - config_map["channels"] = [ - { - "destChannel": x, - "srcChannel": x, - "srcMapType": "documentMap", - "srcMapName": channel - } for x in "RGB" - ] - - if key == "color": - # Query for each bit depth - # Color space definition can have a different OCIO config set - # for 8-bit, 16-bit and 32-bit outputs so we need to check each - # bit depth - for depth in ["8", "16", "16f", "32f"]: - config_map["parameters"]["bitDepth"] = depth # noqa - colorspaces[key + depth] = _get_query_output(config) - else: - # Data channel (not color managed) - colorspaces[key] = _get_query_output(config) - - return colorspaces diff --git a/server_addon/substancepainter/client/substancepainter/api/lib.py b/server_addon/substancepainter/client/substancepainter/api/lib.py deleted file mode 100644 index 64c39943ce..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/lib.py +++ /dev/null @@ -1,642 +0,0 @@ -import os -import re -import json -from collections import defaultdict - -import substance_painter.project -import substance_painter.resource -import substance_painter.js -import substance_painter.export - -from qtpy import QtGui, QtWidgets, QtCore - - -def get_export_presets(): - """Return Export Preset resource URLs for all available Export Presets. - - Returns: - dict: {Resource url: GUI Label} - - """ - # TODO: Find more optimal way to find all export templates - - preset_resources = {} - for shelf in substance_painter.resource.Shelves.all(): - shelf_path = os.path.normpath(shelf.path()) - - presets_path = os.path.join(shelf_path, "export-presets") - if not os.path.exists(presets_path): - continue - - for filename in os.listdir(presets_path): - if filename.endswith(".spexp"): - template_name = os.path.splitext(filename)[0] - - resource = substance_painter.resource.ResourceID( - context=shelf.name(), - name=template_name - ) - resource_url = resource.url() - - preset_resources[resource_url] = template_name - - # Sort by template name - export_templates = dict(sorted(preset_resources.items(), - key=lambda x: x[1])) - - # Add default built-ins at the start - # TODO: find the built-ins automatically; scraped with https://gist.github.com/BigRoy/97150c7c6f0a0c916418207b9a2bc8f1 # noqa - result = { - "export-preset-generator://viewport2d": "2D View", # noqa - "export-preset-generator://doc-channel-normal-no-alpha": "Document channels + Normal + AO (No Alpha)", # noqa - "export-preset-generator://doc-channel-normal-with-alpha": "Document channels + Normal + AO (With Alpha)", # noqa - "export-preset-generator://sketchfab": "Sketchfab", # noqa - "export-preset-generator://adobe-standard-material": "Substance 3D Stager", # noqa - "export-preset-generator://usd": "USD PBR Metal Roughness", # noqa - "export-preset-generator://gltf": "glTF PBR Metal Roughness", # noqa - "export-preset-generator://gltf-displacement": "glTF PBR Metal Roughness + Displacement texture (experimental)" # noqa - } - result.update(export_templates) - return result - - -def _convert_stack_path_to_cmd_str(stack_path): - """Convert stack path `str` or `[str, str]` for javascript query - - Example usage: - >>> stack_path = _convert_stack_path_to_cmd_str(stack_path) - >>> cmd = f"alg.mapexport.channelIdentifiers({stack_path})" - >>> substance_painter.js.evaluate(cmd) - - Args: - stack_path (list or str): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - - Returns: - str: Stack path usable as argument in javascript query. - - """ - return json.dumps(stack_path) - - -def get_channel_identifiers(stack_path=None): - """Return the list of channel identifiers. - - If a context is passed (texture set/stack), - return only used channels with resolved user channels. - - Channel identifiers are: - basecolor, height, specular, opacity, emissive, displacement, - glossiness, roughness, anisotropylevel, anisotropyangle, transmissive, - scattering, reflection, ior, metallic, normal, ambientOcclusion, - diffuse, specularlevel, blendingmask, [custom user names]. - - Args: - stack_path (list or str, Optional): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - - Returns: - list: List of channel identifiers. - - """ - if stack_path is None: - stack_path = "" - else: - stack_path = _convert_stack_path_to_cmd_str(stack_path) - cmd = f"alg.mapexport.channelIdentifiers({stack_path})" - return substance_painter.js.evaluate(cmd) - - -def get_channel_format(stack_path, channel): - """Retrieve the channel format of a specific stack channel. - - See `alg.mapexport.channelFormat` (javascript API) for more details. - - The channel format data is: - "label" (str): The channel format label: could be one of - [sRGB8, L8, RGB8, L16, RGB16, L16F, RGB16F, L32F, RGB32F] - "color" (bool): True if the format is in color, False is grayscale - "floating" (bool): True if the format uses floating point - representation, false otherwise - "bitDepth" (int): Bit per color channel (could be 8, 16 or 32 bpc) - - Arguments: - stack_path (list or str): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - channel (str): Identifier of the channel to export - (see `get_channel_identifiers`) - - Returns: - dict: The channel format data. - - """ - stack_path = _convert_stack_path_to_cmd_str(stack_path) - cmd = f"alg.mapexport.channelFormat({stack_path}, '{channel}')" - return substance_painter.js.evaluate(cmd) - - -def get_document_structure(): - """Dump the document structure. - - See `alg.mapexport.documentStructure` (javascript API) for more details. - - Returns: - dict: Document structure or None when no project is open - - """ - return substance_painter.js.evaluate("alg.mapexport.documentStructure()") - - -def get_export_templates(config, format="png", strip_folder=True): - """Return export config outputs. - - This use the Javascript API `alg.mapexport.getPathsExportDocumentMaps` - which returns a different output than using the Python equivalent - `substance_painter.export.list_project_textures(config)`. - - The nice thing about the Javascript API version is that it returns the - output textures grouped by filename template. - - A downside is that it doesn't return all the UDIM tiles but per template - always returns a single file. - - Note: - The file format needs to be explicitly passed to the Javascript API - but upon exporting through the Python API the file format can be based - on the output preset. So it's likely the file extension will mismatch - - Warning: - Even though the function appears to solely get the expected outputs - the Javascript API will actually create the config's texture output - folder if it does not exist yet. As such, a valid path must be set. - - Example output: - { - "DefaultMaterial": { - "$textureSet_BaseColor(_$colorSpace)(.$udim)": "DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", # noqa - "$textureSet_Emissive(_$colorSpace)(.$udim)": "DefaultMaterial_Emissive_ACES - ACEScg.1002.png", # noqa - "$textureSet_Height(_$colorSpace)(.$udim)": "DefaultMaterial_Height_Utility - Raw.1002.png", # noqa - "$textureSet_Metallic(_$colorSpace)(.$udim)": "DefaultMaterial_Metallic_Utility - Raw.1002.png", # noqa - "$textureSet_Normal(_$colorSpace)(.$udim)": "DefaultMaterial_Normal_Utility - Raw.1002.png", # noqa - "$textureSet_Roughness(_$colorSpace)(.$udim)": "DefaultMaterial_Roughness_Utility - Raw.1002.png" # noqa - } - } - - Arguments: - config (dict) Export config - format (str, Optional): Output format to write to, defaults to 'png' - strip_folder (bool, Optional): Whether to strip the output folder - from the output filenames. - - Returns: - dict: The expected output maps. - - """ - folder = config["exportPath"].replace("\\", "/") - preset = config["defaultExportPreset"] - cmd = f'alg.mapexport.getPathsExportDocumentMaps("{preset}", "{folder}", "{format}")' # noqa - result = substance_painter.js.evaluate(cmd) - - if strip_folder: - for _stack, maps in result.items(): - for map_template, map_filepath in maps.items(): - map_filepath = map_filepath.replace("\\", "/") - assert map_filepath.startswith(folder) - map_filename = map_filepath[len(folder):].lstrip("/") - maps[map_template] = map_filename - - return result - - -def _templates_to_regex(templates, - texture_set, - colorspaces, - project, - mesh): - """Return regex based on a Substance Painter expot filename template. - - This converts Substance Painter export filename templates like - `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` into a regex - which can be used to query an output filename to help retrieve: - - - Which template filename the file belongs to. - - Which color space the file is written with. - - Which udim tile it is exactly. - - This is used by `get_parsed_export_maps` which tries to as explicitly - as possible match the filename pattern against the known possible outputs. - That's why Texture Set name, Color spaces, Project path and mesh path must - be provided. By doing so we get the best shot at correctly matching the - right template because otherwise $texture_set could basically be any string - and thus match even that of a color space or mesh. - - Arguments: - templates (list): List of templates to convert to regex. - texture_set (str): The texture set to match against. - colorspaces (list): The colorspaces defined in the current project. - project (str): Filepath of current substance project. - mesh (str): Path to mesh file used in current project. - - Returns: - dict: Template: Template regex pattern - - """ - def _filename_no_ext(path): - return os.path.splitext(os.path.basename(path))[0] - - if colorspaces and any(colorspaces): - colorspace_match = "|".join(re.escape(c) for c in set(colorspaces)) - colorspace_match = f"({colorspace_match})" - else: - # No colorspace support enabled - colorspace_match = "" - - # Key to regex valid search values - key_matches = { - "$project": re.escape(_filename_no_ext(project)), - "$mesh": re.escape(_filename_no_ext(mesh)), - "$textureSet": re.escape(texture_set), - "$colorSpace": colorspace_match, - "$udim": "([0-9]{4})" - } - - # Turn the templates into regexes - regexes = {} - for template in templates: - - # We need to tweak a temp - search_regex = re.escape(template) - - # Let's assume that any ( and ) character in the file template was - # intended as an optional template key and do a simple `str.replace` - # Note: we are matching against re.escape(template) so will need to - # search for the escaped brackets. - search_regex = search_regex.replace(re.escape("("), "(") - search_regex = search_regex.replace(re.escape(")"), ")?") - - # Substitute each key into a named group - for key, key_expected_regex in key_matches.items(): - - # We want to use the template as a regex basis in the end so will - # escape the whole thing first. Note that thus we'll need to - # search for the escaped versions of the keys too. - escaped_key = re.escape(key) - key_label = key[1:] # key without $ prefix - - key_expected_grp_regex = f"(?P<{key_label}>{key_expected_regex})" - search_regex = search_regex.replace(escaped_key, - key_expected_grp_regex) - - # The filename templates don't include the extension so we add it - # to be able to match the out filename beginning to end - ext_regex = r"(?P\.[A-Za-z][A-Za-z0-9-]*)" - search_regex = rf"^{search_regex}{ext_regex}$" - - regexes[template] = search_regex - - return regexes - - -def strip_template(template, strip="._ "): - """Return static characters in a substance painter filename template. - - >>> strip_template("$textureSet_HELLO(.$udim)") - # HELLO - >>> strip_template("$mesh_$textureSet_HELLO_WORLD_$colorSpace(.$udim)") - # HELLO_WORLD - >>> strip_template("$textureSet_HELLO(.$udim)", strip=None) - # _HELLO - >>> strip_template("$mesh_$textureSet_$colorSpace(.$udim)", strip=None) - # _HELLO_ - >>> strip_template("$textureSet_HELLO(.$udim)") - # _HELLO - - Arguments: - template (str): Filename template to strip. - strip (str, optional): Characters to strip from beginning and end - of the static string in template. Defaults to: `._ `. - - Returns: - str: The static string in filename template. - - """ - # Return only characters that were part of the template that were static. - # Remove all keys - keys = ["$project", "$mesh", "$textureSet", "$udim", "$colorSpace"] - stripped_template = template - for key in keys: - stripped_template = stripped_template.replace(key, "") - - # Everything inside an optional bracket space is excluded since it's not - # static. We keep a counter to track whether we are currently iterating - # over parts of the template that are inside an 'optional' group or not. - counter = 0 - result = "" - for char in stripped_template: - if char == "(": - counter += 1 - elif char == ")": - counter -= 1 - if counter < 0: - counter = 0 - else: - if counter == 0: - result += char - - if strip: - # Strip of any trailing start/end characters. Technically these are - # static but usually start and end separators like space or underscore - # aren't wanted. - result = result.strip(strip) - - return result - - -def get_parsed_export_maps(config): - """Return Export Config's expected output textures with parsed data. - - This tries to parse the texture outputs using a Python API export config. - - Parses template keys: $project, $mesh, $textureSet, $colorSpace, $udim - - Example: - {("DefaultMaterial", ""): { - "$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)": [ - { - // OUTPUT DATA FOR FILE #1 OF THE TEMPLATE - }, - { - // OUTPUT DATA FOR FILE #2 OF THE TEMPLATE - }, - ] - }, - }} - - File output data (all outputs are `str`). - 1) Parsed tokens: These are parsed tokens from the template, they will - only exist if found in the filename template and output filename. - - project: Workfile filename without extension - mesh: Filename of the loaded mesh without extension - textureSet: The texture set, e.g. "DefaultMaterial", - colorSpace: The color space, e.g. "ACES - ACEScg", - udim: The udim tile, e.g. "1001" - - 2) Template output and filepath - - filepath: Full path to the resulting texture map, e.g. - "/path/to/mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", - output: "mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png" - Note: if template had slashes (folders) then `output` will too. - So `output` might include a folder. - - Returns: - dict: [texture_set, stack]: {template: [file1_data, file2_data]} - - """ - # Import is here to avoid recursive lib <-> colorspace imports - from .colorspace import get_project_channel_data - - outputs = substance_painter.export.list_project_textures(config) - templates = get_export_templates(config, strip_folder=False) - - # Get all color spaces set for the current project - project_colorspaces = set( - data["colorSpace"] for data in get_project_channel_data().values() - ) - - # Get current project mesh path and project path to explicitly match - # the $mesh and $project tokens - project_mesh_path = substance_painter.project.last_imported_mesh_path() - project_path = substance_painter.project.file_path() - - # Get the current export path to strip this of the beginning of filepath - # results, since filename templates don't have these we'll match without - # that part of the filename. - export_path = config["exportPath"] - export_path = export_path.replace("\\", "/") - if not export_path.endswith("/"): - export_path += "/" - - # Parse the outputs - result = {} - for key, filepaths in outputs.items(): - texture_set, stack = key - - if stack: - stack_path = f"{texture_set}/{stack}" - else: - stack_path = texture_set - - stack_templates = list(templates[stack_path].keys()) - - template_regex = _templates_to_regex(stack_templates, - texture_set=texture_set, - colorspaces=project_colorspaces, - mesh=project_mesh_path, - project=project_path) - - # Let's precompile the regexes - for template, regex in template_regex.items(): - template_regex[template] = re.compile(regex) - - stack_results = defaultdict(list) - for filepath in sorted(filepaths): - # We strip explicitly using the full parent export path instead of - # using `os.path.basename` because export template is allowed to - # have subfolders in its template which we want to match against - filepath = filepath.replace("\\", "/") - assert filepath.startswith(export_path), ( - f"Filepath {filepath} must start with folder {export_path}" - ) - filename = filepath[len(export_path):] - - for template, regex in template_regex.items(): - match = regex.match(filename) - if match: - parsed = match.groupdict(default={}) - - # Include some special outputs for convenience - parsed["filepath"] = filepath - parsed["output"] = filename - - stack_results[template].append(parsed) - break - else: - raise ValueError(f"Unable to match {filename} against any " - f"template in: {list(template_regex.keys())}") - - result[key] = dict(stack_results) - - return result - - -def load_shelf(path, name=None): - """Add shelf to substance painter (for current application session) - - This will dynamically add a Shelf for the current session. It's good - to note however that these will *not* persist on restart of the host. - - Note: - Consider the loaded shelf a static library of resources. - - The shelf will *not* be visible in application preferences in - Edit > Settings > Libraries. - - The shelf will *not* show in the Assets browser if it has no existing - assets - - The shelf will *not* be a selectable option for selecting it as a - destination to import resources too. - - """ - - # Ensure expanded path with forward slashes - path = os.path.expandvars(path) - path = os.path.abspath(path) - path = path.replace("\\", "/") - - # Path must exist - if not os.path.isdir(path): - raise ValueError(f"Path is not an existing folder: {path}") - - # This name must be unique and must only contain lowercase letters, - # numbers, underscores or hyphens. - if name is None: - name = os.path.basename(path) - - name = name.lower() - name = re.sub(r"[^a-z0-9_\-]", "_", name) # sanitize to underscores - - if substance_painter.resource.Shelves.exists(name): - shelf = next( - shelf for shelf in substance_painter.resource.Shelves.all() - if shelf.name() == name - ) - if os.path.normpath(shelf.path()) != os.path.normpath(path): - raise ValueError(f"Shelf with name '{name}' already exists " - f"for a different path: '{shelf.path()}") - - return - - print(f"Adding Shelf '{name}' to path: {path}") - substance_painter.resource.Shelves.add(name, path) - - return name - - -def _get_new_project_action(): - """Return QAction which triggers Substance Painter's new project dialog""" - - main_window = substance_painter.ui.get_main_window() - - # Find the file menu's New file action - menubar = main_window.menuBar() - new_action = None - for action in menubar.actions(): - menu = action.menu() - if not menu: - continue - - if menu.objectName() != "file": - continue - - # Find the action with the CTRL+N key sequence - new_action = next(action for action in menu.actions() - if action.shortcut() == QtGui.QKeySequence.New) - break - - return new_action - - -def prompt_new_file_with_mesh(mesh_filepath): - """Prompts the user for a new file using Substance Painter's own dialog. - - This will set the mesh path to load to the given mesh and disables the - dialog box to disallow the user to change the path. This way we can allow - user configuration of a project but set the mesh path ourselves. - - Warning: - This is very hacky and experimental. - - Note: - If a project is currently open using the same mesh filepath it can't - accurately detect whether the user had actually accepted the new project - dialog or whether the project afterwards is still the original project, - for example when the user might have cancelled the operation. - - """ - - app = QtWidgets.QApplication.instance() - assert os.path.isfile(mesh_filepath), \ - f"Mesh filepath does not exist: {mesh_filepath}" - - def _setup_file_dialog(): - """Set filepath in QFileDialog and trigger accept result""" - file_dialog = app.activeModalWidget() - assert isinstance(file_dialog, QtWidgets.QFileDialog) - - # Quickly hide the dialog - file_dialog.hide() - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) - - file_dialog.setDirectory(os.path.dirname(mesh_filepath)) - url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) - file_dialog.selectUrl(url) - # TODO: find a way to improve the process event to - # load more complicated mesh - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) - file_dialog.done(file_dialog.Accepted) - app.processEvents(QtCore.QEventLoop.AllEvents) - - def _setup_prompt(): - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents) - dialog = app.activeModalWidget() - assert dialog.objectName() == "NewProjectDialog" - - # Set the window title - mesh = os.path.basename(mesh_filepath) - dialog.setWindowTitle(f"New Project with mesh: {mesh}") - - # Get the select mesh file button - mesh_select = dialog.findChild(QtWidgets.QPushButton, "meshSelect") - - # Hide the select mesh button to the user to block changing of mesh - mesh_select.setVisible(False) - - # Ensure UI is visually up-to-date - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 8000) - - # Trigger the 'select file' dialog to set the path and have the - # new file dialog to use the path. - QtCore.QTimer.singleShot(10, _setup_file_dialog) - mesh_select.click() - - app.processEvents(QtCore.QEventLoop.AllEvents, 5000) - - mesh_filename = dialog.findChild(QtWidgets.QFrame, "meshFileName") - mesh_filename_label = mesh_filename.findChild(QtWidgets.QLabel) - if not mesh_filename_label.text(): - dialog.close() - substance_painter.logging.warning( - "Failed to set mesh path with the prompt dialog:" - f"{mesh_filepath}\n\n" - "Creating new project directly with the mesh path instead.") - - new_action = _get_new_project_action() - if not new_action: - raise RuntimeError("Unable to detect new file action..") - - QtCore.QTimer.singleShot(0, _setup_prompt) - new_action.trigger() - app.processEvents(QtCore.QEventLoop.AllEvents, 5000) - - if not substance_painter.project.is_open(): - return - - # Confirm mesh was set as expected - project_mesh = substance_painter.project.last_imported_mesh_path() - if os.path.normpath(project_mesh) != os.path.normpath(mesh_filepath): - return - - return project_mesh diff --git a/server_addon/substancepainter/client/substancepainter/api/pipeline.py b/server_addon/substancepainter/client/substancepainter/api/pipeline.py deleted file mode 100644 index 23d629533c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/pipeline.py +++ /dev/null @@ -1,425 +0,0 @@ -# -*- coding: utf-8 -*- -"""Pipeline tools for OpenPype Substance Painter integration.""" -import os -import logging -from functools import partial - -# Substance 3D Painter modules -import substance_painter.ui -import substance_painter.event -import substance_painter.project - -import pyblish.api - -from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost -from ayon_core.settings import get_current_project_settings - -from ayon_core.pipeline.template_data import get_template_data_with_names -from ayon_core.pipeline import ( - register_creator_plugin_path, - register_loader_plugin_path, - AVALON_CONTAINER_ID, - Anatomy, -) -from ayon_core.lib import ( - StringTemplate, - register_event_callback, - emit_event, -) -from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.substancepainter import SUBSTANCE_HOST_DIR - -from . import lib - -log = logging.getLogger("ayon_core.hosts.substance") - -PLUGINS_DIR = os.path.join(SUBSTANCE_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") - -OPENPYPE_METADATA_KEY = "OpenPype" -OPENPYPE_METADATA_CONTAINERS_KEY = "containers" # child key -OPENPYPE_METADATA_CONTEXT_KEY = "context" # child key -OPENPYPE_METADATA_INSTANCES_KEY = "instances" # child key - - -class SubstanceHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): - name = "substancepainter" - - def __init__(self): - super(SubstanceHost, self).__init__() - self._has_been_setup = False - self.menu = None - self.callbacks = [] - self.shelves = [] - - def install(self): - pyblish.api.register_host("substancepainter") - - pyblish.api.register_plugin_path(PUBLISH_PATH) - register_loader_plugin_path(LOAD_PATH) - register_creator_plugin_path(CREATE_PATH) - - log.info("Installing callbacks ... ") - # register_event_callback("init", on_init) - self._register_callbacks() - # register_event_callback("before.save", before_save) - # register_event_callback("save", on_save) - register_event_callback("open", on_open) - # register_event_callback("new", on_new) - - log.info("Installing menu ... ") - self._install_menu() - - project_settings = get_current_project_settings() - self._install_shelves(project_settings) - - self._has_been_setup = True - - def uninstall(self): - self._uninstall_shelves() - self._uninstall_menu() - self._deregister_callbacks() - - def workfile_has_unsaved_changes(self): - - if not substance_painter.project.is_open(): - return False - - return substance_painter.project.needs_saving() - - def get_workfile_extensions(self): - return [".spp", ".toc"] - - def save_workfile(self, dst_path=None): - - if not substance_painter.project.is_open(): - return False - - if not dst_path: - dst_path = self.get_current_workfile() - - full_save_mode = substance_painter.project.ProjectSaveMode.Full - substance_painter.project.save_as(dst_path, full_save_mode) - - return dst_path - - def open_workfile(self, filepath): - - if not os.path.exists(filepath): - raise RuntimeError("File does not exist: {}".format(filepath)) - - # We must first explicitly close current project before opening another - if substance_painter.project.is_open(): - substance_painter.project.close() - - substance_painter.project.open(filepath) - return filepath - - def get_current_workfile(self): - if not substance_painter.project.is_open(): - return None - - filepath = substance_painter.project.file_path() - if filepath and filepath.endswith(".spt"): - # When currently in a Substance Painter template assume our - # scene isn't saved. This can be the case directly after doing - # "New project", the path will then be the template used. This - # avoids Workfiles tool trying to save as .spt extension if the - # file hasn't been saved before. - return - - return filepath - - def get_containers(self): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) - if containers: - for key, container in containers.items(): - container["objectName"] = key - yield container - - def update_context_data(self, data, changes): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - metadata.set(OPENPYPE_METADATA_CONTEXT_KEY, data) - - def get_context_data(self): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - return metadata.get(OPENPYPE_METADATA_CONTEXT_KEY) or {} - - def _install_menu(self): - from PySide2 import QtWidgets - from ayon_core.tools.utils import host_tools - - parent = substance_painter.ui.get_main_window() - - tab_menu_label = os.environ.get("AYON_MENU_LABEL") or "AYON" - menu = QtWidgets.QMenu(tab_menu_label) - - action = menu.addAction("Create...") - action.triggered.connect( - lambda: host_tools.show_publisher(parent=parent, - tab="create") - ) - - action = menu.addAction("Load...") - action.triggered.connect( - lambda: host_tools.show_loader(parent=parent, use_context=True) - ) - - action = menu.addAction("Publish...") - action.triggered.connect( - lambda: host_tools.show_publisher(parent=parent, - tab="publish") - ) - - action = menu.addAction("Manage...") - action.triggered.connect( - lambda: host_tools.show_scene_inventory(parent=parent) - ) - - action = menu.addAction("Library...") - action.triggered.connect( - lambda: host_tools.show_library_loader(parent=parent) - ) - - menu.addSeparator() - action = menu.addAction("Work Files...") - action.triggered.connect( - lambda: host_tools.show_workfiles(parent=parent) - ) - - substance_painter.ui.add_menu(menu) - - def on_menu_destroyed(): - self.menu = None - - menu.destroyed.connect(on_menu_destroyed) - - self.menu = menu - - def _uninstall_menu(self): - if self.menu: - self.menu.destroy() - self.menu = None - - def _register_callbacks(self): - # Prepare emit event callbacks - open_callback = partial(emit_event, "open") - - # Connect to the Substance Painter events - dispatcher = substance_painter.event.DISPATCHER - for event, callback in [ - (substance_painter.event.ProjectOpened, open_callback) - ]: - dispatcher.connect(event, callback) - # Keep a reference so we can deregister if needed - self.callbacks.append((event, callback)) - - def _deregister_callbacks(self): - for event, callback in self.callbacks: - substance_painter.event.DISPATCHER.disconnect(event, callback) - self.callbacks.clear() - - def _install_shelves(self, project_settings): - - shelves = project_settings["substancepainter"].get("shelves", []) - if not shelves: - return - - # Prepare formatting data if we detect any path which might have - # template tokens like {folder[name]} in there. - formatting_data = {} - has_formatting_entries = any("{" in item["value"] for item in shelves) - if has_formatting_entries: - project_name = self.get_current_project_name() - folder_path = self.get_current_folder_path() - task_name = self.get_current_task_name() - formatting_data = get_template_data_with_names( - project_name, folder_path, task_name, project_settings - ) - anatomy = Anatomy(project_name) - formatting_data["root"] = anatomy.roots - - for shelve_item in shelves: - - # Allow formatting with anatomy for the paths - path = shelve_item["value"] - if "{" in path: - path = StringTemplate.format_template(path, formatting_data) - - name = shelve_item["name"] - shelf_name = None - try: - shelf_name = lib.load_shelf(path, name=name) - except ValueError as exc: - print(f"Failed to load shelf -> {exc}") - - if shelf_name: - self.shelves.append(shelf_name) - - def _uninstall_shelves(self): - for shelf_name in self.shelves: - substance_painter.resource.Shelves.remove(shelf_name) - self.shelves.clear() - - -def on_open(): - log.info("Running callback on open..") - - if any_outdated_containers(): - from ayon_core.tools.utils import SimplePopup - - log.warning("Scene has outdated content.") - - # Get main window - parent = substance_painter.ui.get_main_window() - if parent is None: - log.info("Skipping outdated content pop-up " - "because Substance window can't be found.") - else: - - # Show outdated pop-up - def _on_show_inventory(): - from ayon_core.tools.utils import host_tools - host_tools.show_scene_inventory(parent=parent) - - dialog = SimplePopup(parent=parent) - dialog.setWindowTitle("Substance scene has outdated content") - dialog.set_message("There are outdated containers in " - "your Substance scene.") - dialog.on_clicked.connect(_on_show_inventory) - dialog.show() - - -def imprint_container(container, - name, - namespace, - context, - loader): - """Imprint a loaded container with metadata. - - Containerisation enables a tracking of version, author and origin - for loaded assets. - - Arguments: - container (dict): The (substance metadata) dictionary to imprint into. - name (str): Name of resulting assembly - namespace (str): Namespace under which to host container - context (dict): Asset information - loader (load.LoaderPlugin): loader instance used to produce container. - - Returns: - None - - """ - - data = [ - ("schema", "openpype:container-2.0"), - ("id", AVALON_CONTAINER_ID), - ("name", str(name)), - ("namespace", str(namespace) if namespace else None), - ("loader", str(loader.__class__.__name__)), - ("representation", context["representation"]["id"]), - ] - for key, value in data: - container[key] = value - - -def set_container_metadata(object_name, container_data, update=False): - """Helper method to directly set the data for a specific container - - Args: - object_name (str): The unique object name identifier for the container - container_data (dict): The data for the container. - Note 'objectName' data is derived from `object_name` and key in - `container_data` will be ignored. - update (bool): Whether to only update the dict data. - - """ - # The objectName is derived from the key in the metadata so won't be stored - # in the metadata in the container's data. - container_data.pop("objectName", None) - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) or {} - if update: - existing_data = containers.setdefault(object_name, {}) - existing_data.update(container_data) # mutable dict, in-place update - else: - containers[object_name] = container_data - metadata.set("containers", containers) - - -def remove_container_metadata(object_name): - """Helper method to remove the data for a specific container""" - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) - if containers: - containers.pop(object_name, None) - metadata.set("containers", containers) - - -def set_instance(instance_id, instance_data, update=False): - """Helper method to directly set the data for a specific container - - Args: - instance_id (str): Unique identifier for the instance - instance_data (dict): The instance data to store in the metaadata. - """ - set_instances({instance_id: instance_data}, update=update) - - -def set_instances(instance_data_by_id, update=False): - """Store data for multiple instances at the same time. - - This is more optimal than querying and setting them in the metadata one - by one. - """ - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - - for instance_id, instance_data in instance_data_by_id.items(): - if update: - existing_data = instances.get(instance_id, {}) - existing_data.update(instance_data) - else: - instances[instance_id] = instance_data - - metadata.set("instances", instances) - - -def remove_instance(instance_id): - """Helper method to remove the data for a specific container""" - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - instances.pop(instance_id, None) - metadata.set("instances", instances) - - -def get_instances_by_id(): - """Return all instances stored in the project instances metadata""" - if not substance_painter.project.is_open(): - return {} - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - return metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - - -def get_instances(): - """Return all instances stored in the project instances as a list""" - return list(get_instances_by_id().values()) diff --git a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py deleted file mode 100644 index 8ced463367..0000000000 --- a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py +++ /dev/null @@ -1,36 +0,0 @@ - - -def cleanup_openpype_qt_widgets(): - """ - Workaround for Substance failing to shut down correctly - when a Qt window was still open at the time of shutting down. - - This seems to work sometimes, but not all the time. - - """ - # TODO: Create a more reliable method to close down all OpenPype Qt widgets - from PySide2 import QtWidgets - import substance_painter.ui - - # Kill OpenPype Qt widgets - print("Killing OpenPype Qt widgets..") - for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("openpype."): - print(f"Deleting widget: {widget.__class__.__name__}") - substance_painter.ui.delete_ui_element(widget) - - -def start_plugin(): - from ayon_core.pipeline import install_host - from ayon_core.hosts.substancepainter.api import SubstanceHost - install_host(SubstanceHost()) - - -def close_plugin(): - from ayon_core.pipeline import uninstall_host - cleanup_openpype_qt_widgets() - uninstall_host() - - -if __name__ == "__main__": - start_plugin() diff --git a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py deleted file mode 100644 index 04b610b4df..0000000000 --- a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" - -OPENPYPE_PLUGIN_NAME = "openpype_plugin" - - -def start_plugin(): - try: - # This isn't exposed in the official API so we keep it in a try-except - from painter_plugins_ui import ( - get_settings, - LAUNCH_AT_START_KEY, - ON_STATE, - PLUGINS_MENU, - plugin_manager - ) - - # The `painter_plugins_ui` plug-in itself is also a startup plug-in - # we need to take into account that it could run either earlier or - # later than this startup script, we check whether its menu initialized - is_before_plugins_menu = PLUGINS_MENU is None - - settings = get_settings(OPENPYPE_PLUGIN_NAME) - if settings.value(LAUNCH_AT_START_KEY, None) is None: - print("Initializing OpenPype plug-in on first run...") - if is_before_plugins_menu: - print("- running before 'painter_plugins_ui'") - # Delay the launch to the painter_plugins_ui initialization - settings.setValue(LAUNCH_AT_START_KEY, ON_STATE) - else: - # Launch now - print("- running after 'painter_plugins_ui'") - plugin_manager(OPENPYPE_PLUGIN_NAME)(True) - - # Set the checked state in the menu to avoid confusion - action = next(action for action in PLUGINS_MENU._menu.actions() - if action.text() == OPENPYPE_PLUGIN_NAME) - if action is not None: - action.blockSignals(True) - action.setChecked(True) - action.blockSignals(False) - - except Exception as exc: - print(exc) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py deleted file mode 100644 index f46afadb5a..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- -"""Creator plugin for creating textures.""" - -from ayon_core.pipeline import CreatedInstance, Creator, CreatorError -from ayon_core.lib import ( - EnumDef, - UILabelDef, - NumberDef, - BoolDef -) - -from ayon_core.hosts.substancepainter.api.pipeline import ( - get_instances, - set_instance, - set_instances, - remove_instance -) -from ayon_core.hosts.substancepainter.api.lib import get_export_presets - -import substance_painter.project - - -class CreateTextures(Creator): - """Create a texture set.""" - identifier = "io.openpype.creators.substancepainter.textureset" - label = "Textures" - product_type = "textureSet" - icon = "picture-o" - - default_variant = "Main" - - def create(self, product_name, instance_data, pre_create_data): - - if not substance_painter.project.is_open(): - raise CreatorError("Can't create a Texture Set instance without " - "an open project.") - # Transfer settings from pre create to instance - creator_attributes = instance_data.setdefault( - "creator_attributes", dict()) - for key in [ - "exportPresetUrl", - "exportFileFormat", - "exportSize", - "exportPadding", - "exportDilationDistance" - ]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] - - instance = self.create_instance_in_context(product_name, - instance_data) - set_instance( - instance_id=instance["instance_id"], - instance_data=instance.data_to_store() - ) - - def collect_instances(self): - for instance in get_instances(): - if (instance.get("creator_identifier") == self.identifier or - instance.get("productType") == self.product_type): - self.create_instance_in_context_from_existing(instance) - - def update_instances(self, update_list): - instance_data_by_id = {} - for instance, _changes in update_list: - # Persist the data - instance_id = instance.get("instance_id") - instance_data = instance.data_to_store() - instance_data_by_id[instance_id] = instance_data - set_instances(instance_data_by_id, update=True) - - def remove_instances(self, instances): - for instance in instances: - remove_instance(instance["instance_id"]) - self._remove_instance_from_context(instance) - - # Helper methods (this might get moved into Creator class) - def create_instance_in_context(self, product_name, data): - instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self.create_context.creator_adds_instance(instance) - return instance - - def create_instance_in_context_from_existing(self, data): - instance = CreatedInstance.from_existing(data, self) - self.create_context.creator_adds_instance(instance) - return instance - - def get_instance_attr_defs(self): - - return [ - EnumDef("exportPresetUrl", - items=get_export_presets(), - label="Output Template"), - BoolDef("allowSkippedMaps", - label="Allow Skipped Output Maps", - tooltip="When enabled this allows the publish to ignore " - "output maps in the used output template if one " - "or more maps are skipped due to the required " - "channels not being present in the current file.", - default=True), - EnumDef("exportFileFormat", - items={ - None: "Based on output template", - # TODO: Get available extensions from substance API - "bmp": "bmp", - "ico": "ico", - "jpeg": "jpeg", - "jng": "jng", - "pbm": "pbm", - "pgm": "pgm", - "png": "png", - "ppm": "ppm", - "tga": "targa", - "tif": "tiff", - "wap": "wap", - "wbmp": "wbmp", - "xpm": "xpm", - "gif": "gif", - "hdr": "hdr", - "exr": "exr", - "j2k": "j2k", - "jp2": "jp2", - "pfm": "pfm", - "webp": "webp", - # TODO: Unsure why jxr format fails to export - # "jxr": "jpeg-xr", - # TODO: File formats that combine the exported textures - # like psd are not correctly supported due to - # publishing only a single file - # "psd": "psd", - # "sbsar": "sbsar", - }, - default=None, - label="File type"), - EnumDef("exportSize", - items={ - None: "Based on each Texture Set's size", - # The key is size of the texture file in log2. - # (i.e. 10 means 2^10 = 1024) - 7: "128", - 8: "256", - 9: "512", - 10: "1024", - 11: "2048", - 12: "4096", - 13: "8192" - }, - default=None, - label="Size"), - - EnumDef("exportPadding", - items={ - "passthrough": "No padding (passthrough)", - "infinite": "Dilation infinite", - "transparent": "Dilation + transparent", - "color": "Dilation + default background color", - "diffusion": "Dilation + diffusion" - }, - default="infinite", - label="Padding"), - NumberDef("exportDilationDistance", - minimum=0, - maximum=256, - decimals=0, - default=16, - label="Dilation Distance"), - UILabelDef("*only used with " - "'Dilation + ' padding"), - ] - - def get_pre_create_attr_defs(self): - # Use same attributes as for instance attributes - return self.get_instance_attr_defs() diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py deleted file mode 100644 index 63b1c6c7da..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -"""Creator plugin for creating workfiles.""" - -import ayon_api - -from ayon_core.pipeline import CreatedInstance, AutoCreator - -from ayon_core.hosts.substancepainter.api.pipeline import ( - set_instances, - set_instance, - get_instances -) - -import substance_painter.project - - -class CreateWorkfile(AutoCreator): - """Workfile auto-creator.""" - identifier = "io.openpype.creators.substancepainter.workfile" - label = "Workfile" - product_type = "workfile" - icon = "document" - - default_variant = "Main" - - def create(self): - - if not substance_painter.project.is_open(): - return - - variant = self.default_variant - project_name = self.project_name - folder_path = self.create_context.get_current_folder_path() - task_name = self.create_context.get_current_task_name() - host_name = self.create_context.host_name - - # Workfile instance should always exist and must only exist once. - # As such we'll first check if it already exists and is collected. - current_instance = next( - ( - instance for instance in self.create_context.instances - if instance.creator_identifier == self.identifier - ), None) - - current_folder_path = None - if current_instance is not None: - current_folder_path = current_instance["folderPath"] - - if current_instance is None: - self.log.info("Auto-creating workfile instance...") - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name, - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": variant - } - current_instance = self.create_instance_in_context(product_name, - data) - elif ( - current_folder_path != folder_path - or current_instance["task"] != task_name - ): - # Update instance context if is not the same - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name, - ) - current_instance["folderPath"] = folder_path - current_instance["task"] = task_name - current_instance["productName"] = product_name - - set_instance( - instance_id=current_instance.get("instance_id"), - instance_data=current_instance.data_to_store() - ) - - def collect_instances(self): - for instance in get_instances(): - if (instance.get("creator_identifier") == self.identifier or - instance.get("productType") == self.product_type): - self.create_instance_in_context_from_existing(instance) - - def update_instances(self, update_list): - instance_data_by_id = {} - for instance, _changes in update_list: - # Persist the data - instance_id = instance.get("instance_id") - instance_data = instance.data_to_store() - instance_data_by_id[instance_id] = instance_data - set_instances(instance_data_by_id, update=True) - - # Helper methods (this might get moved into Creator class) - def create_instance_in_context(self, product_name, data): - instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self.create_context.creator_adds_instance(instance) - return instance - - def create_instance_in_context_from_existing(self, data): - instance = CreatedInstance.from_existing(data, self) - self.create_context.creator_adds_instance(instance) - return instance diff --git a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py deleted file mode 100644 index d5aac1191c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py +++ /dev/null @@ -1,246 +0,0 @@ -import copy -from qtpy import QtWidgets, QtCore -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.substancepainter.api.pipeline import ( - imprint_container, - set_container_metadata, - remove_container_metadata -) - -import substance_painter.project - - -def _convert(substance_attr): - """Return Substance Painter Python API Project attribute from string. - - This converts a string like "ProjectWorkflow.Default" to for example - the Substance Painter Python API equivalent object, like: - `substance_painter.project.ProjectWorkflow.Default` - - Args: - substance_attr (str): The `substance_painter.project` attribute, - for example "ProjectWorkflow.Default" - - Returns: - Any: Substance Python API object of the project attribute. - - Raises: - ValueError: If attribute does not exist on the - `substance_painter.project` python api. - """ - root = substance_painter.project - for attr in substance_attr.split("."): - root = getattr(root, attr, None) - if root is None: - raise ValueError( - "Substance Painter project attribute" - f" does not exist: {substance_attr}") - - return root - - -def get_template_by_name(name: str, templates: list[dict]) -> dict: - return next( - template for template in templates - if template["name"] == name - ) - - -class SubstanceProjectConfigurationWindow(QtWidgets.QDialog): - """The pop-up dialog allows users to choose material - duplicate options for importing Max objects when updating - or switching assets. - """ - def __init__(self, project_templates): - super(SubstanceProjectConfigurationWindow, self).__init__() - self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) - - self.configuration = None - self.template_names = [template["name"] for template - in project_templates] - self.project_templates = project_templates - - self.widgets = { - "label": QtWidgets.QLabel( - "Select your template for project configuration"), - "template_options": QtWidgets.QComboBox(), - "import_cameras": QtWidgets.QCheckBox("Import Cameras"), - "preserve_strokes": QtWidgets.QCheckBox("Preserve Strokes"), - "clickbox": QtWidgets.QWidget(), - "combobox": QtWidgets.QWidget(), - "buttons": QtWidgets.QDialogButtonBox( - QtWidgets.QDialogButtonBox.Ok - | QtWidgets.QDialogButtonBox.Cancel) - } - - self.widgets["template_options"].addItems(self.template_names) - - template_name = self.widgets["template_options"].currentText() - self._update_to_match_template(template_name) - # Build clickboxes - layout = QtWidgets.QHBoxLayout(self.widgets["clickbox"]) - layout.addWidget(self.widgets["import_cameras"]) - layout.addWidget(self.widgets["preserve_strokes"]) - # Build combobox - layout = QtWidgets.QHBoxLayout(self.widgets["combobox"]) - layout.addWidget(self.widgets["template_options"]) - # Build buttons - layout = QtWidgets.QHBoxLayout(self.widgets["buttons"]) - # Build layout. - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(self.widgets["label"]) - layout.addWidget(self.widgets["combobox"]) - layout.addWidget(self.widgets["clickbox"]) - layout.addWidget(self.widgets["buttons"]) - - self.widgets["template_options"].currentTextChanged.connect( - self._update_to_match_template) - self.widgets["buttons"].accepted.connect(self.on_accept) - self.widgets["buttons"].rejected.connect(self.on_reject) - - def on_accept(self): - self.configuration = self.get_project_configuration() - self.close() - - def on_reject(self): - self.close() - - def _update_to_match_template(self, template_name): - template = get_template_by_name(template_name, self.project_templates) - self.widgets["import_cameras"].setChecked(template["import_cameras"]) - self.widgets["preserve_strokes"].setChecked( - template["preserve_strokes"]) - - def get_project_configuration(self): - templates = self.project_templates - template_name = self.widgets["template_options"].currentText() - template = get_template_by_name(template_name, templates) - template = copy.deepcopy(template) # do not edit the original - template["import_cameras"] = self.widgets["import_cameras"].isChecked() - template["preserve_strokes"] = ( - self.widgets["preserve_strokes"].isChecked() - ) - for key in ["normal_map_format", - "project_workflow", - "tangent_space_mode"]: - template[key] = _convert(template[key]) - return template - - @classmethod - def prompt(cls, templates): - dialog = cls(templates) - dialog.exec_() - configuration = dialog.configuration - dialog.deleteLater() - return configuration - - -class SubstanceLoadProjectMesh(load.LoaderPlugin): - """Load mesh for project""" - - product_types = {"*"} - representations = {"abc", "fbx", "obj", "gltf", "usd", "usda", "usdc"} - - label = "Load mesh" - order = -10 - icon = "code-fork" - color = "orange" - - # Defined via settings - project_templates = [] - - def load(self, context, name, namespace, options=None): - - # Get user inputs - result = SubstanceProjectConfigurationWindow.prompt( - self.project_templates) - if not result: - # cancelling loader action - return - if not substance_painter.project.is_open(): - # Allow to 'initialize' a new project - path = self.filepath_from_context(context) - sp_settings = substance_painter.project.Settings( - import_cameras=result["import_cameras"], - normal_map_format=result["normal_map_format"], - project_workflow=result["project_workflow"], - tangent_space_mode=result["tangent_space_mode"], - default_texture_resolution=result["default_texture_resolution"] - ) - settings = substance_painter.project.create( - mesh_file_path=path, settings=sp_settings - ) - else: - # Reload the mesh - settings = substance_painter.project.MeshReloadingSettings( - import_cameras=result["import_cameras"], - preserve_strokes=result["preserve_strokes"]) - - def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): # noqa - if status == substance_painter.project.ReloadMeshStatus.SUCCESS: # noqa - self.log.info("Reload succeeded") - else: - raise LoadError("Reload of mesh failed") - - path = self.filepath_from_context(context) - substance_painter.project.reload_mesh(path, - settings, - on_mesh_reload) - - # Store container - container = {} - project_mesh_object_name = "_ProjectMesh_" - imprint_container(container, - name=project_mesh_object_name, - namespace=project_mesh_object_name, - context=context, - loader=self) - - # We want store some options for updating to keep consistent behavior - # from the user's original choice. We don't store 'preserve_strokes' - # as we always preserve strokes on updates. - container["options"] = { - "import_cameras": result["import_cameras"], - } - - set_container_metadata(project_mesh_object_name, container) - - def switch(self, container, context): - self.update(container, context) - - def update(self, container, context): - repre_entity = context["representation"] - - path = get_representation_path(repre_entity) - - # Reload the mesh - container_options = container.get("options", {}) - settings = substance_painter.project.MeshReloadingSettings( - import_cameras=container_options.get("import_cameras", True), - preserve_strokes=True - ) - - def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): - if status == substance_painter.project.ReloadMeshStatus.SUCCESS: - self.log.info("Reload succeeded") - else: - raise LoadError("Reload of mesh failed") - - substance_painter.project.reload_mesh(path, settings, on_mesh_reload) - - # Update container representation - object_name = container["objectName"] - update_data = {"representation": repre_entity["id"]} - set_container_metadata(object_name, update_data, update=True) - - def remove(self, container): - - # Remove OpenPype related settings about what model was loaded - # or close the project? - # TODO: This is likely best 'hidden' away to the user because - # this will leave the project's mesh unmanaged. - remove_container_metadata(container["objectName"]) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py deleted file mode 100644 index db0edafac0..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py +++ /dev/null @@ -1,17 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import registered_host - - -class CollectCurrentFile(pyblish.api.ContextPlugin): - """Inject the current working file into context""" - - order = pyblish.api.CollectorOrder - 0.49 - label = "Current Workfile" - hosts = ["substancepainter"] - - def process(self, context): - host = registered_host() - path = host.get_current_workfile() - context.data["currentFile"] = path - self.log.debug(f"Current workfile: {path}") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py deleted file mode 100644 index 20aaa56993..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py +++ /dev/null @@ -1,211 +0,0 @@ -import os -import copy - -import pyblish.api -import ayon_api - -import substance_painter.textureset -from ayon_core.pipeline import publish -from ayon_core.hosts.substancepainter.api.lib import ( - get_parsed_export_maps, - strip_template -) -from ayon_core.pipeline.create import get_product_name - - -class CollectTextureSet(pyblish.api.InstancePlugin): - """Extract Textures using an output template config""" - # TODO: Production-test usage of color spaces - # TODO: Detect what source data channels end up in each file - - label = "Collect Texture Set images" - hosts = ["substancepainter"] - families = ["textureSet"] - order = pyblish.api.CollectorOrder - - def process(self, instance): - - config = self.get_export_config(instance) - project_name = instance.context.data["projectName"] - folder_entity = ayon_api.get_folder_by_path( - project_name, - instance.data["folderPath"] - ) - task_name = instance.data.get("task") - task_entity = None - if folder_entity and task_name: - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - - instance.data["exportConfig"] = config - maps = get_parsed_export_maps(config) - - # Let's break the instance into multiple instances to integrate - # a product per generated texture or texture UDIM sequence - for (texture_set_name, stack_name), template_maps in maps.items(): - self.log.info(f"Processing {texture_set_name}/{stack_name}") - for template, outputs in template_maps.items(): - self.log.info(f"Processing {template}") - self.create_image_instance(instance, template, outputs, - task_entity=task_entity, - texture_set_name=texture_set_name, - stack_name=stack_name) - - def create_image_instance(self, instance, template, outputs, - task_entity, texture_set_name, stack_name): - """Create a new instance per image or UDIM sequence. - - The new instances will be of product type `image`. - - """ - - context = instance.context - first_filepath = outputs[0]["filepath"] - fnames = [os.path.basename(output["filepath"]) for output in outputs] - ext = os.path.splitext(first_filepath)[1] - assert ext.lstrip("."), f"No extension: {ext}" - - always_include_texture_set_name = False # todo: make this configurable - all_texture_sets = substance_painter.textureset.all_texture_sets() - texture_set = substance_painter.textureset.TextureSet.from_name( - texture_set_name - ) - - # Define the suffix we want to give this particular texture - # set and set up a remapped product naming for it. - suffix = "" - if always_include_texture_set_name or len(all_texture_sets) > 1: - # More than one texture set, include texture set name - suffix += f".{texture_set_name}" - if texture_set.is_layered_material() and stack_name: - # More than one stack, include stack name - suffix += f".{stack_name}" - - # Always include the map identifier - map_identifier = strip_template(template) - suffix += f".{map_identifier}" - - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - image_product_name = get_product_name( - # TODO: The product type actually isn't 'texture' currently but - # for now this is only done so the product name starts with - # 'texture' - context.data["projectName"], - task_name, - task_type, - context.data["hostName"], - product_type="texture", - variant=instance.data["variant"] + suffix, - project_settings=context.data["project_settings"] - ) - - # Prepare representation - representation = { - "name": ext.lstrip("."), - "ext": ext.lstrip("."), - "files": fnames if len(fnames) > 1 else fnames[0], - } - - # Mark as UDIM explicitly if it has UDIM tiles. - if bool(outputs[0].get("udim")): - # The representation for a UDIM sequence should have a `udim` key - # that is a list of all udim tiles (str) like: ["1001", "1002"] - # strings. See CollectTextures plug-in and Integrators. - representation["udim"] = [output["udim"] for output in outputs] - - # Set up the representation for thumbnail generation - # TODO: Simplify this once thumbnail extraction is refactored - staging_dir = os.path.dirname(first_filepath) - representation["tags"] = ["review"] - representation["stagingDir"] = staging_dir - - # Clone the instance - product_type = "image" - image_instance = context.create_instance(image_product_name) - image_instance[:] = instance[:] - image_instance.data.update(copy.deepcopy(dict(instance.data))) - image_instance.data["name"] = image_product_name - image_instance.data["label"] = image_product_name - image_instance.data["productName"] = image_product_name - image_instance.data["productType"] = product_type - image_instance.data["family"] = product_type - image_instance.data["families"] = [product_type, "textures"] - image_instance.data["representations"] = [representation] - - # Group the textures together in the loader - image_instance.data["productGroup"] = image_product_name - - # Store the texture set name and stack name on the instance - image_instance.data["textureSetName"] = texture_set_name - image_instance.data["textureStackName"] = stack_name - - # Store color space with the instance - # Note: The extractor will assign it to the representation - colorspace = outputs[0].get("colorSpace") - if colorspace: - self.log.debug(f"{image_product_name} colorspace: {colorspace}") - image_instance.data["colorspace"] = colorspace - - # Store the instance in the original instance as a member - instance.append(image_instance) - - def get_export_config(self, instance): - """Return an export configuration dict for texture exports. - - This config can be supplied to: - - `substance_painter.export.export_project_textures` - - `substance_painter.export.list_project_textures` - - See documentation on substance_painter.export module about the - formatting of the configuration dictionary. - - Args: - instance (pyblish.api.Instance): Texture Set instance to be - published. - - Returns: - dict: Export config - - """ - - creator_attrs = instance.data["creator_attributes"] - preset_url = creator_attrs["exportPresetUrl"] - self.log.debug(f"Exporting using preset: {preset_url}") - - # See: https://substance3d.adobe.com/documentation/ptpy/api/substance_painter/export # noqa - config = { # noqa - "exportShaderParams": True, - "exportPath": publish.get_instance_staging_dir(instance), - "defaultExportPreset": preset_url, - - # Custom overrides to the exporter - "exportParameters": [ - { - "parameters": { - "fileFormat": creator_attrs["exportFileFormat"], - "sizeLog2": creator_attrs["exportSize"], - "paddingAlgorithm": creator_attrs["exportPadding"], - "dilationDistance": creator_attrs["exportDilationDistance"] # noqa - } - } - ] - } - - # Create the list of Texture Sets to export. - config["exportList"] = [] - for texture_set in substance_painter.textureset.all_texture_sets(): - config["exportList"].append({"rootPath": texture_set.name()}) - - # Consider None values from the creator attributes optionals - for override in config["exportParameters"]: - parameters = override.get("parameters") - for key, value in dict(parameters).items(): - if value is None: - parameters.pop(key) - - return config diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py deleted file mode 100644 index 8d98d0b014..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import pyblish.api - - -class CollectWorkfileRepresentation(pyblish.api.InstancePlugin): - """Create a publish representation for the current workfile instance.""" - - order = pyblish.api.CollectorOrder - label = "Workfile representation" - hosts = ["substancepainter"] - families = ["workfile"] - - def process(self, instance): - - context = instance.context - current_file = context.data["currentFile"] - - folder, file = os.path.split(current_file) - filename, ext = os.path.splitext(file) - - instance.data["representations"] = [{ - "name": ext.lstrip("."), - "ext": ext.lstrip("."), - "files": file, - "stagingDir": folder, - }] diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py deleted file mode 100644 index 0fa7b52f45..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py +++ /dev/null @@ -1,62 +0,0 @@ -import substance_painter.export - -from ayon_core.pipeline import KnownPublishError, publish - - -class ExtractTextures(publish.Extractor, - publish.ColormanagedPyblishPluginMixin): - """Extract Textures using an output template config. - - Note: - This Extractor assumes that `collect_textureset_images` has prepared - the relevant export config and has also collected the individual image - instances for publishing including its representation. That is why this - particular Extractor doesn't specify representations to integrate. - - """ - - label = "Extract Texture Set" - hosts = ["substancepainter"] - families = ["textureSet"] - - # Run before thumbnail extractors - order = publish.Extractor.order - 0.1 - - def process(self, instance): - - config = instance.data["exportConfig"] - result = substance_painter.export.export_project_textures(config) - - if result.status != substance_painter.export.ExportStatus.Success: - raise KnownPublishError( - "Failed to export texture set: {}".format(result.message) - ) - - # Log what files we generated - for (texture_set_name, stack_name), maps in result.textures.items(): - # Log our texture outputs - self.log.info(f"Exported stack: {texture_set_name} {stack_name}") - for texture_map in maps: - self.log.info(f"Exported texture: {texture_map}") - - # We'll insert the color space data for each image instance that we - # added into this texture set. The collector couldn't do so because - # some anatomy and other instance data needs to be collected prior - context = instance.context - for image_instance in instance: - representation = next(iter(image_instance.data["representations"])) - - colorspace = image_instance.data.get("colorspace") - if not colorspace: - self.log.debug("No color space data present for instance: " - f"{image_instance}") - continue - - self.set_representation_colorspace(representation, - context=context, - colorspace=colorspace) - - # The TextureSet instance should not be integrated. It generates no - # output data. Instead the separated texture instances are generated - # from it which themselves integrate into the database. - instance.data["integrate"] = False diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py deleted file mode 100644 index 521a28130b..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py +++ /dev/null @@ -1,23 +0,0 @@ -import pyblish.api - -from ayon_core.lib import version_up -from ayon_core.pipeline import registered_host - - -class IncrementWorkfileVersion(pyblish.api.ContextPlugin): - """Increment current workfile version.""" - - order = pyblish.api.IntegratorOrder + 1 - label = "Increment Workfile Version" - optional = True - hosts = ["substancepainter"] - - def process(self, context): - - assert all(result["success"] for result in context.data["results"]), ( - "Publishing not successful so version is not increased.") - - host = registered_host() - path = context.data["currentFile"] - self.log.info(f"Incrementing current workfile to: {path}") - host.save_workfile(version_up(path)) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py deleted file mode 100644 index 627fb991aa..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py +++ /dev/null @@ -1,28 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import ( - registered_host, - KnownPublishError -) - - -class SaveCurrentWorkfile(pyblish.api.ContextPlugin): - """Save current workfile""" - - label = "Save current workfile" - order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["substancepainter"] - - def process(self, context): - - host = registered_host() - current = host.get_current_workfile() - if context.data["currentFile"] != current: - raise KnownPublishError("Workfile has changed during publishing!") - - if host.workfile_has_unsaved_changes(): - self.log.info("Saving current file: {}".format(current)) - host.save_workfile() - else: - self.log.debug("Skipping workfile save because there are no " - "unsaved changes.") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py deleted file mode 100644 index 720771994c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py +++ /dev/null @@ -1,110 +0,0 @@ -import copy -import os - -import pyblish.api - -import substance_painter.export - -from ayon_core.pipeline import PublishValidationError - - -class ValidateOutputMaps(pyblish.api.InstancePlugin): - """Validate all output maps for Output Template are generated. - - Output maps will be skipped by Substance Painter if it is an output - map in the Substance Output Template which uses channels that the current - substance painter project has not painted or generated. - - """ - - order = pyblish.api.ValidatorOrder - label = "Validate output maps" - hosts = ["substancepainter"] - families = ["textureSet"] - - def process(self, instance): - - config = instance.data["exportConfig"] - - # Substance Painter API does not allow to query the actual output maps - # it will generate without actually exporting the files. So we try to - # generate the smallest size / fastest export as possible - config = copy.deepcopy(config) - parameters = config["exportParameters"][0]["parameters"] - parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) - parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) - parameters["dithering"] = False # no dithering (faster) - - result = substance_painter.export.export_project_textures(config) - if result.status != substance_painter.export.ExportStatus.Success: - raise PublishValidationError( - "Failed to export texture set: {}".format(result.message) - ) - - generated_files = set() - for texture_maps in result.textures.values(): - for texture_map in texture_maps: - generated_files.add(os.path.normpath(texture_map)) - # Directly clean up our temporary export - os.remove(texture_map) - - creator_attributes = instance.data.get("creator_attributes", {}) - allow_skipped_maps = creator_attributes.get("allowSkippedMaps", True) - error_report_missing = [] - for image_instance in instance: - - # Confirm whether the instance has its expected files generated. - # We assume there's just one representation and that it is - # the actual texture representation from the collector. - representation = next(iter(image_instance.data["representations"])) - staging_dir = representation["stagingDir"] - filenames = representation["files"] - if not isinstance(filenames, (list, tuple)): - # Convert single file to list - filenames = [filenames] - - missing = [] - for filename in filenames: - filepath = os.path.join(staging_dir, filename) - filepath = os.path.normpath(filepath) - if filepath not in generated_files: - self.log.warning(f"Missing texture: {filepath}") - missing.append(filepath) - - if not missing: - continue - - if allow_skipped_maps: - # TODO: This is changing state on the instance's which - # should not be done during validation. - self.log.warning(f"Disabling texture instance: " - f"{image_instance}") - image_instance.data["active"] = False - image_instance.data["publish"] = False - image_instance.data["integrate"] = False - representation.setdefault("tags", []).append("delete") - continue - else: - error_report_missing.append((image_instance, missing)) - - if error_report_missing: - - message = ( - "The Texture Set skipped exporting some output maps which are " - "defined in the Output Template. This happens if the Output " - "Templates exports maps from channels which you do not " - "have in your current Substance Painter project.\n\n" - "To allow this enable the *Allow Skipped Output Maps* setting " - "on the instance.\n\n" - f"Instance {instance} skipped exporting output maps:\n" - "" - ) - - for image_instance, missing in error_report_missing: - missing_str = ", ".join(missing) - message += f"- **{image_instance}** skipped: {missing_str}\n" - - raise PublishValidationError( - message=message, - title="Missing output maps" - ) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index d445b0059f..66638b0a2e 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,3 +1,10 @@ name = "substancepainter" title = "Substance Painter" -version = "0.1.1" +version = "0.1.2" + +client_dir = "ayon_substancepainter" + +ayon_required_addons = { + "core": ">=0.3.1", +} +ayon_compatible_addons = {} From 1b05428eb73087b222890509e0a12c0e59a90654 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 10:17:30 +0200 Subject: [PATCH 183/469] expand default settings for readability --- server/settings/main.py | 42 ++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/server/settings/main.py b/server/settings/main.py index d1cee32afa..40e16e7e91 100644 --- a/server/settings/main.py +++ b/server/settings/main.py @@ -268,26 +268,50 @@ DEFAULT_VALUES = { }, "studio_name": "", "studio_code": "", - "environments": '{\n"STUDIO_SW": {\n "darwin": "/mnt/REPO_SW",\n "linux": "/mnt/REPO_SW",\n "windows": "P:/REPO_SW"\n }\n}', + "environments": json.dumps( + { + "STUDIO_SW": { + "darwin": "/mnt/REPO_SW", + "linux": "/mnt/REPO_SW", + "windows": "P:/REPO_SW" + } + }, + indent=4 + ), "tools": DEFAULT_TOOLS_VALUES, - "version_start_category": {"profiles": []}, + "version_start_category": { + "profiles": [] + }, "publish": DEFAULT_PUBLISH_VALUES, "project_folder_structure": json.dumps( { "__project_root__": { "prod": {}, "resources": { - "footage": {"plates": {}, "offline": {}}, + "footage": { + "plates": {}, + "offline": {} + }, "audio": {}, - "art_dept": {}, + "art_dept": {} }, "editorial": {}, - "assets": {"characters": {}, "locations": {}}, - "shots": {}, + "assets": { + "characters": {}, + "locations": {} + }, + "shots": {} } }, - indent=4, + indent=4 ), - "project_plugins": {"windows": [], "darwin": [], "linux": []}, - "project_environments": "{}", + "project_plugins": { + "windows": [], + "darwin": [], + "linux": [] + }, + "project_environments": json.dumps( + {}, + indent=4 + ) } From c1331a4a5ca82334d2e27de19fac129248a7a579 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 15 May 2024 11:30:02 +0300 Subject: [PATCH 184/469] update required addons --- server_addon/houdini/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index e4c2f8b415..899e0628d2 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -5,6 +5,6 @@ version = "0.3.14" client_dir = "ayon_houdini" ayon_required_addons = { - "core": ">=0.3.0", + "core": ">0.3.1", } ayon_compatible_addons = {} From 6c75a2912bcf5e853f101c3e9ca0c7c1cbba9d3a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 15 May 2024 11:30:32 +0300 Subject: [PATCH 185/469] update addon version --- client/ayon_core/addon/base.py | 2 +- server_addon/houdini/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 9cf557f96e..0c436a325e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,7 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), - "houdini": VersionInfo(0, 3, 14), + "houdini": VersionInfo(0, 3, 0), } # Inherit from `object` for Python 2 hosts diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 899e0628d2..9e5fe56e34 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,6 +1,6 @@ name = "houdini" title = "Houdini" -version = "0.3.14" +version = "0.3.0" client_dir = "ayon_houdini" From bad4de2f7c0f1143648d8c90ac18f9ddef0617a6 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:06:53 +0800 Subject: [PATCH 186/469] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../ayon_substancepainter/deploy/plugins/openpype_plugin.py | 2 +- .../ayon_substancepainter/plugins/create/create_textures.py | 4 ++-- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- .../client/ayon_substancepainter/plugins/load/load_mesh.py | 2 +- .../plugins/publish/collect_textureset_images.py | 2 +- server_addon/substancepainter/package.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py index 8ced463367..5a0aff5649 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py @@ -22,7 +22,7 @@ def cleanup_openpype_qt_widgets(): def start_plugin(): from ayon_core.pipeline import install_host - from ayon_core.hosts.substancepainter.api import SubstanceHost + from ayon_substancepainter.api import SubstanceHost install_host(SubstanceHost()) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py index f46afadb5a..248bc00aa3 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py @@ -9,13 +9,13 @@ from ayon_core.lib import ( BoolDef ) -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( get_instances, set_instance, set_instances, remove_instance ) -from ayon_core.hosts.substancepainter.api.lib import get_export_presets +from ayon_substancepainter.api.lib import get_export_presets import substance_painter.project diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 63b1c6c7da..16a6f1bbb8 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -5,7 +5,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( set_instances, set_instance, get_instances diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py index d5aac1191c..e2a48dd5a4 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( imprint_container, set_container_metadata, remove_container_metadata diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py index 20aaa56993..824f2d999f 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py @@ -6,7 +6,7 @@ import ayon_api import substance_painter.textureset from ayon_core.pipeline import publish -from ayon_core.hosts.substancepainter.api.lib import ( +from ayon_substancepainter.api.lib import ( get_parsed_export_maps, strip_template ) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 66638b0a2e..7232a4dbe4 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,6 +1,6 @@ name = "substancepainter" title = "Substance Painter" -version = "0.1.2" +version = "0.2.0" client_dir = "ayon_substancepainter" From 9ee4de380d38a9d586b92e1d4863c40526e13fe8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:21:42 +0800 Subject: [PATCH 187/469] added addon milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 21b1193b07..39dcb6b044 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "substancepainter": VersionInfo(0, 2, 0), } # Inherit from `object` for Python 2 hosts From b2215217e408e6b1643eb49938069bc312c6a9c0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:34:24 +0800 Subject: [PATCH 188/469] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/substancepainter/client/ayon_substancepainter/version.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py new file mode 100644 index 0000000000..4f4a309b30 --- /dev/null +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring Substance Painter addon version.""" +__version__ = "0.2.0" \ No newline at end of file From f476de6e493fac21622cc2919a004711d75d96d1 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:41:57 +0800 Subject: [PATCH 189/469] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index 4f4a309b30..b4293649fe 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring Substance Painter addon version.""" -__version__ = "0.2.0" \ No newline at end of file +"""Package declaring AYON core addon version.""" +__version__ = "0.2.0" From 33d491e1f6afc600b64effa88dfedee600cafeb9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 19:19:07 +0800 Subject: [PATCH 190/469] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index b4293649fe..36fe942532 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" +"""Package declaring Substance Painter addon version.""" __version__ = "0.2.0" From bec84133e2d8c2c88eb14a3651443a16c7867a18 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 20:30:27 +0800 Subject: [PATCH 191/469] rename Openpype to AYON --- .../client/ayon_substancepainter/api/pipeline.py | 2 +- .../plugins/{openpype_plugin.py => ayon_plugin.py} | 12 ++++++------ ...oad_on_first_run.py => ayon_load_on_first_run.py} | 4 ++-- .../plugins/create/create_textures.py | 1 + .../plugins/create/create_workfile.py | 1 + .../client/ayon_substancepainter/version.py | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) rename server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/{openpype_plugin.py => ayon_plugin.py} (73%) rename server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/{openpype_load_on_first_run.py => ayon_load_on_first_run.py} (93%) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py index 6e0ca0145b..47090c4b0a 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py @@ -31,7 +31,7 @@ from ayon_substancepainter import SUBSTANCE_HOST_DIR from . import lib -log = logging.getLogger("ayon_core.hosts.substance") +log = logging.getLogger("ayon_substancepainter") PLUGINS_DIR = os.path.join(SUBSTANCE_HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py similarity index 73% rename from server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 5a0aff5649..1cdcc5073d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -1,6 +1,6 @@ -def cleanup_openpype_qt_widgets(): +def cleanup_ayon_qt_widgets(): """ Workaround for Substance failing to shut down correctly when a Qt window was still open at the time of shutting down. @@ -8,14 +8,14 @@ def cleanup_openpype_qt_widgets(): This seems to work sometimes, but not all the time. """ - # TODO: Create a more reliable method to close down all OpenPype Qt widgets + # TODO: Create a more reliable method to close down all AYON Qt widgets from PySide2 import QtWidgets import substance_painter.ui - # Kill OpenPype Qt widgets - print("Killing OpenPype Qt widgets..") + # Kill AYON Qt widgets + print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("openpype."): + if widget.__module__.startswith("ayon."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) @@ -28,7 +28,7 @@ def start_plugin(): def close_plugin(): from ayon_core.pipeline import uninstall_host - cleanup_openpype_qt_widgets() + cleanup_ayon_qt_widgets() uninstall_host() diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py similarity index 93% rename from server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py index 04b610b4df..666a0e9f05 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py @@ -1,6 +1,6 @@ -"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" +"""Ease the AYON on-boarding process by loading the plug-in on first run""" -OPENPYPE_PLUGIN_NAME = "openpype_plugin" +OPENPYPE_PLUGIN_NAME = "ayon_plugin" def start_plugin(): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py index 248bc00aa3..45c171fb23 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py @@ -28,6 +28,7 @@ class CreateTextures(Creator): icon = "picture-o" default_variant = "Main" + settings_category = "substancepainter" def create(self, product_name, instance_data, pre_create_data): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 16a6f1bbb8..b100e4189d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -22,6 +22,7 @@ class CreateWorkfile(AutoCreator): icon = "document" default_variant = "Main" + settings_category = "substancepainter" def create(self): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index 36fe942532..b4293649fe 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring Substance Painter addon version.""" +"""Package declaring AYON core addon version.""" __version__ = "0.2.0" From 2ac32e71855d08c8596db4500f777742df44eb86 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Wed, 15 May 2024 20:44:54 +0800 Subject: [PATCH 192/469] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 7232a4dbe4..1508225fd8 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -5,6 +5,6 @@ version = "0.2.0" client_dir = "ayon_substancepainter" ayon_required_addons = { - "core": ">=0.3.1", + "core": ">0.3.1", } ayon_compatible_addons = {} From c6a396de4f8850a1acf56125a82a8248a6666fc4 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 15 May 2024 17:15:07 +0200 Subject: [PATCH 193/469] AY-1110 - updated variable to be more descriptive Bump up version --- server_addon/deadline/package.py | 2 +- server_addon/deadline/server/settings/main.py | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/server_addon/deadline/package.py b/server_addon/deadline/package.py index 25ba1c1166..e26734c813 100644 --- a/server_addon/deadline/package.py +++ b/server_addon/deadline/package.py @@ -1,3 +1,3 @@ name = "deadline" title = "Deadline" -version = "0.1.11" +version = "0.1.12" diff --git a/server_addon/deadline/server/settings/main.py b/server_addon/deadline/server/settings/main.py index 5d42b9b1ef..47ad72a86f 100644 --- a/server_addon/deadline/server/settings/main.py +++ b/server_addon/deadline/server/settings/main.py @@ -38,10 +38,9 @@ class ServerItemSubmodel(BaseSettingsModel): name: str = SettingsField(title="Name") value: str = SettingsField(title="Url") require_authentication: bool = SettingsField( - False, - title="Require authentication") - ssl: bool = SettingsField(False, - title="SSL") + False, title="Require authentication") + not_verify_ssl: bool = SettingsField( + False, title="Don't verify SSL") class DeadlineSettings(BaseSettingsModel): @@ -78,7 +77,7 @@ DEFAULT_VALUES = { "name": "default", "value": "http://127.0.0.1:8082", "require_authentication": False, - "ssl": False + "not_verify_ssl": False } ], "deadline_server": "default", From e9697884e98ce02dc603fdae81155e114370e1a3 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 15 May 2024 17:18:13 +0200 Subject: [PATCH 194/469] AY-1110 - use field from Setttings instead of OPENPYPE_DONT_VERIFY_SSL --- .../deadline/abstract_submit_deadline.py | 35 +++++++------------ .../publish/collect_user_credentials.py | 3 ++ .../publish/submit_blender_deadline.py | 5 +-- .../publish/submit_celaction_deadline.py | 6 ++-- .../plugins/publish/submit_fusion_deadline.py | 3 +- .../plugins/publish/submit_max_deadline.py | 16 ++++++--- .../plugins/publish/submit_maya_deadline.py | 18 +++++++--- .../plugins/publish/submit_nuke_deadline.py | 8 +++-- .../publish/submit_publish_cache_job.py | 5 +-- .../plugins/publish/submit_publish_job.py | 5 +-- 10 files changed, 62 insertions(+), 42 deletions(-) diff --git a/client/ayon_core/modules/deadline/abstract_submit_deadline.py b/client/ayon_core/modules/deadline/abstract_submit_deadline.py index 00e51100bc..564966b6a0 100644 --- a/client/ayon_core/modules/deadline/abstract_submit_deadline.py +++ b/client/ayon_core/modules/deadline/abstract_submit_deadline.py @@ -29,15 +29,11 @@ from ayon_core.pipeline.publish.lib import ( JSONDecodeError = getattr(json.decoder, "JSONDecodeError", ValueError) -# TODO both 'requests_post' and 'requests_get' should not set 'verify' based -# on environment variable. This should be done in a more controlled way, -# e.g. each deadline url could have checkbox to enabled/disable -# ssl verification. def requests_post(*args, **kwargs): """Wrap request post method. - Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment - variable is found. This is useful when Deadline server is + Disabling SSL certificate validation if ``verify`` kwarg is set to False. + This is useful when Deadline server is running with self-signed certificates and its certificate is not added to trusted certificates on client machines. @@ -46,10 +42,6 @@ def requests_post(*args, **kwargs): of defense SSL is providing, and it is not recommended. """ - if 'verify' not in kwargs: - kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", - True) else True # noqa - auth = kwargs.get("auth") if auth: kwargs["auth"] = tuple(auth) # explicit cast to tuple @@ -61,8 +53,8 @@ def requests_post(*args, **kwargs): def requests_get(*args, **kwargs): """Wrap request get method. - Disabling SSL certificate validation if ``DONT_VERIFY_SSL`` environment - variable is found. This is useful when Deadline server is + Disabling SSL certificate validation if ``verify`` kwarg is set to False. + This is useful when Deadline server is running with self-signed certificates and its certificate is not added to trusted certificates on client machines. @@ -71,9 +63,6 @@ def requests_get(*args, **kwargs): of defense SSL is providing, and it is not recommended. """ - if 'verify' not in kwargs: - kwargs['verify'] = False if os.getenv("OPENPYPE_DONT_VERIFY_SSL", - True) else True # noqa auth = kwargs.get("auth") if auth: kwargs["auth"] = tuple(auth) @@ -466,7 +455,8 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, self.aux_files = self.get_aux_files() auth = instance.data["deadline"]["auth"] - job_id = self.process_submission(auth) + verify = instance.data["deadline"]["verify"] + job_id = self.process_submission(auth, verify) self.log.info("Submitted job to Deadline: {}.".format(job_id)) # TODO: Find a way that's more generic and not render type specific @@ -479,10 +469,10 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, job_info=render_job_info, plugin_info=render_plugin_info ) - render_job_id = self.submit(payload, auth) + render_job_id = self.submit(payload, auth, verify) self.log.info("Render job id: %s", render_job_id) - def process_submission(self, auth=None): + def process_submission(self, auth=None, verify=True): """Process data for submission. This takes Deadline JobInfo, PluginInfo, AuxFile, creates payload @@ -493,7 +483,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """ payload = self.assemble_payload() - return self.submit(payload, auth) + return self.submit(payload, auth, verify) @abstractmethod def get_job_info(self): @@ -583,7 +573,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, "AuxFiles": aux_files or self.aux_files } - def submit(self, payload, auth): + def submit(self, payload, auth, verify): """Submit payload to Deadline API end-point. This takes payload in the form of JSON file and POST it to @@ -592,6 +582,7 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, Args: payload (dict): dict to become json in deadline submission. auth (tuple): (username, password) + verify (bool): verify SSL certificate if present Returns: str: resulting Deadline job id. @@ -601,8 +592,8 @@ class AbstractSubmitDeadline(pyblish.api.InstancePlugin, """ url = "{}/api/jobs".format(self._deadline_url) - response = requests_post(url, json=payload, - auth=auth) + response = requests_post( + url, json=payload, auth=auth, verify=verify) if not response.ok: self.log.error("Submission failed!") self.log.error(response.status_code) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 5d03523c89..99d75ecb9e 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -76,6 +76,9 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): ) instance.data["deadline"]["auth"] = None + instance.data["deadline"]["verify"] = ( + not deadline_info["not_verify_ssl"]) + if not deadline_info["require_authentication"]: return # TODO import 'get_addon_site_settings' when available diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py index f5805beb5c..311dbcedd5 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_blender_deadline.py @@ -174,8 +174,9 @@ class BlenderSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, instance.data["toBeRenderedOn"] = "deadline" payload = self.assemble_payload() - return self.submit(payload, - auth=instance.data["deadline"]["auth"]) + auth = instance.data["deadline"]["auth"] + verify = instance.data["deadline"]["verify"] + return self.submit(payload, auth=auth, verify=verify) def from_published_scene(self): """ diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py index 2220442dac..a17bf0c3ef 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_celaction_deadline.py @@ -193,9 +193,11 @@ class CelactionSubmitDeadline(pyblish.api.InstancePlugin): self.expected_files(instance, render_path) self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) - + auth = instance.data["deadline"]["auth"] + verify = instance.data["deadline"]["verify"] response = requests_post(self.deadline_url, json=payload, - auth=instance.data["deadline"]["require_authentication"]) + auth=auth, + verify=verify) if not response.ok: self.log.error( diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index e9b93a47cd..6c70119628 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -242,7 +242,8 @@ class FusionSubmitDeadline( # E.g. http://192.168.0.1:8082/api/jobs url = "{}/api/jobs".format(deadline_url) auth = instance.data["deadline"]["auth"] - response = requests_post(url, json=payload, auth=auth) + verify = instance.data["deadline"]["verify"] + response = requests_post(url, json=payload, auth=auth, verify=verify) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py index e9f6c382c5..ababb01285 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py @@ -181,19 +181,27 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, self.log.debug("Submitting 3dsMax render..") project_settings = instance.context.data["project_settings"] + auth = instance.data["deadline"]["auth"] + verify = instance.data["deadline"]["verify"] if instance.data.get("multiCamera"): self.log.debug("Submitting jobs for multiple cameras..") payload = self._use_published_name_for_multiples( payload_data, project_settings) job_infos, plugin_infos = payload for job_info, plugin_info in zip(job_infos, plugin_infos): - self.submit(self.assemble_payload(job_info, plugin_info), - instance.data["deadline"]["auth"]) + self.submit( + self.assemble_payload(job_info, plugin_info), + auth=auth, + verify=verify + ) else: payload = self._use_published_name(payload_data, project_settings) job_info, plugin_info = payload - self.submit(self.assemble_payload(job_info, plugin_info), - instance.data["deadline"]["auth"]) + self.submit( + self.assemble_payload(job_info, plugin_info), + auth=auth, + verify=verify + ) def _use_published_name(self, data, project_settings): # Not all hosts can import these modules. diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py index 250dc8b7ea..f1bc1cb2be 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -292,7 +292,7 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, return plugin_payload - def process_submission(self, auth=None): + def process_submission(self, auth=None, verify=True): from maya import cmds instance = self._instance @@ -332,8 +332,10 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, if "vrayscene" in instance.data["families"]: self.log.debug("Submitting V-Ray scene render..") vray_export_payload = self._get_vray_export_payload(payload_data) + export_job = self.submit(vray_export_payload, - instance.data["deadline"]["auth"]) + auth=auth, + verify=verify) payload = self._get_vray_render_payload(payload_data) @@ -353,7 +355,8 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, # Submit main render job job_info, plugin_info = payload self.submit(self.assemble_payload(job_info, plugin_info), - instance.data["deadline"]["auth"]) + auth=auth, + verify=verify) def _tile_render(self, payload): """Submit as tile render per frame with dependent assembly jobs.""" @@ -557,13 +560,18 @@ class MayaSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, # Submit assembly jobs assembly_job_ids = [] num_assemblies = len(assembly_payloads) + auth = instance.data["deadline"]["auth"] + verify = instance.data["deadline"]["verify"] for i, payload in enumerate(assembly_payloads): self.log.debug( "submitting assembly job {} of {}".format(i + 1, num_assemblies) ) - assembly_job_id = self.submit(payload, - instance.data["deadline"]["auth"]) + assembly_job_id = self.submit( + payload, + auth=auth, + verify=verify + ) assembly_job_ids.append(assembly_job_id) instance.data["assemblySubmissionJobs"] = assembly_job_ids diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index ef744ae1e1..db35c2ae67 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -424,8 +424,12 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, self.log.debug("__ expectedFiles: `{}`".format( instance.data["expectedFiles"])) auth = instance.data["deadline"]["auth"] - response = requests_post(self.deadline_url, json=payload, timeout=10, - auth=auth) + verify = instance.data["deadline"]["verify"] + response = requests_post(self.deadline_url, + json=payload, + timeout=10, + auth=auth, + verify=verify) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py index ce15eda9a0..103f1355da 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_cache_job.py @@ -210,8 +210,9 @@ class ProcessSubmittedCacheJobOnFarm(pyblish.api.InstancePlugin, url = "{}/api/jobs".format(self.deadline_url) auth = instance.data["deadline"]["auth"] - response = requests_post(url, json=payload, timeout=10, - auth=auth) + verify = instance.data["deadline"]["verify"] + response = requests_post( + url, json=payload, timeout=10, auth=auth, verify=verify) if not response.ok: raise Exception(response.text) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py index 0f505dce78..64313c5c4d 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_publish_job.py @@ -304,8 +304,9 @@ class ProcessSubmittedJobOnFarm(pyblish.api.InstancePlugin, url = "{}/api/jobs".format(self.deadline_url) auth = instance.data["deadline"]["auth"] - response = requests_post(url, json=payload, timeout=10, - auth=auth) + verify = instance.data["deadline"]["verify"] + response = requests_post( + url, json=payload, timeout=10, auth=auth, verify=verify) if not response.ok: raise Exception(response.text) From 61fcc3ddecc2121d4947344215cce3dbff8caff5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 15 May 2024 17:47:37 +0200 Subject: [PATCH 195/469] AY-1110 - use get_addon_site_settings from ayon_api Method was not available previously --- .../deadline/plugins/publish/collect_user_credentials.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 99d75ecb9e..30e3703b58 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -12,7 +12,7 @@ Provides: """ import pyblish.api -from ayon_api import get_server_api_connection +from ayon_api import get_addon_site_settings from ayon_core.modules.deadline.deadline_module import DeadlineModule from ayon_core.modules.deadline import __version__ @@ -81,9 +81,8 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): if not deadline_info["require_authentication"]: return - # TODO import 'get_addon_site_settings' when available - # in public 'ayon_api' - local_settings = get_server_api_connection().get_addon_site_settings( + + local_settings = get_addon_site_settings( DeadlineModule.name, __version__) local_settings = local_settings["local_settings"] for server_info in local_settings: From b300db793a9af3d93e093df074dbf07685440f82 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:28:19 +0200 Subject: [PATCH 196/469] move deprecated functions at the end of file --- client/ayon_core/pipeline/colorspace.py | 215 ++++++++++++------------ 1 file changed, 106 insertions(+), 109 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 3503d0c534..c081b58752 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -195,17 +195,6 @@ def get_colorspace_name_from_filepath( return colorspace_name -# TODO: remove this in future - backward compatibility -@deprecated("get_imageio_file_rules_colorspace_from_filepath") -def get_imageio_colorspace_from_filepath(*args, **kwargs): - return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) - -# TODO: remove this in future - backward compatibility -@deprecated("get_imageio_file_rules_colorspace_from_filepath") -def get_colorspace_from_filepath(*args, **kwargs): - return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) - - def get_imageio_file_rules_colorspace_from_filepath( filepath, host_name, @@ -394,21 +383,6 @@ def validate_imageio_colorspace_in_config(config_path, colorspace_name): return True -# TODO: remove this in future - backward compatibility -@deprecated("_get_wrapped_with_subprocess") -def get_data_subprocess(config_path, data_type): - """[Deprecated] Get data via subprocess - - Wrapper for Python 2 hosts. - - Args: - config_path (str): path leading to config.ocio file - """ - return _get_wrapped_with_subprocess( - "config", data_type, in_path=config_path, - ) - - def _get_wrapped_with_subprocess(command_group, command, **kwargs): """Get data via subprocess @@ -673,24 +647,6 @@ def get_colorspaces_enumerator_items( return labeled_colorspaces -# TODO: remove this in future - backward compatibility -@deprecated("_get_wrapped_with_subprocess") -def get_colorspace_data_subprocess(config_path): - """[Deprecated] Get colorspace data via subprocess - - Wrapper for Python 2 hosts. - - Args: - config_path (str): path leading to config.ocio file - - Returns: - dict: colorspace and family in couple - """ - return _get_wrapped_with_subprocess( - "config", "get_colorspace", in_path=config_path - ) - - def get_ocio_config_views(config_path): """Get all viewer data @@ -716,71 +672,6 @@ def get_ocio_config_views(config_path): return _get_views_data(config_path) -# TODO: remove this in future - backward compatibility -@deprecated("_get_wrapped_with_subprocess") -def get_views_data_subprocess(config_path): - """[Deprecated] Get viewers data via subprocess - - Wrapper for Python 2 hosts. - - Args: - config_path (str): path leading to config.ocio file - - Returns: - dict: `display/viewer` and viewer data - """ - return _get_wrapped_with_subprocess( - "config", "get_views", in_path=config_path - ) - - -@deprecated("get_imageio_config_preset") -def get_imageio_config( - project_name, - host_name, - project_settings=None, - anatomy_data=None, - anatomy=None, - env=None -): - """Returns config data from settings - - Config path is formatted in `path` key - and original settings input is saved into `template` key. - - Deprecated: - Deprecated since '0.3.1' . Use `get_imageio_config_preset` instead. - - Args: - project_name (str): project name - host_name (str): host name - project_settings (Optional[dict]): Project settings. - anatomy_data (Optional[dict]): anatomy formatting data. - anatomy (Optional[Anatomy]): Anatomy object. - env (Optional[dict]): Environment variables. - - Returns: - dict: config path data or empty dict - - """ - if not anatomy_data: - from .context_tools import get_current_context_template_data - anatomy_data = get_current_context_template_data() - - task_name = anatomy_data.get("task", {}).get("name") - folder_path = anatomy_data.get("folder", {}).get("path") - return get_imageio_config_preset( - project_name, - folder_path, - task_name, - host_name, - anatomy=anatomy, - project_settings=project_settings, - template_data=anatomy_data, - env=env, - ) - - def _get_global_config_data( project_name, host_name, @@ -1437,3 +1328,109 @@ def get_current_context_imageio_config_preset( template_data=template_data, env=env, ) + + +# --- Deprecated functions --- +@deprecated("get_imageio_file_rules_colorspace_from_filepath") +def get_imageio_colorspace_from_filepath(*args, **kwargs): + return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) + + +@deprecated("get_imageio_file_rules_colorspace_from_filepath") +def get_colorspace_from_filepath(*args, **kwargs): + return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) + + +@deprecated("_get_wrapped_with_subprocess") +def get_colorspace_data_subprocess(config_path): + """[Deprecated] Get colorspace data via subprocess + + Wrapper for Python 2 hosts. + + Args: + config_path (str): path leading to config.ocio file + + Returns: + dict: colorspace and family in couple + """ + return _get_wrapped_with_subprocess( + "config", "get_colorspace", in_path=config_path + ) + + +@deprecated("_get_wrapped_with_subprocess") +def get_views_data_subprocess(config_path): + """[Deprecated] Get viewers data via subprocess + + Wrapper for Python 2 hosts. + + Args: + config_path (str): path leading to config.ocio file + + Returns: + dict: `display/viewer` and viewer data + """ + return _get_wrapped_with_subprocess( + "config", "get_views", in_path=config_path + ) + + +@deprecated("_get_wrapped_with_subprocess") +def get_data_subprocess(config_path, data_type): + """[Deprecated] Get data via subprocess + + Wrapper for Python 2 hosts. + + Args: + config_path (str): path leading to config.ocio file + """ + return _get_wrapped_with_subprocess( + "config", data_type, in_path=config_path, + ) + + +@deprecated("get_imageio_config_preset") +def get_imageio_config( + project_name, + host_name, + project_settings=None, + anatomy_data=None, + anatomy=None, + env=None +): + """Returns config data from settings + + Config path is formatted in `path` key + and original settings input is saved into `template` key. + + Deprecated: + Deprecated since '0.3.1' . Use `get_imageio_config_preset` instead. + + Args: + project_name (str): project name + host_name (str): host name + project_settings (Optional[dict]): Project settings. + anatomy_data (Optional[dict]): anatomy formatting data. + anatomy (Optional[Anatomy]): Anatomy object. + env (Optional[dict]): Environment variables. + + Returns: + dict: config path data or empty dict + + """ + if not anatomy_data: + from .context_tools import get_current_context_template_data + anatomy_data = get_current_context_template_data() + + task_name = anatomy_data.get("task", {}).get("name") + folder_path = anatomy_data.get("folder", {}).get("path") + return get_imageio_config_preset( + project_name, + folder_path, + task_name, + host_name, + anatomy=anatomy, + project_settings=project_settings, + template_data=anatomy_data, + env=env, + ) From 4d398e21371ff8a840d14f35887a4107bbcf46f1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:32:04 +0200 Subject: [PATCH 197/469] added functions that are using 'PyOpenColorIO' --- client/ayon_core/pipeline/colorspace.py | 170 ++++++++++++++++++++++++ 1 file changed, 170 insertions(+) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index c081b58752..562e698f75 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -1294,6 +1294,176 @@ def _get_display_view_colorspace_subprocess(config_path, display, view): return json.load(f) +# --- Implementation of logic using 'PyOpenColorIO' --- +def _get_ocio_config(config_path): + """Helper function to create OCIO config object. + + Args: + config_path (str): Path to config. + + Returns: + PyOpenColorIO.Config: OCIO config for the confing path. + + """ + import PyOpenColorIO + + config_path = os.path.abspath(config_path) + + if not os.path.isfile(config_path): + raise IOError("Input path should be `config.ocio` file") + + return PyOpenColorIO.Config.CreateFromFile(config_path) + + +def _get_config_file_rules_colorspace_from_filepath(config_path, filepath): + """Return found colorspace data found in v2 file rules. + + Args: + config_path (str): path string leading to config.ocio + filepath (str): path string leading to v2 file rules + + Raises: + IOError: Input config does not exist. + + Returns: + dict: aggregated available colorspaces + + """ + config = _get_ocio_config(config_path) + + # TODO: use `parseColorSpaceFromString` instead if ocio v1 + return config.getColorSpaceFromFilepath(str(filepath)) + + +def _get_config_version_data(config_path): + """Return major and minor version info. + + Args: + config_path (str): path string leading to config.ocio + + Raises: + IOError: Input config does not exist. + + Returns: + dict: minor and major keys with values + + """ + config = _get_ocio_config(config_path) + + return { + "major": config.getMajorVersion(), + "minor": config.getMinorVersion() + } + + +def _get_display_view_colorspace_name(config_path, display, view): + """Returns the colorspace attribute of the (display, view) pair. + + Args: + config_path (str): path string leading to config.ocio + display (str): display name e.g. "ACES" + view (str): view name e.g. "sRGB" + + Raises: + IOError: Input config does not exist. + + Returns: + str: view color space name e.g. "Output - sRGB" + + """ + config = _get_ocio_config(config_path) + return config.getDisplayViewColorSpaceName(display, view) + + +def _get_ocio_config_colorspaces(config_path): + """Return all found colorspace data. + + Args: + config_path (str): path string leading to config.ocio + + Raises: + IOError: Input config does not exist. + + Returns: + dict: aggregated available colorspaces + + """ + config = _get_ocio_config(config_path) + + colorspace_data = { + "roles": {}, + "colorspaces": { + color.getName(): { + "family": color.getFamily(), + "categories": list(color.getCategories()), + "aliases": list(color.getAliases()), + "equalitygroup": color.getEqualityGroup(), + } + for color in config.getColorSpaces() + }, + "displays_views": { + f"{view} ({display})": { + "display": display, + "view": view + + } + for display in config.getDisplays() + for view in config.getViews(display) + }, + "looks": {} + } + + # add looks + looks = config.getLooks() + if looks: + colorspace_data["looks"] = { + look.getName(): {"process_space": look.getProcessSpace()} + for look in looks + } + + # add roles + roles = config.getRoles() + if roles: + colorspace_data["roles"] = { + role: {"colorspace": colorspace} + for (role, colorspace) in roles + } + + return colorspace_data + + +def _get_ocio_config_views(config_path): + """Return all found viewer data. + + Args: + config_path (str): path string leading to config.ocio + + Raises: + IOError: Input config does not exist. + + Returns: + dict: aggregated available viewers + + """ + config = _get_ocio_config(config_path) + + output = {} + for display in config.getDisplays(): + for view in config.getViews(display): + colorspace = config.getDisplayViewColorSpaceName(display, view) + # Special token. See https://opencolorio.readthedocs.io/en/latest/guides/authoring/authoring.html#shared-views # noqa + if colorspace == "": + colorspace = display + + output[f"{display}/{view}"] = { + "display": display, + "view": view, + "colorspace": colorspace + } + + return output + + # --- Current context functions --- def get_current_context_imageio_config_preset( anatomy=None, From b0340f4f3b94e1dae75305410dda2c33c70ad03a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:35:42 +0200 Subject: [PATCH 198/469] renamed 'compatibility_check' to 'has_compatible_ocio_package' --- client/ayon_core/pipeline/colorspace.py | 58 ++++++++++++++++--------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 562e698f75..a503c37101 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -107,6 +107,27 @@ def _make_temp_json_file(): os.remove(temporary_json_filepath) +def has_compatible_ocio_package(): + """Current process has available compatible 'PyOpenColorIO'. + + Returns: + bool: True if compatible package is available. + + """ + if CachedData.has_compatible_ocio_package is not None: + return CachedData.has_compatible_ocio_package + + try: + import PyOpenColorIO # noqa: F401 + # TODO validate 'PyOpenColorIO' version + CachedData.has_compatible_ocio_package = True + except ImportError: + CachedData.has_compatible_ocio_package = False + + # compatible + return CachedData.has_compatible_ocio_package + + def get_ocio_config_script_path(): """Get path to ocio wrapper script @@ -261,7 +282,7 @@ def get_config_file_rules_colorspace_from_filepath(config_path, filepath): Returns: Union[str, None]: matching colorspace name """ - if not compatibility_check(): + if not has_compatible_ocio_package(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess result_data = _get_wrapped_with_subprocess( @@ -418,28 +439,12 @@ def _get_wrapped_with_subprocess(command_group, command, **kwargs): return json.load(f_) -# TODO: this should be part of ocio_wrapper.py -def compatibility_check(): - """Making sure PyOpenColorIO is importable""" - if CachedData.has_compatible_ocio_package is not None: - return CachedData.has_compatible_ocio_package - - try: - import PyOpenColorIO # noqa: F401 - CachedData.has_compatible_ocio_package = True - except ImportError: - CachedData.has_compatible_ocio_package = False - - # compatible - return CachedData.has_compatible_ocio_package - - # TODO: this should be part of ocio_wrapper.py def compatibility_check_config_version(config_path, major=1, minor=None): """Making sure PyOpenColorIO config version is compatible""" if not CachedData.config_version_data.get(config_path): - if compatibility_check(): + if has_compatible_ocio_package(): # TODO: refactor this so it is not imported but part of this file from ayon_core.scripts.ocio_wrapper import _get_version_data @@ -479,7 +484,7 @@ def get_ocio_config_colorspaces(config_path): dict: colorspace and family in couple """ if not CachedData.ocio_config_colorspaces.get(config_path): - if not compatibility_check(): + if not has_compatible_ocio_package(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess config_colorspaces = _get_wrapped_with_subprocess( @@ -659,7 +664,7 @@ def get_ocio_config_views(config_path): Returns: dict: `display/viewer` and viewer data """ - if not compatibility_check(): + if not has_compatible_ocio_package(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess return _get_wrapped_with_subprocess( @@ -1250,7 +1255,7 @@ def get_display_view_colorspace_name(config_path, display, view): str: View color space name. e.g. "Output - sRGB" """ - if not compatibility_check(): + if not has_compatible_ocio_package(): # python environment is not compatible with PyOpenColorIO # needs to be run in subprocess return _get_display_view_colorspace_subprocess( @@ -1501,6 +1506,17 @@ def get_current_context_imageio_config_preset( # --- Deprecated functions --- +@deprecated("has_compatible_ocio_package") +def compatibility_check(): + """Making sure PyOpenColorIO is importable + + Deprecated: + Deprecated since '0.3.2'. Use `has_compatible_ocio_package` instead. + """ + + return has_compatible_ocio_package() + + @deprecated("get_imageio_file_rules_colorspace_from_filepath") def get_imageio_colorspace_from_filepath(*args, **kwargs): return get_imageio_file_rules_colorspace_from_filepath(*args, **kwargs) From c668ab49397b564dab51a9f901ef9e76a4974d87 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:38:41 +0200 Subject: [PATCH 199/469] modified ocio wrapper to use new functions --- client/ayon_core/scripts/ocio_wrapper.py | 480 +++++++---------------- 1 file changed, 142 insertions(+), 338 deletions(-) diff --git a/client/ayon_core/scripts/ocio_wrapper.py b/client/ayon_core/scripts/ocio_wrapper.py index 0a78e33c1f..9cbab32956 100644 --- a/client/ayon_core/scripts/ocio_wrapper.py +++ b/client/ayon_core/scripts/ocio_wrapper.py @@ -1,28 +1,31 @@ """OpenColorIO Wrapper. -Only to be interpreted by Python 3. It is run in subprocess in case -Python 2 hosts needs to use it. Or it is used as module for Python 3 -processing. - -Providing functionality: -- get_colorspace - console command - python 2 - - returning all available color spaces - found in input config path. -- _get_colorspace_data - python 3 - module function - - returning all available colorspaces - found in input config path. -- get_views - console command - python 2 - - returning all available viewers - found in input config path. -- _get_views_data - python 3 - module function - - returning all available viewers - found in input config path. +Receive OpenColorIO information and store it in JSON format for processed +that don't have access to OpenColorIO or their version of OpenColorIO is +not compatible. """ -import click import json from pathlib import Path -import PyOpenColorIO as ocio + +import click + +from ayon_core.pipeline.colorspace import ( + has_compatible_ocio_package, + get_display_view_colorspace_name, + get_config_file_rules_colorspace_from_filepath, + get_config_version_data, + get_ocio_config_views, + get_ocio_config_colorspaces, +) + + +def _save_output_to_json_file(output, output_path): + json_path = Path(output_path) + with open(json_path, "w") as stream: + json.dump(output, stream) + + print(f"Data are saved to '{json_path}'") @click.group() @@ -51,383 +54,184 @@ def colorspace(): @config.command( - name="get_colorspace", - help=( - "return all colorspaces from config file " - "--path input arg is required" - ) -) -@click.option("--in_path", required=True, - help="path where to read ocio config file", - type=click.Path(exists=True)) -@click.option("--out_path", required=True, - help="path where to write output json file", - type=click.Path()) -def get_colorspace(in_path, out_path): + name="get_ocio_config_colorspaces", + help="return all colorspaces from config file") +@click.option( + "--config_path", + required=True, + help="OCIO config path to read ocio config file.", + type=click.Path(exists=True)) +@click.option( + "--output_path", + required=True, + help="path where to write output json file", + type=click.Path()) +def _get_ocio_config_colorspaces(config_path, output_path): """Aggregate all colorspace to file. - Python 2 wrapped console command - Args: - in_path (str): config file path string - out_path (str): temp json file path string + config_path (str): config file path string + output_path (str): temp json file path string Example of use: > pyton.exe ./ocio_wrapper.py config get_colorspace - --in_path= --out_path= + --config_path --output_path """ - json_path = Path(out_path) - - out_data = _get_colorspace_data(in_path) - - with open(json_path, "w") as f_: - json.dump(out_data, f_) - - print(f"Colorspace data are saved to '{json_path}'") - - -def _get_colorspace_data(config_path): - """Return all found colorspace data. - - Args: - config_path (str): path string leading to config.ocio - - Raises: - IOError: Input config does not exist. - - Returns: - dict: aggregated available colorspaces - """ - config_path = Path(config_path) - - if not config_path.is_file(): - raise IOError( - f"Input path `{config_path}` should be `config.ocio` file") - - config = ocio.Config().CreateFromFile(str(config_path)) - - colorspace_data = { - "roles": {}, - "colorspaces": { - color.getName(): { - "family": color.getFamily(), - "categories": list(color.getCategories()), - "aliases": list(color.getAliases()), - "equalitygroup": color.getEqualityGroup(), - } - for color in config.getColorSpaces() - }, - "displays_views": { - f"{view} ({display})": { - "display": display, - "view": view - - } - for display in config.getDisplays() - for view in config.getViews(display) - }, - "looks": {} - } - - # add looks - looks = config.getLooks() - if looks: - colorspace_data["looks"] = { - look.getName(): {"process_space": look.getProcessSpace()} - for look in looks - } - - # add roles - roles = config.getRoles() - if roles: - colorspace_data["roles"] = { - role: {"colorspace": colorspace} - for (role, colorspace) in roles - } - - return colorspace_data + _save_output_to_json_file( + get_ocio_config_colorspaces(config_path), + output_path + ) @config.command( - name="get_views", - help=( - "return all viewers from config file " - "--path input arg is required" - ) -) -@click.option("--in_path", required=True, - help="path where to read ocio config file", - type=click.Path(exists=True)) -@click.option("--out_path", required=True, - help="path where to write output json file", - type=click.Path()) -def get_views(in_path, out_path): + name="get_ocio_config_views", + help="All viewers from config file") +@click.option( + "--config_path", + required=True, + help="OCIO config path to read ocio config file.", + type=click.Path(exists=True)) +@click.option( + "--output_path", + required=True, + help="path where to write output json file", + type=click.Path()) +def _get_ocio_config_views(config_path, output_path): """Aggregate all viewers to file. - Python 2 wrapped console command - Args: - in_path (str): config file path string - out_path (str): temp json file path string + config_path (str): config file path string + output_path (str): temp json file path string Example of use: > pyton.exe ./ocio_wrapper.py config get_views \ - --in_path= --out_path= + --config_path --output """ - json_path = Path(out_path) - - out_data = _get_views_data(in_path) - - with open(json_path, "w") as f_: - json.dump(out_data, f_) - - print(f"Viewer data are saved to '{json_path}'") - - -def _get_views_data(config_path): - """Return all found viewer data. - - Args: - config_path (str): path string leading to config.ocio - - Raises: - IOError: Input config does not exist. - - Returns: - dict: aggregated available viewers - """ - config_path = Path(config_path) - - if not config_path.is_file(): - raise IOError("Input path should be `config.ocio` file") - - config = ocio.Config().CreateFromFile(str(config_path)) - - data_ = {} - for display in config.getDisplays(): - for view in config.getViews(display): - colorspace = config.getDisplayViewColorSpaceName(display, view) - # Special token. See https://opencolorio.readthedocs.io/en/latest/guides/authoring/authoring.html#shared-views # noqa - if colorspace == "": - colorspace = display - - data_[f"{display}/{view}"] = { - "display": display, - "view": view, - "colorspace": colorspace - } - - return data_ + _save_output_to_json_file( + get_ocio_config_views(config_path), + output_path + ) @config.command( - name="get_version", - help=( - "return major and minor version from config file " - "--config_path input arg is required" - "--out_path input arg is required" - ) -) -@click.option("--config_path", required=True, - help="path where to read ocio config file", - type=click.Path(exists=True)) -@click.option("--out_path", required=True, - help="path where to write output json file", - type=click.Path()) -def get_version(config_path, out_path): + name="get_config_version_data", + help="Get major and minor version from config file") +@click.option( + "--config_path", + required=True, + help="OCIO config path to read ocio config file.", + type=click.Path(exists=True)) +@click.option( + "--output_path", + required=True, + help="path where to write output json file", + type=click.Path()) +def _get_config_version_data(config_path, output_path): """Get version of config. - Python 2 wrapped console command - Args: config_path (str): ocio config file path string - out_path (str): temp json file path string + output_path (str): temp json file path string Example of use: > pyton.exe ./ocio_wrapper.py config get_version \ - --config_path= --out_path= + --config_path --output_path """ - json_path = Path(out_path) - - out_data = _get_version_data(config_path) - - with open(json_path, "w") as f_: - json.dump(out_data, f_) - - print(f"Config version data are saved to '{json_path}'") - - -def _get_version_data(config_path): - """Return major and minor version info. - - Args: - config_path (str): path string leading to config.ocio - - Raises: - IOError: Input config does not exist. - - Returns: - dict: minor and major keys with values - """ - config_path = Path(config_path) - - if not config_path.is_file(): - raise IOError("Input path should be `config.ocio` file") - - config = ocio.Config().CreateFromFile(str(config_path)) - - return { - "major": config.getMajorVersion(), - "minor": config.getMinorVersion() - } + _save_output_to_json_file( + get_config_version_data(config_path), + output_path + ) @colorspace.command( name="get_config_file_rules_colorspace_from_filepath", - help=( - "return colorspace from filepath " - "--config_path - ocio config file path (input arg is required) " - "--filepath - any file path (input arg is required) " - "--out_path - temp json file path (input arg is required)" - ) -) -@click.option("--config_path", required=True, - help="path where to read ocio config file", - type=click.Path(exists=True)) -@click.option("--filepath", required=True, - help="path to file to get colorspace from", - type=click.Path()) -@click.option("--out_path", required=True, - help="path where to write output json file", - type=click.Path()) -def get_config_file_rules_colorspace_from_filepath( - config_path, filepath, out_path + help="Colorspace file rules from filepath") +@click.option( + "--config_path", + required=True, + help="OCIO config path to read ocio config file.", + type=click.Path(exists=True)) +@click.option( + "--filepath", + equired=True, + help="Path to file to get colorspace from.", + type=click.Path()) +@click.option( + "--output_path", + required=True, + help="Path where to write output json file.", + type=click.Path()) +def _get_config_file_rules_colorspace_from_filepath( + config_path, filepath, output_path ): """Get colorspace from file path wrapper. - Python 2 wrapped console command - Args: config_path (str): config file path string filepath (str): path string leading to file - out_path (str): temp json file path string + output_path (str): temp json file path string Example of use: - > pyton.exe ./ocio_wrapper.py \ + > python.exe ./ocio_wrapper.py \ colorspace get_config_file_rules_colorspace_from_filepath \ - --config_path= --filepath= --out_path= + --config_path --filepath --output_path """ - json_path = Path(out_path) - - colorspace = _get_config_file_rules_colorspace_from_filepath( - config_path, filepath) - - with open(json_path, "w") as f_: - json.dump(colorspace, f_) - - print(f"Colorspace name is saved to '{json_path}'") - - -def _get_config_file_rules_colorspace_from_filepath(config_path, filepath): - """Return found colorspace data found in v2 file rules. - - Args: - config_path (str): path string leading to config.ocio - filepath (str): path string leading to v2 file rules - - Raises: - IOError: Input config does not exist. - - Returns: - dict: aggregated available colorspaces - """ - config_path = Path(config_path) - - if not config_path.is_file(): - raise IOError( - f"Input path `{config_path}` should be `config.ocio` file") - - config = ocio.Config().CreateFromFile(str(config_path)) - - # TODO: use `parseColorSpaceFromString` instead if ocio v1 - colorspace = config.getColorSpaceFromFilepath(str(filepath)) - - return colorspace - - -def _get_display_view_colorspace_name(config_path, display, view): - """Returns the colorspace attribute of the (display, view) pair. - - Args: - config_path (str): path string leading to config.ocio - display (str): display name e.g. "ACES" - view (str): view name e.g. "sRGB" - - - Raises: - IOError: Input config does not exist. - - Returns: - view color space name (str) e.g. "Output - sRGB" - """ - - config_path = Path(config_path) - - if not config_path.is_file(): - raise IOError("Input path should be `config.ocio` file") - - config = ocio.Config.CreateFromFile(str(config_path)) - colorspace = config.getDisplayViewColorSpaceName(display, view) - - return colorspace + _save_output_to_json_file( + get_config_file_rules_colorspace_from_filepath(config_path, filepath), + output_path + ) @config.command( name="get_display_view_colorspace_name", help=( - "return default view colorspace name " - "for the given display and view " - "--path input arg is required" - ) -) -@click.option("--in_path", required=True, - help="path where to read ocio config file", - type=click.Path(exists=True)) -@click.option("--out_path", required=True, - help="path where to write output json file", - type=click.Path()) -@click.option("--display", required=True, - help="display name", - type=click.STRING) -@click.option("--view", required=True, - help="view name", - type=click.STRING) -def get_display_view_colorspace_name(in_path, out_path, - display, view): + "Default view colorspace name for the given display and view" + )) +@click.option( + "--config_path", + required=True, + help="path where to read ocio config file", + type=click.Path(exists=True)) +@click.option( + "--display", + required=True, + help="Display name", + type=click.STRING) +@click.option( + "--view", + required=True, + help="view name", + type=click.STRING) +@click.option( + "--output_path", + required=True, + help="path where to write output json file", + type=click.Path()) +def _get_display_view_colorspace_name( + config_path, display, view, output_path +): """Aggregate view colorspace name to file. Wrapper command for processes without access to OpenColorIO Args: - in_path (str): config file path string - out_path (str): temp json file path string + config_path (str): config file path string + output_path (str): temp json file path string display (str): display name e.g. "ACES" view (str): view name e.g. "sRGB" Example of use: > pyton.exe ./ocio_wrapper.py config \ - get_display_view_colorspace_name --in_path= \ - --out_path= --display= --view= + get_display_view_colorspace_name --config_path \ + --output_path --display --view """ + _save_output_to_json_file( + get_display_view_colorspace_name(config_path, display, view), + output_path + ) - out_data = _get_display_view_colorspace_name(in_path, - display, - view) - with open(out_path, "w") as f: - json.dump(out_data, f) - - print(f"Display view colorspace saved to '{out_path}'") - -if __name__ == '__main__': +if __name__ == "__main__": + if not has_compatible_ocio_package(): + raise RuntimeError("OpenColorIO is not available.") main() From b23faf324903e5c5b4ae2deaa76087c3358b405d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:40:50 +0200 Subject: [PATCH 200/469] modified existing functions to use functions from colorspace.py --- client/ayon_core/pipeline/colorspace.py | 286 +++++++++++------------- 1 file changed, 132 insertions(+), 154 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index a503c37101..c347638937 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -18,11 +18,10 @@ from ayon_core.lib import ( run_ayon_launcher_process, Logger, ) +from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS from ayon_core.pipeline import Anatomy from ayon_core.pipeline.template_data import get_template_data from ayon_core.pipeline.load import get_representation_path_with_anatomy -from ayon_core.lib.transcoding import VIDEO_EXTENSIONS, IMAGE_EXTENSIONS - log = Logger.get_logger(__name__) @@ -281,26 +280,50 @@ def get_config_file_rules_colorspace_from_filepath(config_path, filepath): Returns: Union[str, None]: matching colorspace name + """ - if not has_compatible_ocio_package(): - # python environment is not compatible with PyOpenColorIO - # needs to be run in subprocess + if has_compatible_ocio_package(): + result_data = _get_config_file_rules_colorspace_from_filepath( + config_path, filepath + ) + else: result_data = _get_wrapped_with_subprocess( - "colorspace", "get_config_file_rules_colorspace_from_filepath", + "colorspace", + "get_config_file_rules_colorspace_from_filepath", config_path=config_path, filepath=filepath ) - if result_data: - return result_data[0] - - # TODO: refactor this so it is not imported but part of this file - from ayon_core.scripts.ocio_wrapper import _get_config_file_rules_colorspace_from_filepath # noqa: E501 - - result_data = _get_config_file_rules_colorspace_from_filepath( - config_path, filepath) if result_data: return result_data[0] + return None + + +def get_config_version_data(config_path): + """Return major and minor version info. + + Args: + config_path (str): path string leading to config.ocio + + Raises: + IOError: Input config does not exist. + + Returns: + dict: minor and major keys with values + + """ + if config_path not in CachedData.config_version_data: + if has_compatible_ocio_package(): + version_data = _get_config_version_data(config_path) + else: + version_data = _get_wrapped_with_subprocess( + "config", + "get_config_version_data", + config_path=config_path + ) + CachedData.config_version_data[config_path] = version_data + + return deepcopy(CachedData.config_version_data[config_path]) def parse_colorspace_from_filepath( @@ -394,6 +417,7 @@ def validate_imageio_colorspace_in_config(config_path, colorspace_name): Returns: bool: True if exists + """ colorspaces = get_ocio_config_colorspaces(config_path)["colorspaces"] if colorspace_name not in colorspaces: @@ -405,9 +429,7 @@ def validate_imageio_colorspace_in_config(config_path, colorspace_name): def _get_wrapped_with_subprocess(command_group, command, **kwargs): - """Get data via subprocess - - Wrapper for Python 2 hosts. + """Get data via subprocess. Args: command_group (str): command group name @@ -420,14 +442,16 @@ def _get_wrapped_with_subprocess(command_group, command, **kwargs): with _make_temp_json_file() as tmp_json_path: # Prepare subprocess arguments args = [ - "run", get_ocio_config_script_path(), - command_group, command + "run", + get_ocio_config_script_path(), + command_group, + command ] - for key_, value_ in kwargs.items(): - args.extend(("--{}".format(key_), value_)) + for key, value in kwargs.items(): + args.extend(("--{}".format(key), value)) - args.append("--out_path") + args.append("--output_path") args.append(tmp_json_path) log.info("Executing: {}".format(" ".join(args))) @@ -435,39 +459,23 @@ def _get_wrapped_with_subprocess(command_group, command, **kwargs): run_ayon_launcher_process(*args, logger=log) # return all colorspaces - with open(tmp_json_path, "r") as f_: - return json.load(f_) + with open(tmp_json_path, "r") as stream: + return json.load(stream) -# TODO: this should be part of ocio_wrapper.py def compatibility_check_config_version(config_path, major=1, minor=None): """Making sure PyOpenColorIO config version is compatible""" - if not CachedData.config_version_data.get(config_path): - if has_compatible_ocio_package(): - # TODO: refactor this so it is not imported but part of this file - from ayon_core.scripts.ocio_wrapper import _get_version_data - - CachedData.config_version_data[config_path] = \ - _get_version_data(config_path) - - else: - # python environment is not compatible with PyOpenColorIO - # needs to be run in subprocess - CachedData.config_version_data[config_path] = \ - _get_wrapped_with_subprocess( - "config", "get_version", config_path=config_path - ) + version_data = get_config_version_data(config_path) # check major version - if CachedData.config_version_data[config_path]["major"] != major: + if version_data["major"] != major: return False # check minor version - if minor and CachedData.config_version_data[config_path]["minor"] != minor: + if minor is not None and version_data["minor"] != minor: return False - # compatible return True @@ -482,22 +490,20 @@ def get_ocio_config_colorspaces(config_path): Returns: dict: colorspace and family in couple - """ - if not CachedData.ocio_config_colorspaces.get(config_path): - if not has_compatible_ocio_package(): - # python environment is not compatible with PyOpenColorIO - # needs to be run in subprocess - config_colorspaces = _get_wrapped_with_subprocess( - "config", "get_colorspace", in_path=config_path - ) - else: - # TODO: refactor this so it is not imported but part of this file - from ayon_core.scripts.ocio_wrapper import _get_colorspace_data - config_colorspaces = _get_colorspace_data(config_path) + """ + if config_path not in CachedData.ocio_config_colorspaces: + if has_compatible_ocio_package(): + config_colorspaces = _get_ocio_config_colorspaces(config_path) + else: + config_colorspaces = _get_wrapped_with_subprocess( + "config", + "get_ocio_config_colorspaces", + config_path=config_path + ) CachedData.ocio_config_colorspaces[config_path] = config_colorspaces - return CachedData.ocio_config_colorspaces[config_path] + return deepcopy(CachedData.ocio_config_colorspaces[config_path]) def convert_colorspace_enumerator_item( @@ -571,16 +577,18 @@ def get_colorspaces_enumerator_items( Families can be used for building menu and submenus in gui. Args: - config_items (dict[str,dict]): colorspace data coming from - `get_ocio_config_colorspaces` function - include_aliases (bool): include aliases in result - include_looks (bool): include looks in result - include_roles (bool): include roles in result + config_items (dict[str,dict]): Colorspace data coming from + `get_ocio_config_colorspaces` function. + include_aliases (Optional[bool]): Include aliases in result. + include_looks (Optional[bool]): Include looks in result. + include_roles (Optional[bool]): Include roles in result. + include_display_views (Optional[bool]): Include display views + in result. Returns: - list[tuple[str,str]]: colorspace and family in couple + list[tuple[str, str]]: Colorspace and family in couples. + """ - labeled_colorspaces = [] aliases = set() colorspaces = set() looks = set() @@ -590,64 +598,74 @@ def get_colorspaces_enumerator_items( if items_type == "colorspaces": for color_name, color_data in colorspace_items.items(): if color_data.get("aliases"): - aliases.update([ + aliases.update({ ( "aliases::{}".format(alias_name), "[alias] {} ({})".format(alias_name, color_name) ) for alias_name in color_data["aliases"] - ]) + }) colorspaces.add(( "{}::{}".format(items_type, color_name), "[colorspace] {}".format(color_name) )) elif items_type == "looks": - looks.update([ + looks.update({ ( "{}::{}".format(items_type, name), "[look] {} ({})".format(name, role_data["process_space"]) ) for name, role_data in colorspace_items.items() - ]) + }) elif items_type == "displays_views": - display_views.update([ + display_views.update({ ( "{}::{}".format(items_type, name), "[view (display)] {}".format(name) ) for name, _ in colorspace_items.items() - ]) + }) elif items_type == "roles": - roles.update([ + roles.update({ ( "{}::{}".format(items_type, name), "[role] {} ({})".format(name, role_data["colorspace"]) ) for name, role_data in colorspace_items.items() - ]) + }) - if roles and include_roles: - roles = sorted(roles, key=lambda x: x[0]) - labeled_colorspaces.extend(roles) + def _sort_key_getter(item): + """Use colorspace for sorting.""" + return item[0] - # add colorspaces as second so it is not first in menu - colorspaces = sorted(colorspaces, key=lambda x: x[0]) - labeled_colorspaces.extend(colorspaces) + labeled_colorspaces = [] + if include_roles: + labeled_colorspaces.extend( + sorted(roles, key=_sort_key_getter) + ) - if aliases and include_aliases: - aliases = sorted(aliases, key=lambda x: x[0]) - labeled_colorspaces.extend(aliases) + # Add colorspaces after roles, so it is not first in menu + labeled_colorspaces.extend( + sorted(colorspaces, key=_sort_key_getter) + ) - if looks and include_looks: - looks = sorted(looks, key=lambda x: x[0]) - labeled_colorspaces.extend(looks) + if include_aliases: + labeled_colorspaces.extend( + sorted(aliases, key=_sort_key_getter) + ) - if display_views and include_display_views: - display_views = sorted(display_views, key=lambda x: x[0]) - labeled_colorspaces.extend(display_views) + if include_looks: + labeled_colorspaces.extend( + sorted(looks, key=_sort_key_getter) + ) + + if include_display_views: + labeled_colorspaces.extend( + sorted(display_views, key=_sort_key_getter) + ) return labeled_colorspaces @@ -663,18 +681,16 @@ def get_ocio_config_views(config_path): Returns: dict: `display/viewer` and viewer data + """ - if not has_compatible_ocio_package(): - # python environment is not compatible with PyOpenColorIO - # needs to be run in subprocess - return _get_wrapped_with_subprocess( - "config", "get_views", in_path=config_path - ) + if has_compatible_ocio_package(): + return _get_ocio_config_views(config_path) - # TODO: refactor this so it is not imported but part of this file - from ayon_core.scripts.ocio_wrapper import _get_views_data - - return _get_views_data(config_path) + return _get_wrapped_with_subprocess( + "config", + "get_ocio_config_views", + config_path=config_path + ) def _get_global_config_data( @@ -1255,48 +1271,17 @@ def get_display_view_colorspace_name(config_path, display, view): str: View color space name. e.g. "Output - sRGB" """ - if not has_compatible_ocio_package(): - # python environment is not compatible with PyOpenColorIO - # needs to be run in subprocess - return _get_display_view_colorspace_subprocess( + if has_compatible_ocio_package(): + return _get_display_view_colorspace_name( config_path, display, view ) - - from ayon_core.scripts.ocio_wrapper import _get_display_view_colorspace_name # noqa - - return _get_display_view_colorspace_name(config_path, display, view) - - -def _get_display_view_colorspace_subprocess(config_path, display, view): - """Returns the colorspace attribute of the (display, view) pair - via subprocess. - - Args: - config_path (str): path string leading to config.ocio - display (str): display name e.g. "ACES" - view (str): view name e.g. "sRGB" - - Returns: - view color space name (str) e.g. "Output - sRGB" - - """ - with _make_temp_json_file() as tmp_json_path: - # Prepare subprocess arguments - args = [ - "run", get_ocio_config_script_path(), - "config", "get_display_view_colorspace_name", - "--in_path", config_path, - "--out_path", tmp_json_path, - "--display", display, - "--view", view - ] - log.debug("Executing: {}".format(" ".join(args))) - - run_ayon_launcher_process(*args, logger=log) - - # return default view colorspace name - with open(tmp_json_path, "r") as f: - return json.load(f) + return _get_wrapped_with_subprocess( + "config", + "get_display_view_colorspace_name", + config_path=config_path, + display=display, + view=view + ) # --- Implementation of logic using 'PyOpenColorIO' --- @@ -1531,7 +1516,8 @@ def get_colorspace_from_filepath(*args, **kwargs): def get_colorspace_data_subprocess(config_path): """[Deprecated] Get colorspace data via subprocess - Wrapper for Python 2 hosts. + Deprecated: + Deprecated since OpenPype. Use `_get_wrapped_with_subprocess` instead. Args: config_path (str): path leading to config.ocio file @@ -1540,7 +1526,9 @@ def get_colorspace_data_subprocess(config_path): dict: colorspace and family in couple """ return _get_wrapped_with_subprocess( - "config", "get_colorspace", in_path=config_path + "config", + "get_ocio_config_colorspaces", + config_path=config_path ) @@ -1548,30 +1536,20 @@ def get_colorspace_data_subprocess(config_path): def get_views_data_subprocess(config_path): """[Deprecated] Get viewers data via subprocess - Wrapper for Python 2 hosts. + Deprecated: + Deprecated since OpenPype. Use `_get_wrapped_with_subprocess` instead. Args: config_path (str): path leading to config.ocio file Returns: dict: `display/viewer` and viewer data + """ return _get_wrapped_with_subprocess( - "config", "get_views", in_path=config_path - ) - - -@deprecated("_get_wrapped_with_subprocess") -def get_data_subprocess(config_path, data_type): - """[Deprecated] Get data via subprocess - - Wrapper for Python 2 hosts. - - Args: - config_path (str): path leading to config.ocio file - """ - return _get_wrapped_with_subprocess( - "config", data_type, in_path=config_path, + "config", + "get_ocio_config_views", + config_path=config_path ) From 25fe55aa316f8f5d16bd6c773d0aa3c1a3d07935 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:42:21 +0200 Subject: [PATCH 201/469] validate 'PyOpenColorIO' version --- client/ayon_core/pipeline/colorspace.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index c347638937..c29bdd762d 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -116,13 +116,21 @@ def has_compatible_ocio_package(): if CachedData.has_compatible_ocio_package is not None: return CachedData.has_compatible_ocio_package + is_compatible = False try: - import PyOpenColorIO # noqa: F401 - # TODO validate 'PyOpenColorIO' version - CachedData.has_compatible_ocio_package = True - except ImportError: - CachedData.has_compatible_ocio_package = False + import PyOpenColorIO + # Check if PyOpenColorIO is compatible + # - version 2.0.0 or higher is required + # NOTE version 1 does not have '__version__' attribute + if hasattr(PyOpenColorIO, "__version__"): + version_parts = PyOpenColorIO.__version__.split(".") + major = int(version_parts[0]) + is_compatible = (major, ) >= (2, ) + except ImportError: + pass + + CachedData.has_compatible_ocio_package = is_compatible # compatible return CachedData.has_compatible_ocio_package From 8806463c7789fdcc2ce222576062c759c56c8b19 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:42:30 +0200 Subject: [PATCH 202/469] use raw DeprecationWarning --- client/ayon_core/pipeline/colorspace.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index c29bdd762d..b568e2cdf1 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -36,10 +36,6 @@ class CachedData: } -class DeprecatedWarning(DeprecationWarning): - pass - - def deprecated(new_destination): """Mark functions as deprecated. @@ -64,13 +60,13 @@ def deprecated(new_destination): @functools.wraps(decorated_func) def wrapper(*args, **kwargs): - warnings.simplefilter("always", DeprecatedWarning) + warnings.simplefilter("always", DeprecationWarning) warnings.warn( ( "Call to deprecated function '{}'" "\nFunction was moved or removed.{}" ).format(decorated_func.__name__, warning_message), - category=DeprecatedWarning, + category=DeprecationWarning, stacklevel=4 ) return decorated_func(*args, **kwargs) From 3b93392eb75663351e04de49d2c55cf163cd56cc Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:47:23 +0200 Subject: [PATCH 203/469] fix typo --- client/ayon_core/scripts/ocio_wrapper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/scripts/ocio_wrapper.py b/client/ayon_core/scripts/ocio_wrapper.py index 9cbab32956..897e910fa5 100644 --- a/client/ayon_core/scripts/ocio_wrapper.py +++ b/client/ayon_core/scripts/ocio_wrapper.py @@ -153,7 +153,7 @@ def _get_config_version_data(config_path, output_path): type=click.Path(exists=True)) @click.option( "--filepath", - equired=True, + required=True, help="Path to file to get colorspace from.", type=click.Path()) @click.option( From ddbec4ea71ae9e57c9c2a1d9d82abbe01933896f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 15 May 2024 18:57:04 +0200 Subject: [PATCH 204/469] added docstring to sorter --- client/ayon_core/pipeline/colorspace.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index b568e2cdf1..d9785b61fb 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -642,7 +642,15 @@ def get_colorspaces_enumerator_items( }) def _sort_key_getter(item): - """Use colorspace for sorting.""" + """Use colorspace for sorting. + + Args: + item (tuple[str, str]): Item with colorspace and label. + + Returns: + str: Colorspace. + + """ return item[0] labeled_colorspaces = [] From d353dd145a4c82a72498de87f9dfb32f2cffac09 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 16 May 2024 09:40:53 +0200 Subject: [PATCH 205/469] removed unnecessary command group --- client/ayon_core/pipeline/colorspace.py | 11 +-------- client/ayon_core/scripts/ocio_wrapper.py | 30 ++++-------------------- 2 files changed, 6 insertions(+), 35 deletions(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index d9785b61fb..239c187959 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -292,7 +292,6 @@ def get_config_file_rules_colorspace_from_filepath(config_path, filepath): ) else: result_data = _get_wrapped_with_subprocess( - "colorspace", "get_config_file_rules_colorspace_from_filepath", config_path=config_path, filepath=filepath @@ -321,7 +320,6 @@ def get_config_version_data(config_path): version_data = _get_config_version_data(config_path) else: version_data = _get_wrapped_with_subprocess( - "config", "get_config_version_data", config_path=config_path ) @@ -432,11 +430,10 @@ def validate_imageio_colorspace_in_config(config_path, colorspace_name): return True -def _get_wrapped_with_subprocess(command_group, command, **kwargs): +def _get_wrapped_with_subprocess(command, **kwargs): """Get data via subprocess. Args: - command_group (str): command group name command (str): command name **kwargs: command arguments @@ -448,7 +445,6 @@ def _get_wrapped_with_subprocess(command_group, command, **kwargs): args = [ "run", get_ocio_config_script_path(), - command_group, command ] @@ -501,7 +497,6 @@ def get_ocio_config_colorspaces(config_path): config_colorspaces = _get_ocio_config_colorspaces(config_path) else: config_colorspaces = _get_wrapped_with_subprocess( - "config", "get_ocio_config_colorspaces", config_path=config_path ) @@ -699,7 +694,6 @@ def get_ocio_config_views(config_path): return _get_ocio_config_views(config_path) return _get_wrapped_with_subprocess( - "config", "get_ocio_config_views", config_path=config_path ) @@ -1288,7 +1282,6 @@ def get_display_view_colorspace_name(config_path, display, view): config_path, display, view ) return _get_wrapped_with_subprocess( - "config", "get_display_view_colorspace_name", config_path=config_path, display=display, @@ -1538,7 +1531,6 @@ def get_colorspace_data_subprocess(config_path): dict: colorspace and family in couple """ return _get_wrapped_with_subprocess( - "config", "get_ocio_config_colorspaces", config_path=config_path ) @@ -1559,7 +1551,6 @@ def get_views_data_subprocess(config_path): """ return _get_wrapped_with_subprocess( - "config", "get_ocio_config_views", config_path=config_path ) diff --git a/client/ayon_core/scripts/ocio_wrapper.py b/client/ayon_core/scripts/ocio_wrapper.py index 897e910fa5..0414fc59ce 100644 --- a/client/ayon_core/scripts/ocio_wrapper.py +++ b/client/ayon_core/scripts/ocio_wrapper.py @@ -33,27 +33,7 @@ def main(): pass # noqa: WPS100 -@main.group() -def config(): - """Config related commands group - - Example of use: - > pyton.exe ./ocio_wrapper.py config *args - """ - pass # noqa: WPS100 - - -@main.group() -def colorspace(): - """Colorspace related commands group - - Example of use: - > pyton.exe ./ocio_wrapper.py config *args - """ - pass # noqa: WPS100 - - -@config.command( +@main.command( name="get_ocio_config_colorspaces", help="return all colorspaces from config file") @click.option( @@ -83,7 +63,7 @@ def _get_ocio_config_colorspaces(config_path, output_path): ) -@config.command( +@main.command( name="get_ocio_config_views", help="All viewers from config file") @click.option( @@ -113,7 +93,7 @@ def _get_ocio_config_views(config_path, output_path): ) -@config.command( +@main.command( name="get_config_version_data", help="Get major and minor version from config file") @click.option( @@ -143,7 +123,7 @@ def _get_config_version_data(config_path, output_path): ) -@colorspace.command( +@main.command( name="get_config_file_rules_colorspace_from_filepath", help="Colorspace file rules from filepath") @click.option( @@ -182,7 +162,7 @@ def _get_config_file_rules_colorspace_from_filepath( ) -@config.command( +@main.command( name="get_display_view_colorspace_name", help=( "Default view colorspace name for the given display and view" From 9e865566dbb6675771a4bed3ad18a5914c902d80 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 16 May 2024 11:24:14 +0300 Subject: [PATCH 206/469] add settings_category for plugins with server settings --- .../ayon_houdini/plugins/publish/collect_asset_handles.py | 2 ++ .../client/ayon_houdini/plugins/publish/collect_chunk_size.py | 2 ++ .../plugins/publish/collect_local_render_instances.py | 2 ++ .../plugins/publish/validate_instance_in_context.py | 2 ++ .../ayon_houdini/plugins/publish/validate_mesh_is_static.py | 2 ++ .../ayon_houdini/plugins/publish/validate_review_colorspace.py | 2 ++ .../client/ayon_houdini/plugins/publish/validate_subset_name.py | 1 + .../plugins/publish/validate_unreal_staticmesh_naming.py | 2 ++ .../ayon_houdini/plugins/publish/validate_workfile_paths.py | 2 ++ 9 files changed, 17 insertions(+) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py index 943a29952e..81ee5a2315 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py @@ -32,6 +32,8 @@ class CollectAssetHandles(pyblish.api.InstancePlugin, label = "Collect Folder Handles" use_asset_handles = True + settings_category = "houdini" + def process(self, instance): # Only process instances without already existing handles data # but that do have frameStartHandle and frameEndHandle defined diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py index 3e2561dd6f..f6ae6246cd 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py @@ -16,6 +16,8 @@ class CollectChunkSize(pyblish.api.InstancePlugin, label = "Collect Chunk Size" chunk_size = 999999 + settings_category = "houdini" + def process(self, instance): # need to get the chunk size info from the setting attr_values = self.get_attr_values_from_data(instance.data) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py index 5a446fa0d3..0b3eab725d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py @@ -25,6 +25,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): hosts = ["houdini"] label = "Collect local render instances" + settings_category = "houdini" + use_deadline_aov_filter = False aov_filter = {"host_name": "houdini", "value": [".*([Bb]eauty).*"]} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py index b2d839497f..25f38c4600 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py @@ -27,6 +27,8 @@ class ValidateInstanceInContextHoudini(pyblish.api.InstancePlugin, hosts = ["houdini"] actions = [SelectROPAction, RepairAction] + settings_category = "houdini" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py index 4db309f0ed..6f78b9f4ff 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py @@ -24,6 +24,8 @@ class ValidateMeshIsStatic(pyblish.api.InstancePlugin, order = ValidateContentsOrder + 0.1 actions = [SelectInvalidAction] + settings_category = "houdini" + def process(self, instance): invalid = self.get_invalid(instance) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py index 3f783f9fbe..30a8a35dca 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py @@ -36,6 +36,8 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin, optional = True review_color_space = "" + settings_category = "houdini" + @classmethod def apply_settings(cls, project_settings): # Preserve automatic settings applying logic diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py index a1fc0bf062..3d284a4eec 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py @@ -32,6 +32,7 @@ class ValidateSubsetName(pyblish.api.InstancePlugin, actions = [FixProductNameAction, SelectInvalidAction] optional = True + settings_category = "houdini" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py index 43cf6029f6..6b7c980fa2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py @@ -38,6 +38,8 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, collision_prefixes = [] static_mesh_prefix = "" + settings_category = "houdini" + @classmethod def apply_settings(cls, project_settings): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py index 7984b7615c..f2008b8281 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py @@ -22,6 +22,8 @@ class ValidateWorkfilePaths( node_types = ["file", "alembic"] prohibited_vars = ["$HIP", "$JOB"] + settings_category = "houdini" + def process(self, instance): if not self.is_active(instance.data): return From dc0f1769d5a73ebea1c9e7546d412f744370c65a Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 16 May 2024 12:31:13 +0200 Subject: [PATCH 207/469] Revert "AY-1110 - use get_addon_site_settings from ayon_api" This reverts commit 61fcc3ddecc2121d4947344215cce3dbff8caff5. --- .../deadline/plugins/publish/collect_user_credentials.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py index 30e3703b58..99d75ecb9e 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_user_credentials.py @@ -12,7 +12,7 @@ Provides: """ import pyblish.api -from ayon_api import get_addon_site_settings +from ayon_api import get_server_api_connection from ayon_core.modules.deadline.deadline_module import DeadlineModule from ayon_core.modules.deadline import __version__ @@ -81,8 +81,9 @@ class CollectDeadlineUserCredentials(pyblish.api.InstancePlugin): if not deadline_info["require_authentication"]: return - - local_settings = get_addon_site_settings( + # TODO import 'get_addon_site_settings' when available + # in public 'ayon_api' + local_settings = get_server_api_connection().get_addon_site_settings( DeadlineModule.name, __version__) local_settings = local_settings["local_settings"] for server_info in local_settings: From 340c07317f32bbfa94b865189cb554a36bb17465 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 16 May 2024 19:38:26 +0800 Subject: [PATCH 208/469] make validator animated reference being optional --- .../hosts/maya/plugins/publish/validate_animated_reference.py | 2 +- server_addon/maya/server/settings/publishers.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py index 2ba2bff6fc..4e8261d42e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py +++ b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py @@ -18,7 +18,7 @@ class ValidateAnimatedReferenceRig(pyblish.api.InstancePlugin, label = "Animated Reference Rig" accepted_controllers = ["transform", "locator"] actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] - optional = False + optional = True def process(self, instance): if not self.is_active(instance.data): diff --git a/server_addon/maya/server/settings/publishers.py b/server_addon/maya/server/settings/publishers.py index 20523b2ca9..3e8dc704b7 100644 --- a/server_addon/maya/server/settings/publishers.py +++ b/server_addon/maya/server/settings/publishers.py @@ -1448,8 +1448,8 @@ DEFAULT_PUBLISH_SETTINGS = { "active": True }, "ValidateAnimatedReferenceRig": { - "enabled": True, - "optional": False, + "enabled": False, + "optional": True, "active": True }, "ValidateAnimationContent": { From ce194b32febe009e2eec969c2fba77fb8238a319 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 16 May 2024 20:25:03 +0800 Subject: [PATCH 209/469] remove the validator --- .../publish/validate_animated_reference.py | 71 ------------------- .../maya/server/settings/publishers.py | 10 +-- 2 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py b/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py deleted file mode 100644 index 4e8261d42e..0000000000 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animated_reference.py +++ /dev/null @@ -1,71 +0,0 @@ -import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.pipeline.publish import ( - PublishValidationError, - ValidateContentsOrder, - OptionalPyblishPluginMixin -) -from maya import cmds - - -class ValidateAnimatedReferenceRig(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): - """Validate all nodes in skeletonAnim_SET are referenced""" - - order = ValidateContentsOrder - hosts = ["maya"] - families = ["animation.fbx"] - label = "Animated Reference Rig" - accepted_controllers = ["transform", "locator"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] - optional = True - - def process(self, instance): - if not self.is_active(instance.data): - return - animated_sets = instance.data.get("animated_skeleton", []) - if not animated_sets: - self.log.debug( - "No nodes found in skeletonAnim_SET. " - "Skipping validation of animated reference rig..." - ) - return - - for animated_reference in animated_sets: - is_referenced = cmds.referenceQuery( - animated_reference, isNodeReferenced=True) - if not bool(is_referenced): - raise PublishValidationError( - "All the content in skeletonAnim_SET" - " should be referenced nodes" - ) - invalid_controls = self.validate_controls(animated_sets) - if invalid_controls: - raise PublishValidationError( - "All the content in skeletonAnim_SET" - " should be transforms" - ) - - @classmethod - def validate_controls(self, set_members): - """Check if the controller set contains only accepted node types. - - Checks if all its set members are within the hierarchy of the root - Checks if the node types of the set members valid - - Args: - set_members: list of nodes of the skeleton_anim_set - hierarchy: list of nodes which reside under the root node - - Returns: - errors (list) - """ - - # Validate control types - invalid = [] - set_members = cmds.ls(set_members, long=True) - for node in set_members: - if cmds.nodeType(node) not in self.accepted_controllers: - invalid.append(node) - - return invalid diff --git a/server_addon/maya/server/settings/publishers.py b/server_addon/maya/server/settings/publishers.py index 3e8dc704b7..3ff57bab13 100644 --- a/server_addon/maya/server/settings/publishers.py +++ b/server_addon/maya/server/settings/publishers.py @@ -921,10 +921,7 @@ class PublishersModel(BaseSettingsModel): default_factory=BasicValidateModel, title="Validate Animated Reference Rig", ) - ValidateAnimationContent: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, - title="Validate Animation Content", - ) + ValidateOutRelatedNodeIds: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, title="Validate Animation Out Set Related Node Ids", @@ -1447,11 +1444,6 @@ DEFAULT_PUBLISH_SETTINGS = { "optional": True, "active": True }, - "ValidateAnimatedReferenceRig": { - "enabled": False, - "optional": True, - "active": True - }, "ValidateAnimationContent": { "enabled": True, "optional": False, From cd0bf07939a557744a2bc94d5f67479282b5099c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 16 May 2024 21:11:32 +0800 Subject: [PATCH 210/469] upversion --- server_addon/maya/package.py | 2 +- server_addon/maya/server/settings/publishers.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server_addon/maya/package.py b/server_addon/maya/package.py index fe3e3039f5..5ab2fa217c 100644 --- a/server_addon/maya/package.py +++ b/server_addon/maya/package.py @@ -1,3 +1,3 @@ name = "maya" title = "Maya" -version = "0.1.18" +version = "0.1.19" diff --git a/server_addon/maya/server/settings/publishers.py b/server_addon/maya/server/settings/publishers.py index 3ff57bab13..01ac6f4acd 100644 --- a/server_addon/maya/server/settings/publishers.py +++ b/server_addon/maya/server/settings/publishers.py @@ -917,11 +917,10 @@ class PublishersModel(BaseSettingsModel): default_factory=BasicValidateModel, title="Validate Rig Controllers", ) - ValidateAnimatedReferenceRig: BasicValidateModel = SettingsField( + ValidateAnimationContent: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Animated Reference Rig", + title="Validate Animation Content", ) - ValidateOutRelatedNodeIds: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, title="Validate Animation Out Set Related Node Ids", From 2536f86c221099a70cd7bbf7a226593674c24c44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 16 May 2024 22:54:02 +0200 Subject: [PATCH 211/469] :recycle: fix UE name on linux and darwin --- client/ayon_core/hosts/unreal/lib.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/hosts/unreal/lib.py b/client/ayon_core/hosts/unreal/lib.py index 37122b2096..185853a0aa 100644 --- a/client/ayon_core/hosts/unreal/lib.py +++ b/client/ayon_core/hosts/unreal/lib.py @@ -80,17 +80,21 @@ def get_engine_versions(env=None): def get_editor_exe_path(engine_path: Path, engine_version: str) -> Path: """Get UE Editor executable path.""" ue_path = engine_path / "Engine/Binaries" + + ue_name = "UnrealEditor" + + # handle older versions of Unreal Engine + if engine_version.split(".")[0] == "4": + ue_name = "UE4Editor" + if platform.system().lower() == "windows": - if engine_version.split(".")[0] == "4": - ue_path /= "Win64/UE4Editor.exe" - elif engine_version.split(".")[0] == "5": - ue_path /= "Win64/UnrealEditor.exe" + ue_path /= f"Win64/{ue_name}.exe" elif platform.system().lower() == "linux": - ue_path /= "Linux/UE4Editor" + ue_path /= f"Linux/{ue_name}" elif platform.system().lower() == "darwin": - ue_path /= "Mac/UE4Editor" + ue_path /= f"Mac/{ue_name}" return ue_path From 242326093eaa77728d15785904a3db92496579e2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 17 May 2024 13:12:43 +0200 Subject: [PATCH 212/469] adding nuke into CollectDeadlinePools Refactor host and family lists in CollectDeadlinePools plugin. Added "nuke" to hosts and "prerender" to families. --- .../deadline/plugins/publish/collect_pools.py | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py index 6923c2b16b..2592d358e5 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py +++ b/client/ayon_core/modules/deadline/plugins/publish/collect_pools.py @@ -26,27 +26,32 @@ class CollectDeadlinePools(pyblish.api.InstancePlugin, order = pyblish.api.CollectorOrder + 0.420 label = "Collect Deadline Pools" - hosts = ["aftereffects", - "fusion", - "harmony" - "nuke", - "maya", - "max", - "houdini"] + hosts = [ + "aftereffects", + "fusion", + "harmony", + "maya", + "max", + "houdini", + "nuke", + ] - families = ["render", - "rendering", - "render.farm", - "renderFarm", - "renderlayer", - "maxrender", - "usdrender", - "redshift_rop", - "arnold_rop", - "mantra_rop", - "karma_rop", - "vray_rop", - "publish.hou"] + families = [ + "render", + "prerender", + "rendering", + "render.farm", + "renderFarm", + "renderlayer", + "maxrender", + "usdrender", + "redshift_rop", + "arnold_rop", + "mantra_rop", + "karma_rop", + "vray_rop", + "publish.hou", + ] primary_pool = None secondary_pool = None From cc7769dd21fc2d8312220d5f61f07b7c6eef5038 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 11:13:11 +0200 Subject: [PATCH 213/469] ValidateContainers have profile based settings --- .../plugins/publish/validate_containers.py | 40 +++++++++++++-- server/settings/publish_plugins.py | 49 +++++++++++++++++++ 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_containers.py b/client/ayon_core/plugins/publish/validate_containers.py index bd21ec9693..21736f0659 100644 --- a/client/ayon_core/plugins/publish/validate_containers.py +++ b/client/ayon_core/plugins/publish/validate_containers.py @@ -1,6 +1,11 @@ import pyblish.api + +from ayon_core.lib import filter_profiles +from ayon_core.host import ILoadHost from ayon_core.pipeline.load import any_outdated_containers from ayon_core.pipeline import ( + get_current_host_name, + registered_host, PublishXmlValidationError, OptionalPyblishPluginMixin ) @@ -18,17 +23,44 @@ class ShowInventory(pyblish.api.Action): host_tools.show_scene_inventory() -class ValidateContainers(OptionalPyblishPluginMixin, - pyblish.api.ContextPlugin): - +class ValidateContainers( + OptionalPyblishPluginMixin, + pyblish.api.ContextPlugin +): """Containers are must be updated to latest version on publish.""" label = "Validate Outdated Containers" order = pyblish.api.ValidatorOrder - hosts = ["maya", "houdini", "nuke", "harmony", "photoshop", "aftereffects"] + optional = True actions = [ShowInventory] + @classmethod + def apply_settings(cls, settings): + # Disable plugin if host does not inherit from 'ILoadHost' + # - not a host that can load containers + host = registered_host() + if not isinstance(host, ILoadHost): + cls.enabled = False + return + + # Disable if no profile is found for the current host + profile = filter_profiles( + settings["core"]["publish"]["ValidateContainers"]["profiles"], + {"host_names": get_current_host_name()} + ) + if not profile: + cls.enabled = False + return + + # Apply settings from profile + for attr_name in { + "enabled", + "optional", + "active", + }: + setattr(cls, attr_name, profile[attr_name]) + def process(self, context): if not self.is_active(context.data): return diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index e61bf6986b..f487438109 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -59,6 +59,32 @@ class CollectFramesFixDefModel(BaseSettingsModel): ) +class ValidateContainersProfile(BaseSettingsModel): + _layout = "expanded" + # Filtering + host_names: list[str] = SettingsField( + default_factory=list, + title="Host names" + ) + # Profile values + enabled: bool = SettingsField(True) + optional: bool = SettingsField(True) + active: bool = SettingsField(True) + + +class ValidateContainersModel(BaseSettingsModel): + """Validate if Publishing intent was selected. + + It is possible to disable validation for specific publishing context + with profiles. + """ + + _isGroup = True + profiles: list[ValidateContainersProfile] = SettingsField( + default_factory=list + ) + + class ValidateIntentProfile(BaseSettingsModel): _layout = "expanded" hosts: list[str] = SettingsField(default_factory=list, title="Host names") @@ -770,6 +796,10 @@ class PublishPuginsModel(BaseSettingsModel): default_factory=ValidateBaseModel, title="Validate Version" ) + ValidateContainers: ValidateContainersModel = SettingsField( + default_factory=ValidateContainersModel, + title="Validate Containers" + ) ValidateIntent: ValidateIntentModel = SettingsField( default_factory=ValidateIntentModel, title="Validate Intent" @@ -855,6 +885,25 @@ DEFAULT_PUBLISH_VALUES = { "optional": False, "active": True }, + "ValidateContainers": { + "profiles": [ + { + # Default host names are based on original + # filter of ValidateContainer pyblish plugin + "host_names": [ + "maya", + "houdini", + "nuke", + "harmony", + "photoshop", + "aftereffects" + ], + "enabled": True, + "optional": True, + "active": True + } + ] + }, "ValidateIntent": { "enabled": False, "profiles": [] From 0101527af2864458d3c0728ab3ae508dd7a7bafb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 11:14:28 +0200 Subject: [PATCH 214/469] add titles --- server/settings/publish_plugins.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index f487438109..f40cc1fefe 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -67,9 +67,9 @@ class ValidateContainersProfile(BaseSettingsModel): title="Host names" ) # Profile values - enabled: bool = SettingsField(True) - optional: bool = SettingsField(True) - active: bool = SettingsField(True) + enabled: bool = SettingsField(True, title="Enabled") + optional: bool = SettingsField(True, title="Optional") + active: bool = SettingsField(True, title="Active") class ValidateContainersModel(BaseSettingsModel): From d2a0719de3ba30a74f846a67082c7a02e0f1855b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 11:28:02 +0200 Subject: [PATCH 215/469] remove 'ValidateContainers' settings from other hosts --- server_addon/aftereffects/package.py | 2 +- .../server/settings/publish_plugins.py | 15 --------------- server_addon/harmony/package.py | 2 +- server_addon/harmony/server/settings/main.py | 5 ----- .../harmony/server/settings/publish_plugins.py | 13 ------------- server_addon/maya/package.py | 2 +- .../maya/server/settings/publishers.py | 9 --------- server_addon/nuke/package.py | 2 +- .../nuke/server/settings/publish_plugins.py | 9 --------- server_addon/photoshop/package.py | 2 +- .../server/settings/publish_plugins.py | 18 ------------------ 11 files changed, 5 insertions(+), 74 deletions(-) diff --git a/server_addon/aftereffects/package.py b/server_addon/aftereffects/package.py index a680b37602..7a2f9bc7af 100644 --- a/server_addon/aftereffects/package.py +++ b/server_addon/aftereffects/package.py @@ -1,3 +1,3 @@ name = "aftereffects" title = "AfterEffects" -version = "0.1.3" +version = "0.1.4" diff --git a/server_addon/aftereffects/server/settings/publish_plugins.py b/server_addon/aftereffects/server/settings/publish_plugins.py index 61d67f26d3..a9f30c6686 100644 --- a/server_addon/aftereffects/server/settings/publish_plugins.py +++ b/server_addon/aftereffects/server/settings/publish_plugins.py @@ -22,12 +22,6 @@ class ValidateSceneSettingsModel(BaseSettingsModel): ) -class ValidateContainersModel(BaseSettingsModel): - enabled: bool = SettingsField(True, title="Enabled") - optional: bool = SettingsField(True, title="Optional") - active: bool = SettingsField(True, title="Active") - - class AfterEffectsPublishPlugins(BaseSettingsModel): CollectReview: CollectReviewPluginModel = SettingsField( default_factory=CollectReviewPluginModel, @@ -37,10 +31,6 @@ class AfterEffectsPublishPlugins(BaseSettingsModel): default_factory=ValidateSceneSettingsModel, title="Validate Scene Settings", ) - ValidateContainers: ValidateContainersModel = SettingsField( - default_factory=ValidateContainersModel, - title="Validate Containers", - ) AE_PUBLISH_PLUGINS_DEFAULTS = { @@ -58,9 +48,4 @@ AE_PUBLISH_PLUGINS_DEFAULTS = { ".*" ] }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True, - } } diff --git a/server_addon/harmony/package.py b/server_addon/harmony/package.py index 83e88e7d57..00824cedef 100644 --- a/server_addon/harmony/package.py +++ b/server_addon/harmony/package.py @@ -1,3 +1,3 @@ name = "harmony" title = "Harmony" -version = "0.1.2" +version = "0.1.3" diff --git a/server_addon/harmony/server/settings/main.py b/server_addon/harmony/server/settings/main.py index 9c780b63c2..8a72c966d8 100644 --- a/server_addon/harmony/server/settings/main.py +++ b/server_addon/harmony/server/settings/main.py @@ -45,11 +45,6 @@ DEFAULT_HARMONY_SETTING = { "optional": True, "active": True }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True - }, "ValidateSceneSettings": { "enabled": True, "optional": True, diff --git a/server_addon/harmony/server/settings/publish_plugins.py b/server_addon/harmony/server/settings/publish_plugins.py index c9e7c515e4..2d976389f6 100644 --- a/server_addon/harmony/server/settings/publish_plugins.py +++ b/server_addon/harmony/server/settings/publish_plugins.py @@ -18,14 +18,6 @@ class ValidateAudioPlugin(BaseSettingsModel): active: bool = SettingsField(True, title="Active") -class ValidateContainersPlugin(BaseSettingsModel): - """Check if loaded container is scene are latest versions.""" - _isGroup = True - enabled: bool = True - optional: bool = SettingsField(False, title="Optional") - active: bool = SettingsField(True, title="Active") - - class ValidateSceneSettingsPlugin(BaseSettingsModel): """Validate if FrameStart, FrameEnd and Resolution match shot data in DB. Use regular expressions to limit validations only on particular asset @@ -63,11 +55,6 @@ class HarmonyPublishPlugins(BaseSettingsModel): default_factory=ValidateAudioPlugin, ) - ValidateContainers: ValidateContainersPlugin = SettingsField( - title="Validate Containers", - default_factory=ValidateContainersPlugin, - ) - ValidateSceneSettings: ValidateSceneSettingsPlugin = SettingsField( title="Validate Scene Settings", default_factory=ValidateSceneSettingsPlugin, diff --git a/server_addon/maya/package.py b/server_addon/maya/package.py index 5ab2fa217c..4537c23eaa 100644 --- a/server_addon/maya/package.py +++ b/server_addon/maya/package.py @@ -1,3 +1,3 @@ name = "maya" title = "Maya" -version = "0.1.19" +version = "0.1.20" diff --git a/server_addon/maya/server/settings/publishers.py b/server_addon/maya/server/settings/publishers.py index 01ac6f4acd..9c552e17fa 100644 --- a/server_addon/maya/server/settings/publishers.py +++ b/server_addon/maya/server/settings/publishers.py @@ -634,10 +634,6 @@ class PublishersModel(BaseSettingsModel): title="Validate Instance In Context", section="Validators" ) - ValidateContainers: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, - title="Validate Containers" - ) ValidateFrameRange: ValidateFrameRangeModel = SettingsField( default_factory=ValidateFrameRangeModel, title="Validate Frame Range" @@ -1059,11 +1055,6 @@ DEFAULT_PUBLISH_SETTINGS = { "optional": True, "active": True }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True - }, "ValidateFrameRange": { "enabled": True, "optional": True, diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index e522b9fb5d..bc166bd14e 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,3 @@ name = "nuke" title = "Nuke" -version = "0.1.12" +version = "0.1.13" diff --git a/server_addon/nuke/server/settings/publish_plugins.py b/server_addon/nuke/server/settings/publish_plugins.py index e67f7be24f..6c37ecd37a 100644 --- a/server_addon/nuke/server/settings/publish_plugins.py +++ b/server_addon/nuke/server/settings/publish_plugins.py @@ -231,10 +231,6 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=OptionalPluginModel, section="Validators" ) - ValidateContainers: OptionalPluginModel = SettingsField( - title="Validate Containers", - default_factory=OptionalPluginModel - ) ValidateKnobs: ValidateKnobsModel = SettingsField( title="Validate Knobs", default_factory=ValidateKnobsModel @@ -300,11 +296,6 @@ DEFAULT_PUBLISH_PLUGIN_SETTINGS = { "optional": True, "active": True }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True - }, "ValidateKnobs": { "enabled": False, "knobs": "\n".join([ diff --git a/server_addon/photoshop/package.py b/server_addon/photoshop/package.py index 25615529d1..22043f951c 100644 --- a/server_addon/photoshop/package.py +++ b/server_addon/photoshop/package.py @@ -1,3 +1,3 @@ name = "photoshop" title = "Photoshop" -version = "0.1.2" +version = "0.1.3" diff --git a/server_addon/photoshop/server/settings/publish_plugins.py b/server_addon/photoshop/server/settings/publish_plugins.py index d04faaf53a..149b08beb4 100644 --- a/server_addon/photoshop/server/settings/publish_plugins.py +++ b/server_addon/photoshop/server/settings/publish_plugins.py @@ -83,14 +83,6 @@ class CollectVersionPlugin(BaseSettingsModel): enabled: bool = SettingsField(True, title="Enabled") -class ValidateContainersPlugin(BaseSettingsModel): - """Check that workfile contains latest version of loaded items""" # noqa - _isGroup = True - enabled: bool = True - optional: bool = SettingsField(False, title="Optional") - active: bool = SettingsField(True, title="Active") - - class ValidateNamingPlugin(BaseSettingsModel): """Validate naming of products and layers""" # noqa invalid_chars: str = SettingsField( @@ -154,11 +146,6 @@ class PhotoshopPublishPlugins(BaseSettingsModel): default_factory=CollectVersionPlugin, ) - ValidateContainers: ValidateContainersPlugin = SettingsField( - title="Validate Containers", - default_factory=ValidateContainersPlugin, - ) - ValidateNaming: ValidateNamingPlugin = SettingsField( title="Validate naming of products and layers", default_factory=ValidateNamingPlugin, @@ -187,11 +174,6 @@ DEFAULT_PUBLISH_SETTINGS = { "CollectVersion": { "enabled": False }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True - }, "ValidateNaming": { "invalid_chars": "[ \\\\/+\\*\\?\\(\\)\\[\\]\\{\\}:,;]", "replace_char": "_" From bb05691289def08af1d69449cd284f880839097e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 11:48:41 +0200 Subject: [PATCH 216/469] remove houdini settings too --- server_addon/houdini/package.py | 2 +- server_addon/houdini/server/settings/publish.py | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 6c81eba439..06b034da38 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -1,3 +1,3 @@ name = "houdini" title = "Houdini" -version = "0.2.14" +version = "0.2.15" diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 9e8e796aff..4a0c022f23 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -77,10 +77,6 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=CollectLocalRenderInstancesModel, title="Collect Local Render Instances." ) - ValidateContainers: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, - title="Validate Latest Containers.", - section="Validators") ValidateInstanceInContextHoudini: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, title="Validate Instance is in same Context.") @@ -119,11 +115,6 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { ] } }, - "ValidateContainers": { - "enabled": True, - "optional": True, - "active": True - }, "ValidateInstanceInContextHoudini": { "enabled": True, "optional": True, From d4ca6bf3f644615ca49e3b43c649000f05f35b6f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 12:14:47 +0200 Subject: [PATCH 217/469] use kwarg to pass project entity --- client/ayon_core/pipeline/colorspace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/colorspace.py b/client/ayon_core/pipeline/colorspace.py index 239c187959..099616ff4a 100644 --- a/client/ayon_core/pipeline/colorspace.py +++ b/client/ayon_core/pipeline/colorspace.py @@ -920,7 +920,7 @@ def get_imageio_config_preset( project_entity = None if anatomy is None: project_entity = ayon_api.get_project(project_name) - anatomy = Anatomy(project_name, project_entity) + anatomy = Anatomy(project_name, project_entity=project_entity) if env is None: env = dict(os.environ.items()) From 7340ab081d0b7bc197eb205eeaad57571b8e73f3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 12:21:08 +0200 Subject: [PATCH 218/469] do not lower task name when it can be None --- client/ayon_core/tools/push_to_project/models/integrate.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/client/ayon_core/tools/push_to_project/models/integrate.py b/client/ayon_core/tools/push_to_project/models/integrate.py index 6e43050c05..5937ffa4da 100644 --- a/client/ayon_core/tools/push_to_project/models/integrate.py +++ b/client/ayon_core/tools/push_to_project/models/integrate.py @@ -723,7 +723,6 @@ class ProjectPushItemProcess: dst_project_name = self._item.dst_project_name dst_folder_id = self._item.dst_folder_id dst_task_name = self._item.dst_task_name - dst_task_name_low = dst_task_name.lower() new_folder_name = self._item.new_folder_name if not dst_folder_id and not new_folder_name: self._status.set_failed( @@ -765,7 +764,7 @@ class ProjectPushItemProcess: dst_project_name, folder_ids=[folder_entity["id"]] ) } - task_info = folder_tasks.get(dst_task_name_low) + task_info = folder_tasks.get(dst_task_name.lower()) if not task_info: self._status.set_failed( f"Could find task with name \"{dst_task_name}\"" From 45611ea27e8e3f8106df6dc45075a02e2a1145fd Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 12:35:42 +0200 Subject: [PATCH 219/469] call update on viewport instead on view --- client/ayon_core/tools/launcher/ui/actions_widget.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/launcher/ui/actions_widget.py b/client/ayon_core/tools/launcher/ui/actions_widget.py index a225827418..d03aceb009 100644 --- a/client/ayon_core/tools/launcher/ui/actions_widget.py +++ b/client/ayon_core/tools/launcher/ui/actions_widget.py @@ -359,7 +359,8 @@ class ActionsWidget(QtWidgets.QWidget): def _on_model_refresh(self): self._proxy_model.sort(0) # Force repaint all items - self._view.update() + viewport = self._view.viewport() + viewport.update() def _on_animation(self): time_now = time.time() From 9dcfd06ed62599f4544e6c86af07e712da972b83 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 14:53:29 +0200 Subject: [PATCH 220/469] change "profiles" key to "plugin_state_profiles" --- .../ayon_core/plugins/publish/validate_containers.py | 10 ++++++++-- server/settings/publish_plugins.py | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_containers.py b/client/ayon_core/plugins/publish/validate_containers.py index 21736f0659..3fd5083b4e 100644 --- a/client/ayon_core/plugins/publish/validate_containers.py +++ b/client/ayon_core/plugins/publish/validate_containers.py @@ -45,9 +45,15 @@ class ValidateContainers( return # Disable if no profile is found for the current host + profiles = ( + settings + ["core"] + ["publish"] + ["ValidateContainers"] + ["plugin_state_profiles"] + ) profile = filter_profiles( - settings["core"]["publish"]["ValidateContainers"]["profiles"], - {"host_names": get_current_host_name()} + profiles, {"host_names": get_current_host_name()} ) if not profile: cls.enabled = False diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index f40cc1fefe..0c19655035 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -80,7 +80,7 @@ class ValidateContainersModel(BaseSettingsModel): """ _isGroup = True - profiles: list[ValidateContainersProfile] = SettingsField( + plugin_state_profiles: list[ValidateContainersProfile] = SettingsField( default_factory=list ) @@ -886,7 +886,7 @@ DEFAULT_PUBLISH_VALUES = { "active": True }, "ValidateContainers": { - "profiles": [ + "plugin_state_profiles": [ { # Default host names are based on original # filter of ValidateContainer pyblish plugin From daf35ecd0f7c7bcde0a19c121e6bd1d302f9a0a7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 14:53:37 +0200 Subject: [PATCH 221/469] add a title to profiles --- server/settings/publish_plugins.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 0c19655035..8cf660354a 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -81,7 +81,8 @@ class ValidateContainersModel(BaseSettingsModel): _isGroup = True plugin_state_profiles: list[ValidateContainersProfile] = SettingsField( - default_factory=list + default_factory=list, + title="Plugin enable state profiles", ) From 38fd82623357d3001e96d0bc076c2dba0ff663b5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 20 May 2024 15:34:12 +0200 Subject: [PATCH 222/469] rename 'ValidateContainers' to 'ValidateOutdatedContainers' --- .../ayon_core/plugins/publish/validate_containers.py | 4 ++-- server/settings/publish_plugins.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_containers.py b/client/ayon_core/plugins/publish/validate_containers.py index 3fd5083b4e..520e7a7ce9 100644 --- a/client/ayon_core/plugins/publish/validate_containers.py +++ b/client/ayon_core/plugins/publish/validate_containers.py @@ -23,7 +23,7 @@ class ShowInventory(pyblish.api.Action): host_tools.show_scene_inventory() -class ValidateContainers( +class ValidateOutdatedContainers( OptionalPyblishPluginMixin, pyblish.api.ContextPlugin ): @@ -49,7 +49,7 @@ class ValidateContainers( settings ["core"] ["publish"] - ["ValidateContainers"] + ["ValidateOutdatedContainers"] ["plugin_state_profiles"] ) profile = filter_profiles( diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 8cf660354a..61e73ce912 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -59,7 +59,7 @@ class CollectFramesFixDefModel(BaseSettingsModel): ) -class ValidateContainersProfile(BaseSettingsModel): +class ValidateOutdatedContainersProfile(BaseSettingsModel): _layout = "expanded" # Filtering host_names: list[str] = SettingsField( @@ -72,7 +72,7 @@ class ValidateContainersProfile(BaseSettingsModel): active: bool = SettingsField(True, title="Active") -class ValidateContainersModel(BaseSettingsModel): +class ValidateOutdatedContainersModel(BaseSettingsModel): """Validate if Publishing intent was selected. It is possible to disable validation for specific publishing context @@ -80,7 +80,7 @@ class ValidateContainersModel(BaseSettingsModel): """ _isGroup = True - plugin_state_profiles: list[ValidateContainersProfile] = SettingsField( + plugin_state_profiles: list[ValidateOutdatedContainersProfile] = SettingsField( default_factory=list, title="Plugin enable state profiles", ) @@ -797,8 +797,8 @@ class PublishPuginsModel(BaseSettingsModel): default_factory=ValidateBaseModel, title="Validate Version" ) - ValidateContainers: ValidateContainersModel = SettingsField( - default_factory=ValidateContainersModel, + ValidateOutdatedContainers: ValidateOutdatedContainersModel = SettingsField( + default_factory=ValidateOutdatedContainersModel, title="Validate Containers" ) ValidateIntent: ValidateIntentModel = SettingsField( @@ -886,7 +886,7 @@ DEFAULT_PUBLISH_VALUES = { "optional": False, "active": True }, - "ValidateContainers": { + "ValidateOutdatedContainers": { "plugin_state_profiles": [ { # Default host names are based on original From 498260172a4dc50f06cee6aaf0296ad60401f66a Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Mon, 20 May 2024 22:18:01 +0800 Subject: [PATCH 223/469] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 1508225fd8..b82168c27e 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,6 +1,7 @@ name = "substancepainter" title = "Substance Painter" version = "0.2.0" +app_host_name = "substancepainter" client_dir = "ayon_substancepainter" From 46337deb1a9db4d601c7c3a3fa9c3d12e2253942 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 20 May 2024 17:35:53 +0200 Subject: [PATCH 224/469] Update colorspace assignment in ExporterReviewMov class and remove unnecessary line adding custom tags in ExtractReviewIntermediates class. - Update colorspace assignment to use a method - Remove redundant line adding custom tags --- client/ayon_core/hosts/nuke/api/plugin.py | 3 ++- .../hosts/nuke/plugins/publish/extract_review_intermediates.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/plugin.py b/client/ayon_core/hosts/nuke/api/plugin.py index ec13104d4d..bb9d175e62 100644 --- a/client/ayon_core/hosts/nuke/api/plugin.py +++ b/client/ayon_core/hosts/nuke/api/plugin.py @@ -837,7 +837,8 @@ class ExporterReviewMov(ExporterReview): def generate_mov(self, farm=False, delete=True, **kwargs): # colorspace data - colorspace = None + colorspace = self.write_colorspace + # get colorspace settings # get colorspace data from context config_data, _ = get_colorspace_settings_from_publish_context( diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py b/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py index 82c7b6e4c5..f3dac3a82e 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py @@ -136,7 +136,6 @@ class ExtractReviewIntermediates(publish.Extractor): self, instance, o_name, o_data["extension"], multiple_presets) - o_data["add_custom_tags"].append("intermediate") delete = not o_data.get("publish", False) if instance.data.get("farm"): From 31c24e4129e9323eea6b78de5068115eb13dd161 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 21 May 2024 00:45:13 +0800 Subject: [PATCH 225/469] make sure module name to find QtWIdget is correct and make sure all Openpype name converted to AYON --- .../deploy/plugins/ayon_plugin.py | 3 ++- .../deploy/startup/ayon_load_on_first_run.py | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 1cdcc5073d..fd819bf476 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,8 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("ayon."): + print(widget.__module__) + if widget.__module__.startswith("ayon_substancepainter."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py index 666a0e9f05..9ef119e357 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py @@ -1,6 +1,6 @@ """Ease the AYON on-boarding process by loading the plug-in on first run""" -OPENPYPE_PLUGIN_NAME = "ayon_plugin" +AYON_PLUGIN_NAME = "ayon_plugin" def start_plugin(): @@ -19,9 +19,9 @@ def start_plugin(): # later than this startup script, we check whether its menu initialized is_before_plugins_menu = PLUGINS_MENU is None - settings = get_settings(OPENPYPE_PLUGIN_NAME) + settings = get_settings(AYON_PLUGIN_NAME) if settings.value(LAUNCH_AT_START_KEY, None) is None: - print("Initializing OpenPype plug-in on first run...") + print("Initializing AYON plug-in on first run...") if is_before_plugins_menu: print("- running before 'painter_plugins_ui'") # Delay the launch to the painter_plugins_ui initialization @@ -29,11 +29,11 @@ def start_plugin(): else: # Launch now print("- running after 'painter_plugins_ui'") - plugin_manager(OPENPYPE_PLUGIN_NAME)(True) + plugin_manager(AYON_PLUGIN_NAME)(True) # Set the checked state in the menu to avoid confusion action = next(action for action in PLUGINS_MENU._menu.actions() - if action.text() == OPENPYPE_PLUGIN_NAME) + if action.text() == AYON_PLUGIN_NAME) if action is not None: action.blockSignals(True) action.setChecked(True) From f08443f844f1857a109e2342c37492f7f5018057 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 21 May 2024 17:45:57 +0800 Subject: [PATCH 226/469] supports exporting layer stack with specific channel & output with specific channel --- .../hosts/substancepainter/api/lib.py | 57 +++++++++++++++++++ .../plugins/create/create_textures.py | 39 +++++++++++-- .../publish/collect_textureset_images.py | 6 +- .../plugins/publish/extract_textures.py | 29 ++++++---- 4 files changed, 113 insertions(+), 18 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index 64c39943ce..df70a72b13 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -3,6 +3,8 @@ import re import json from collections import defaultdict +import contextlib +import substance_painter as sp import substance_painter.project import substance_painter.resource import substance_painter.js @@ -640,3 +642,58 @@ def prompt_new_file_with_mesh(mesh_filepath): return return project_mesh + + +def get_export_presets_by_filtering(export_preset_name, channel_type_list): + new_maps = [] + + export_presets = get_export_presets() + resource_presets = substance_painter.export.list_resource_export_presets() + preset = next((preset for preset in resource_presets + if preset.resource_id.name == ( + export_presets[export_preset_name])), None) + + if preset is not None: + maps = preset.list_output_maps() + for channel_map in maps: + for n in channel_type_list: + if n in channel_map["fileName"]: + new_maps.append(channel_map) + # Create a new preset + return { + "exportPresets": [ + { + "name": export_preset_name, + "maps": new_maps + } + ], + } + return {} + + +@contextlib.contextmanager +def supsend_publish_layer_stack(node_ids, channel_type): + all_selected_nodes = [] + opacity_set_list = [] + stack = sp.textureset.get_active_stack() + stack_root_layers = sp.layerstack.get_root_layer_nodes(stack) + if node_ids and channel_type: + for node_id in node_ids: + node = sp.layerstack.get_node_by_uid(int(node_id)) + all_selected_nodes.append(node) + filtered_nodes = [node for node in stack_root_layers + if node not in all_selected_nodes] + for node in filtered_nodes: + for channel in channel_type: + chan = getattr(sp.textureset.ChannelType, channel) + opacity_set_list.append((chan, node.get_opacity(chan))) + try: + for node in filtered_nodes: + for channel, _ in opacity_set_list: + node.set_opacity(0.0, channel) + yield + finally: + for node in filtered_nodes: + for channel, opacity in opacity_set_list: + node.set_opacity(opacity, channel) + diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index f46afadb5a..d36bf76568 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- """Creator plugin for creating textures.""" - from ayon_core.pipeline import CreatedInstance, Creator, CreatorError from ayon_core.lib import ( EnumDef, @@ -18,6 +17,7 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( from ayon_core.hosts.substancepainter.api.lib import get_export_presets import substance_painter.project +import substance_painter as sp class CreateTextures(Creator): @@ -42,10 +42,20 @@ class CreateTextures(Creator): "exportFileFormat", "exportSize", "exportPadding", - "exportDilationDistance" + "exportDilationDistance", + "useCustomExportPreset", + "exportChannel" ]: if key in pre_create_data: creator_attributes[key] = pre_create_data[key] + #TODO: add the layer stack option + if sp.application.version_info()[0] >= 10 or ( + pre_create_data.get("use_selection")): + stack = sp.textureset.get_active_stack() + + instance_data["selected_node_id"] = [ + node_number.uid() for node_number in + sp.layerstack.get_selected_nodes(stack)] instance = self.create_instance_in_context(product_name, instance_data) @@ -88,8 +98,25 @@ class CreateTextures(Creator): return instance def get_instance_attr_defs(self): - + layer_stack_channel_enum = ["BaseColor", "Metallic", "Roughness", + "Normal", "Height", "Specular", + "SpecularEdgeColor", "Emissive", "Opacity", + "Displacement", "Glossiness", "Anisotropylevel", + "AO", "Anisotropyangle", "Transmissive", + "Reflection", "Diffuse", "Ior", + "Specularlevel", "BlendingMask", "Translucency", + "Scattering", "ScatterColor", "SheenOpacity", + "SheenRoughness", "SheenColor", "CoatOpacity", + "CoatColor", "CoatRoughness", "CoatSpecularLevel", + "CoatNormal"] return [ + EnumDef("exportChannel", + items=layer_stack_channel_enum, + multiselection=True, + default=None, + label="Export Channel(s)", + tooltip="Choose the channel which you " + "want to solely export"), EnumDef("exportPresetUrl", items=get_export_presets(), label="Output Template"), @@ -149,7 +176,6 @@ class CreateTextures(Creator): }, default=None, label="Size"), - EnumDef("exportPadding", items={ "passthrough": "No padding (passthrough)", @@ -172,4 +198,7 @@ class CreateTextures(Creator): def get_pre_create_attr_defs(self): # Use same attributes as for instance attributes - return self.get_instance_attr_defs() + return [ + BoolDef("use_selection", label="Use selection", + tooltip="Select Layer Stack(s) for exporting") + ] + self.get_instance_attr_defs() diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py index 20aaa56993..b90e77db80 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py @@ -8,6 +8,7 @@ import substance_painter.textureset from ayon_core.pipeline import publish from ayon_core.hosts.substancepainter.api.lib import ( get_parsed_export_maps, + get_export_presets_by_filtering, strip_template ) from ayon_core.pipeline.create import get_product_name @@ -207,5 +208,8 @@ class CollectTextureSet(pyblish.api.InstancePlugin): for key, value in dict(parameters).items(): if value is None: parameters.pop(key) - + channel_layer = creator_attrs.get("exportChannel", []) + if channel_layer: + maps = get_export_presets_by_filtering(preset_url, channel_layer) + config.update(maps) return config diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py b/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py index 0fa7b52f45..973a62de7a 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py @@ -1,6 +1,6 @@ import substance_painter.export - from ayon_core.pipeline import KnownPublishError, publish +from ayon_core.hosts.substancepainter.api.lib import supsend_publish_layer_stack class ExtractTextures(publish.Extractor, @@ -25,19 +25,24 @@ class ExtractTextures(publish.Extractor, def process(self, instance): config = instance.data["exportConfig"] - result = substance_painter.export.export_project_textures(config) + creator_attrs = instance.data["creator_attributes"] + export_channel = creator_attrs.get("exportChannel", []) + node_ids = instance.data.get("selected_node_id", []) - if result.status != substance_painter.export.ExportStatus.Success: - raise KnownPublishError( - "Failed to export texture set: {}".format(result.message) - ) + with supsend_publish_layer_stack(node_ids, export_channel): + result = substance_painter.export.export_project_textures(config) - # Log what files we generated - for (texture_set_name, stack_name), maps in result.textures.items(): - # Log our texture outputs - self.log.info(f"Exported stack: {texture_set_name} {stack_name}") - for texture_map in maps: - self.log.info(f"Exported texture: {texture_map}") + if result.status != substance_painter.export.ExportStatus.Success: + raise KnownPublishError( + "Failed to export texture set: {}".format(result.message) + ) + + # Log what files we generated + for (texture_set_name, stack_name), maps in result.textures.items(): + # Log our texture outputs + self.log.info(f"Exported stack: {texture_set_name} {stack_name}") + for texture_map in maps: + self.log.info(f"Exported texture: {texture_map}") # We'll insert the color space data for each image instance that we # added into this texture set. The collector couldn't do so because From d968c36c15487529ff198dab9b9cbc0a69ada520 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 21 May 2024 15:18:09 +0200 Subject: [PATCH 227/469] moved clockify code to server addon --- .../clockify/client/ayon_clockify}/__init__.py | 0 .../clockify/client/ayon_clockify}/clockify_api.py | 0 .../clockify/client/ayon_clockify}/clockify_module.py | 0 .../clockify/client/ayon_clockify}/constants.py | 0 .../ayon_clockify}/ftrack/server/action_clockify_sync_server.py | 0 .../ayon_clockify}/ftrack/user/action_clockify_sync_local.py | 0 .../client/ayon_clockify}/launcher_actions/ClockifyStart.py | 0 .../client/ayon_clockify}/launcher_actions/ClockifySync.py | 0 .../clockify/client/ayon_clockify}/widgets.py | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/__init__.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/clockify_api.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/clockify_module.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/constants.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/ftrack/server/action_clockify_sync_server.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/ftrack/user/action_clockify_sync_local.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/launcher_actions/ClockifyStart.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/launcher_actions/ClockifySync.py (100%) rename {client/ayon_core/modules/clockify => server_addon/clockify/client/ayon_clockify}/widgets.py (100%) diff --git a/client/ayon_core/modules/clockify/__init__.py b/server_addon/clockify/client/ayon_clockify/__init__.py similarity index 100% rename from client/ayon_core/modules/clockify/__init__.py rename to server_addon/clockify/client/ayon_clockify/__init__.py diff --git a/client/ayon_core/modules/clockify/clockify_api.py b/server_addon/clockify/client/ayon_clockify/clockify_api.py similarity index 100% rename from client/ayon_core/modules/clockify/clockify_api.py rename to server_addon/clockify/client/ayon_clockify/clockify_api.py diff --git a/client/ayon_core/modules/clockify/clockify_module.py b/server_addon/clockify/client/ayon_clockify/clockify_module.py similarity index 100% rename from client/ayon_core/modules/clockify/clockify_module.py rename to server_addon/clockify/client/ayon_clockify/clockify_module.py diff --git a/client/ayon_core/modules/clockify/constants.py b/server_addon/clockify/client/ayon_clockify/constants.py similarity index 100% rename from client/ayon_core/modules/clockify/constants.py rename to server_addon/clockify/client/ayon_clockify/constants.py diff --git a/client/ayon_core/modules/clockify/ftrack/server/action_clockify_sync_server.py b/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py similarity index 100% rename from client/ayon_core/modules/clockify/ftrack/server/action_clockify_sync_server.py rename to server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py diff --git a/client/ayon_core/modules/clockify/ftrack/user/action_clockify_sync_local.py b/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py similarity index 100% rename from client/ayon_core/modules/clockify/ftrack/user/action_clockify_sync_local.py rename to server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py diff --git a/client/ayon_core/modules/clockify/launcher_actions/ClockifyStart.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py similarity index 100% rename from client/ayon_core/modules/clockify/launcher_actions/ClockifyStart.py rename to server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py diff --git a/client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py similarity index 100% rename from client/ayon_core/modules/clockify/launcher_actions/ClockifySync.py rename to server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py diff --git a/client/ayon_core/modules/clockify/widgets.py b/server_addon/clockify/client/ayon_clockify/widgets.py similarity index 100% rename from client/ayon_core/modules/clockify/widgets.py rename to server_addon/clockify/client/ayon_clockify/widgets.py From 5300ea1526f10085d0f44980347ea9dbe077d75e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 21 May 2024 16:01:00 +0200 Subject: [PATCH 228/469] fix imports and naming --- .../clockify/client/ayon_clockify/__init__.py | 4 ++-- .../{clockify_module.py => addon.py} | 20 +++++++++--------- .../client/ayon_clockify/clockify_api.py | 8 ++++--- .../server/action_clockify_sync_server.py | 6 ++++-- .../ftrack/user/action_clockify_sync_local.py | 21 +++++++------------ .../launcher_actions/ClockifyStart.py | 3 ++- .../launcher_actions/ClockifySync.py | 2 +- .../clockify/client/ayon_clockify/version.py | 3 +++ server_addon/clockify/package.py | 2 +- 9 files changed, 36 insertions(+), 33 deletions(-) rename server_addon/clockify/client/ayon_clockify/{clockify_module.py => addon.py} (93%) create mode 100644 server_addon/clockify/client/ayon_clockify/version.py diff --git a/server_addon/clockify/client/ayon_clockify/__init__.py b/server_addon/clockify/client/ayon_clockify/__init__.py index 98834b516c..75fb87494e 100644 --- a/server_addon/clockify/client/ayon_clockify/__init__.py +++ b/server_addon/clockify/client/ayon_clockify/__init__.py @@ -1,5 +1,5 @@ -from .clockify_module import ClockifyModule +from .addon import ClockifyAddon __all__ = ( - "ClockifyModule", + "ClockifyAddon", ) diff --git a/server_addon/clockify/client/ayon_clockify/clockify_module.py b/server_addon/clockify/client/ayon_clockify/addon.py similarity index 93% rename from server_addon/clockify/client/ayon_clockify/clockify_module.py rename to server_addon/clockify/client/ayon_clockify/addon.py index d2ee4f1e1e..ce91b2be70 100644 --- a/server_addon/clockify/client/ayon_clockify/clockify_module.py +++ b/server_addon/clockify/client/ayon_clockify/addon.py @@ -2,12 +2,12 @@ import os import threading import time -from ayon_core.modules import AYONAddon, ITrayModule, IPluginPaths +from ayon_core.addon import AYONAddon, ITrayAddon, IPluginPaths from .constants import CLOCKIFY_FTRACK_USER_PATH, CLOCKIFY_FTRACK_SERVER_PATH -class ClockifyModule(AYONAddon, ITrayModule, IPluginPaths): +class ClockifyAddon(AYONAddon, ITrayAddon, IPluginPaths): name = "clockify" def initialize(self, studio_settings): @@ -31,7 +31,7 @@ class ClockifyModule(AYONAddon, ITrayModule, IPluginPaths): # TimersManager attributes # - set `timers_manager_connector` only in `tray_init` self.timers_manager_connector = None - self._timers_manager_module = None + self._timer_manager_addon = None @property def clockify_api(self): @@ -87,7 +87,7 @@ class ClockifyModule(AYONAddon, ITrayModule, IPluginPaths): return {"actions": [actions_path]} def get_ftrack_event_handler_paths(self): - """Function for Ftrack module to add ftrack event handler paths.""" + """Function for ftrack addon to add ftrack event handler paths.""" return { "user": [CLOCKIFY_FTRACK_USER_PATH], "server": [CLOCKIFY_FTRACK_SERVER_PATH], @@ -206,19 +206,19 @@ class ClockifyModule(AYONAddon, ITrayModule, IPluginPaths): self.action_stop_timer.setVisible(self.bool_timer_run) # --- TimersManager connection methods --- - def register_timers_manager(self, timer_manager_module): + def register_timers_manager(self, timer_manager_addon): """Store TimersManager for future use.""" - self._timers_manager_module = timer_manager_module + self._timer_manager_addon = timer_manager_addon def timer_started(self, data): """Tell TimersManager that timer started.""" - if self._timers_manager_module is not None: - self._timers_manager_module.timer_started(self.id, data) + if self._timer_manager_addon is not None: + self._timer_manager_addon.timer_started(self.id, data) def timer_stopped(self): """Tell TimersManager that timer stopped.""" - if self._timers_manager_module is not None: - self._timers_manager_module.timer_stopped(self.id) + if self._timer_manager_addon is not None: + self._timer_manager_addon.timer_stopped(self.id) def stop_timer(self): """Called from TimersManager to stop timer.""" diff --git a/server_addon/clockify/client/ayon_clockify/clockify_api.py b/server_addon/clockify/client/ayon_clockify/clockify_api.py index 2e1d8f008f..38ca6cdb66 100644 --- a/server_addon/clockify/client/ayon_clockify/clockify_api.py +++ b/server_addon/clockify/client/ayon_clockify/clockify_api.py @@ -1,15 +1,17 @@ import os import json import datetime + import requests + +from ayon_core.lib.local_settings import AYONSecureRegistry +from ayon_core.lib import Logger + from .constants import ( CLOCKIFY_ENDPOINT, ADMIN_PERMISSION_NAMES, ) -from ayon_core.lib.local_settings import AYONSecureRegistry -from ayon_core.lib import Logger - class ClockifyAPI: log = Logger.get_logger(__name__) diff --git a/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py b/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py index 7854f0ceba..ed83fed287 100644 --- a/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py +++ b/server_addon/clockify/client/ayon_clockify/ftrack/server/action_clockify_sync_server.py @@ -1,7 +1,9 @@ import os import json -from openpype_modules.ftrack.lib import ServerAction -from openpype_modules.clockify.clockify_api import ClockifyAPI + +from ayon_clockify.clockify_api import ClockifyAPI + +from ayon_ftrack.lib import ServerAction class SyncClockifyServer(ServerAction): diff --git a/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py b/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py index 4701653a0b..05a94e56fd 100644 --- a/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py +++ b/server_addon/clockify/client/ayon_clockify/ftrack/user/action_clockify_sync_local.py @@ -1,25 +1,20 @@ import json -from openpype_modules.ftrack.lib import BaseAction, statics_icon -from openpype_modules.clockify.clockify_api import ClockifyAPI +from ayon_clockify.clockify_api import ClockifyAPI +from ayon_ftrack.lib import BaseAction, statics_icon class SyncClockifyLocal(BaseAction): - '''Synchronise project names and task types.''' + """Synchronise project names and task types.""" - #: Action identifier. - identifier = 'clockify.sync.local' - #: Action label. - label = 'Sync To Clockify (local)' - #: Action description. - description = 'Synchronise data to Clockify workspace' - #: roles that are allowed to register this action + identifier = "clockify.sync.local" + label = "Sync To Clockify" + description = "Synchronise data to Clockify workspace" role_list = ["Administrator", "project Manager"] - #: icon icon = statics_icon("app_icons", "clockify-white.png") def __init__(self, *args, **kwargs): super(SyncClockifyLocal, self).__init__(*args, **kwargs) - #: CLockifyApi + self.clockify_api = ClockifyAPI() def discover(self, session, entities, event): @@ -56,7 +51,7 @@ class SyncClockifyLocal(BaseAction): 'user': user, 'status': 'running', 'data': json.dumps({ - 'description': 'Sync Ftrack to Clockify' + 'description': 'Sync ftrack to Clockify' }) }) session.commit() diff --git a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py index 8381c7d73e..d69d0371c0 100644 --- a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py +++ b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifyStart.py @@ -1,7 +1,8 @@ import ayon_api +from ayon_clockify.clockify_api import ClockifyAPI + from ayon_core.pipeline import LauncherAction -from openpype_modules.clockify.clockify_api import ClockifyAPI class ClockifyStart(LauncherAction): diff --git a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py index 5388f47c98..a32f2a8082 100644 --- a/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py +++ b/server_addon/clockify/client/ayon_clockify/launcher_actions/ClockifySync.py @@ -1,6 +1,6 @@ import ayon_api -from openpype_modules.clockify.clockify_api import ClockifyAPI +from ayon_clockify.clockify_api import ClockifyAPI from ayon_core.pipeline import LauncherAction diff --git a/server_addon/clockify/client/ayon_clockify/version.py b/server_addon/clockify/client/ayon_clockify/version.py new file mode 100644 index 0000000000..0e6e40cb7d --- /dev/null +++ b/server_addon/clockify/client/ayon_clockify/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'clockify' version.""" +__version__ = "0.2.0" diff --git a/server_addon/clockify/package.py b/server_addon/clockify/package.py index bcf9425b3f..1a36c43e69 100644 --- a/server_addon/clockify/package.py +++ b/server_addon/clockify/package.py @@ -1,3 +1,3 @@ name = "clockify" title = "Clockify" -version = "0.1.1" +version = "0.2.0" From 5f387f052dd16a6a186579dbcde6c53cbe84408c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 21 May 2024 16:03:06 +0200 Subject: [PATCH 229/469] added clockify version requirement in ayon core --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 21b1193b07..431e9b651b 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "clockify": VersionInfo(0, 2, 0), } # Inherit from `object` for Python 2 hosts From 2ff82353753a7557f628c1cb439ff7dd1e3255c8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 21 May 2024 16:03:16 +0200 Subject: [PATCH 230/469] add more information to package.py --- server_addon/clockify/package.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server_addon/clockify/package.py b/server_addon/clockify/package.py index 1a36c43e69..9482d7e0f7 100644 --- a/server_addon/clockify/package.py +++ b/server_addon/clockify/package.py @@ -1,3 +1,9 @@ name = "clockify" title = "Clockify" version = "0.2.0" +client_dir = "ayon_clockify" + +ayon_required_addons = { + "core": ">0.3.1", +} +ayon_compatible_addons = {} From a34647b17545bec61bab87ba7a2097c17b0b059f Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 17:04:02 +0300 Subject: [PATCH 231/469] update Houdini package and version --- server_addon/houdini/client/ayon_houdini/version.py | 2 +- server_addon/houdini/package.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/version.py b/server_addon/houdini/client/ayon_houdini/version.py index a38ff316cd..a30c770e1d 100644 --- a/server_addon/houdini/client/ayon_houdini/version.py +++ b/server_addon/houdini/client/ayon_houdini/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Houdini addon version.""" -__version__ = "0.3.14" +__version__ = "0.3.0" diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 9e5fe56e34..467806f364 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -2,6 +2,8 @@ name = "houdini" title = "Houdini" version = "0.3.0" +app_host_name = "houdini" + client_dir = "ayon_houdini" ayon_required_addons = { From f8b476ce7537c1f98152197fa3cc5dbb483e1d40 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 19:23:53 +0300 Subject: [PATCH 232/469] add base class for Houdini loader plugins --- .../houdini/client/ayon_houdini/api/plugin.py | 6 ++++++ .../client/ayon_houdini/plugins/load/actions.py | 6 +++--- .../client/ayon_houdini/plugins/load/load_alembic.py | 10 +++++----- .../ayon_houdini/plugins/load/load_alembic_archive.py | 10 +++++----- .../client/ayon_houdini/plugins/load/load_ass.py | 10 +++++----- .../client/ayon_houdini/plugins/load/load_bgeo.py | 10 +++++----- .../client/ayon_houdini/plugins/load/load_camera.py | 11 +++++------ .../client/ayon_houdini/plugins/load/load_fbx.py | 10 +++++----- .../client/ayon_houdini/plugins/load/load_filepath.py | 9 +++++---- .../client/ayon_houdini/plugins/load/load_hda.py | 10 +++++----- .../client/ayon_houdini/plugins/load/load_image.py | 9 ++++++--- .../ayon_houdini/plugins/load/load_redshift_proxy.py | 10 +++++----- .../ayon_houdini/plugins/load/load_usd_layer.py | 8 +++++--- .../ayon_houdini/plugins/load/load_usd_reference.py | 8 +++++--- .../client/ayon_houdini/plugins/load/load_usd_sop.py | 8 +++++--- .../client/ayon_houdini/plugins/load/load_vdb.py | 10 +++++----- .../client/ayon_houdini/plugins/load/show_usdview.py | 4 ++-- 17 files changed, 82 insertions(+), 67 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index bb29c534f3..3c3ca0a81e 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -14,6 +14,7 @@ from ayon_core.pipeline import ( CreatedInstance, AYON_INSTANCE_ID, AVALON_INSTANCE_ID, + load, ) from ayon_core.lib import BoolDef from .lib import imprint, read, lsattr, add_self_publish_button @@ -349,3 +350,8 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): for key, value in settings.items(): setattr(self, key, value) + +class HoudiniLoader(load.LoaderPlugin): + """Base class for most of the Houdini load plugins.""" + + settings_category = "houdini" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/actions.py b/server_addon/houdini/client/ayon_houdini/plugins/load/actions.py index 3e9cc35504..5fe545ced9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/actions.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/actions.py @@ -2,10 +2,10 @@ """ -from ayon_core.pipeline import load +from ayon_houdini.api import plugin -class SetFrameRangeLoader(load.LoaderPlugin): +class SetFrameRangeLoader(plugin.HoudiniLoader): """Set frame range excluding pre- and post-handles""" product_types = { @@ -42,7 +42,7 @@ class SetFrameRangeLoader(load.LoaderPlugin): hou.playbar.setPlaybackRange(start, end) -class SetFrameRangeWithHandlesLoader(load.LoaderPlugin): +class SetFrameRangeWithHandlesLoader(plugin.HoudiniLoader): """Set frame range including pre- and post-handles""" product_types = { diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py index 7a610ce8b3..7db2fe93ed 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic.py @@ -1,12 +1,12 @@ import os -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class AbcLoader(load.LoaderPlugin): +class AbcLoader(plugin.HoudiniLoader): """Load Alembic""" product_types = {"model", "animation", "pointcache", "gpuCache"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py index 672734879d..a34a43e48a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_alembic_archive.py @@ -1,13 +1,13 @@ import os -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class AbcArchiveLoader(load.LoaderPlugin): +class AbcArchiveLoader(plugin.HoudiniLoader): """Load Alembic as full geometry network hierarchy """ product_types = {"model", "animation", "pointcache", "gpuCache"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py index a7e558feb4..5fd97bc2a6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_ass.py @@ -1,14 +1,14 @@ import os import re -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class AssLoader(load.LoaderPlugin): +class AssLoader(plugin.HoudiniLoader): """Load .ass with Arnold Procedural""" product_types = {"ass"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py index b9f3b2b085..7119612cda 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_bgeo.py @@ -2,14 +2,14 @@ import os import re -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class BgeoLoader(load.LoaderPlugin): +class BgeoLoader(plugin.HoudiniLoader): """Load bgeo files to Houdini.""" label = "Load bgeo" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py index 0f8c4936a3..a9e50fe0a4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py @@ -1,9 +1,8 @@ -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline - from ayon_houdini.api.lib import ( set_camera_resolution, get_camera_from_container @@ -84,7 +83,7 @@ def transfer_non_default_values(src, dest, ignore=None): dest_parm.setFromParm(parm) -class CameraLoader(load.LoaderPlugin): +class CameraLoader(plugin.HoudiniLoader): """Load camera from an Alembic file""" product_types = {"camera"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py index 33b0688435..273ca43bc4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_fbx.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- """Fbx Loader for houdini. """ -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class FbxLoader(load.LoaderPlugin): +class FbxLoader(plugin.HoudiniLoader): """Load fbx files. """ label = "Load FBX" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py index 5c99f8bdb1..a5d2f661bf 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py @@ -1,13 +1,14 @@ import os import re -from ayon_core.pipeline import load -from ayon_houdini.api import pipeline - +from ayon_houdini.api import ( + pipeline, + plugin +) import hou -class FilePathLoader(load.LoaderPlugin): +class FilePathLoader(plugin.HoudiniLoader): """Load a managed filepath to a null node. This is useful if for a particular workflow there is no existing loader diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py index c0255614a5..b04e211aa4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_hda.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import os -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class HdaLoader(load.LoaderPlugin): +class HdaLoader(plugin.HoudiniLoader): """Load Houdini Digital Asset file.""" product_types = {"hda"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py index 6163e6d77a..8fc1dc4b98 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py @@ -2,11 +2,14 @@ import os import re from ayon_core.pipeline import ( - load, get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_houdini.api import lib, pipeline +from ayon_houdini.api import ( + pipeline, + plugin, + lib +) import hou @@ -42,7 +45,7 @@ def get_image_avalon_container(): return image_container -class ImageLoader(load.LoaderPlugin): +class ImageLoader(plugin.HoudiniLoader): """Load images into COP2""" product_types = { diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py index f11ac065a1..583af6151d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py @@ -1,16 +1,16 @@ import os import re -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline from ayon_core.pipeline.load import LoadError import hou -class RedshiftProxyLoader(load.LoaderPlugin): +class RedshiftProxyLoader(plugin.HoudiniLoader): """Load Redshift Proxy""" product_types = {"redshiftproxy"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py index af6f470674..fb302fd943 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_layer.py @@ -1,12 +1,14 @@ from ayon_core.pipeline import ( - load, get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_houdini.api import lib +from ayon_houdini.api import ( + plugin, + lib +) -class USDSublayerLoader(load.LoaderPlugin): +class USDSublayerLoader(plugin.HoudiniLoader): """Sublayer USD file in Solaris""" product_types = { diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py index 41d84922f7..690f6ce187 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_reference.py @@ -1,12 +1,14 @@ from ayon_core.pipeline import ( - load, get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_houdini.api import lib +from ayon_houdini.api import ( + plugin, + lib +) -class USDReferenceLoader(load.LoaderPlugin): +class USDReferenceLoader(plugin.HoudiniLoader): """Reference USD file in Solaris""" product_types = { diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py index 99e2c4375f..347e3283de 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_usd_sop.py @@ -1,10 +1,12 @@ import os -from ayon_core.pipeline import load -from ayon_houdini.api import pipeline +from ayon_houdini.api import ( + pipeline, + plugin +) -class SopUsdImportLoader(load.LoaderPlugin): +class SopUsdImportLoader(plugin.HoudiniLoader): """Load USD to SOPs via `usdimport`""" label = "Load USD to SOPs" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py index 13fab288fa..9014f4c5e2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_vdb.py @@ -1,14 +1,14 @@ import os import re -from ayon_core.pipeline import ( - load, - get_representation_path, +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import ( + pipeline, + plugin ) -from ayon_houdini.api import pipeline -class VdbLoader(load.LoaderPlugin): +class VdbLoader(plugin.HoudiniLoader): """Load VDB""" product_types = {"vdbcache"} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py b/server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py index 0158a6b963..4e18bc038a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/show_usdview.py @@ -3,10 +3,10 @@ import platform import subprocess from ayon_core.lib.vendor_bin_utils import find_executable -from ayon_core.pipeline import load +from ayon_houdini.api import plugin -class ShowInUsdview(load.LoaderPlugin): +class ShowInUsdview(plugin.HoudiniLoader): """Open USD file in usdview""" label = "Show in usdview" From 606e895689c221961b7d3cd5153de779e7958bd0 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 22:13:24 +0300 Subject: [PATCH 233/469] implement base classes for publish plugins --- .../houdini/client/ayon_houdini/api/plugin.py | 15 ++++++++++++++- .../plugins/publish/collect_active_state.py | 3 ++- .../plugins/publish/collect_arnold_rop.py | 4 ++-- .../plugins/publish/collect_asset_handles.py | 3 ++- .../plugins/publish/collect_cache_farm.py | 3 ++- .../plugins/publish/collect_chunk_size.py | 3 ++- .../plugins/publish/collect_current_file.py | 3 ++- .../plugins/publish/collect_farm_instances.py | 3 ++- .../plugins/publish/collect_frames.py | 4 ++-- .../plugins/publish/collect_inputs.py | 4 ++-- .../publish/collect_instances_usd_layered.py | 4 ++-- .../plugins/publish/collect_karma_rop.py | 5 +++-- .../publish/collect_local_render_instances.py | 3 ++- .../plugins/publish/collect_mantra_rop.py | 5 +++-- .../plugins/publish/collect_output_node.py | 4 ++-- .../publish/collect_pointcache_type.py | 4 ++-- .../plugins/publish/collect_redshift_rop.py | 5 +++-- .../plugins/publish/collect_remote_publish.py | 4 ++-- .../publish/collect_render_products.py | 3 ++- .../plugins/publish/collect_review_data.py | 3 ++- .../publish/collect_reviewable_instances.py | 3 ++- .../publish/collect_rop_frame_range.py | 4 ++-- .../publish/collect_staticmesh_type.py | 3 ++- .../plugins/publish/collect_usd_bootstrap.py | 4 ++-- .../plugins/publish/collect_usd_layers.py | 3 ++- .../plugins/publish/collect_vray_rop.py | 5 +++-- .../plugins/publish/collect_workfile.py | 4 ++-- .../plugins/publish/collect_workscene_fps.py | 3 ++- .../publish/extract_active_view_thumbnail.py | 5 ++--- .../plugins/publish/extract_alembic.py | 4 ++-- .../plugins/publish/extract_ass.py | 4 ++-- .../plugins/publish/extract_bgeo.py | 5 ++--- .../plugins/publish/extract_composite.py | 3 ++- .../plugins/publish/extract_fbx.py | 4 ++-- .../plugins/publish/extract_hda.py | 4 ++-- .../plugins/publish/extract_mantra_ifd.py | 4 ++-- .../plugins/publish/extract_opengl.py | 3 ++- .../plugins/publish/extract_redshift_proxy.py | 4 ++-- .../plugins/publish/extract_render.py | 4 ++-- .../plugins/publish/extract_usd.py | 4 ++-- .../plugins/publish/extract_usd_layered.py | 19 ++++++++++++++----- .../plugins/publish/extract_vdb_cache.py | 4 ++-- .../plugins/publish/increment_current_file.py | 3 ++- .../plugins/publish/save_scene.py | 3 ++- .../validate_abc_primitive_to_detail.py | 3 ++- .../publish/validate_alembic_face_sets.py | 3 ++- .../publish/validate_alembic_input_node.py | 3 ++- .../publish/validate_animation_settings.py | 4 ++-- .../plugins/publish/validate_bypass.py | 3 ++- .../plugins/publish/validate_camera_rop.py | 3 ++- .../publish/validate_cop_output_node.py | 4 ++-- .../publish/validate_fbx_output_node.py | 3 ++- .../publish/validate_file_extension.py | 4 ++-- .../plugins/publish/validate_frame_range.py | 4 ++-- .../plugins/publish/validate_frame_token.py | 4 ++-- .../validate_houdini_license_category.py | 3 ++- .../publish/validate_instance_in_context.py | 4 ++-- .../publish/validate_mesh_is_static.py | 4 ++-- .../publish/validate_mkpaths_toggled.py | 3 ++- .../plugins/publish/validate_no_errors.py | 3 ++- .../validate_primitive_hierarchy_paths.py | 4 ++-- .../publish/validate_remote_publish.py | 4 ++-- .../validate_remote_publish_enabled.py | 3 ++- .../publish/validate_review_colorspace.py | 3 ++- .../plugins/publish/validate_scene_review.py | 3 ++- .../publish/validate_sop_output_node.py | 4 +++- .../plugins/publish/validate_subset_name.py | 4 ++-- .../validate_unreal_staticmesh_naming.py | 4 ++-- .../validate_usd_layer_path_backslashes.py | 4 ++-- .../publish/validate_usd_model_and_shade.py | 4 ++-- .../publish/validate_usd_output_node.py | 3 ++- .../validate_usd_render_product_names.py | 4 ++-- .../plugins/publish/validate_usd_setdress.py | 4 ++-- .../validate_usd_shade_model_exists.py | 4 ++-- .../publish/validate_usd_shade_workspace.py | 3 ++- .../publish/validate_vdb_output_node.py | 3 ++- .../publish/validate_workfile_paths.py | 3 ++- 77 files changed, 183 insertions(+), 124 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index 3c3ca0a81e..2c4b5749a6 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -14,10 +14,11 @@ from ayon_core.pipeline import ( CreatedInstance, AYON_INSTANCE_ID, AVALON_INSTANCE_ID, - load, + load ) from ayon_core.lib import BoolDef from .lib import imprint, read, lsattr, add_self_publish_button +import pyblish.api class Creator(LegacyCreator): @@ -355,3 +356,15 @@ class HoudiniLoader(load.LoaderPlugin): """Base class for most of the Houdini load plugins.""" settings_category = "houdini" + + +class HoudiniInstancePlugin(pyblish.api.InstancePlugin): + """Base class for most of the Houdini instance publish plugins.""" + + settings_category = "houdini" + + +class HoudiniContextPlugin(pyblish.api.ContextPlugin): + """Base class for most of the Houdini context publish plugins.""" + + settings_category = "houdini" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py index 7fda94b288..f0c8964af5 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py @@ -1,8 +1,9 @@ import pyblish.api +from ayon_houdini.api import plugin import hou -class CollectInstanceActiveState(pyblish.api.InstancePlugin): +class CollectInstanceActiveState(plugin.HoudiniInstancePlugin): """Collect default active state for instance from its node bypass state. This is done at the very end of the CollectorOrder so that any required diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py index 7b693c2d6f..c88f5d878f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py @@ -4,12 +4,12 @@ import re import hou import pyblish.api -from ayon_houdini.api import colorspace +from ayon_houdini.api import colorspace, plugin from ayon_houdini.api.lib import ( evalParmNoFrame, get_color_management_preferences) -class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): +class CollectArnoldROPRenderProducts(plugin.HoudiniInstancePlugin): """Collect Arnold ROP Render Products Collects the instance.data["files"] for the render products. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py index 81ee5a2315..b3a13ea290 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py @@ -4,9 +4,10 @@ import hou # noqa import pyblish.api from ayon_core.lib import BoolDef from ayon_core.pipeline import AYONPyblishPluginMixin +from ayon_houdini.api import plugin -class CollectAssetHandles(pyblish.api.InstancePlugin, +class CollectAssetHandles(plugin.HoudiniInstancePlugin, AYONPyblishPluginMixin): """Apply folder handles. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py index ea3c237b13..22ea4d82c0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py @@ -2,9 +2,10 @@ import os import pyblish.api import hou from ayon_houdini.api import lib +from ayon_houdini.api import plugin -class CollectDataforCache(pyblish.api.InstancePlugin): +class CollectDataforCache(plugin.HoudiniInstancePlugin): """Collect data for caching to Deadline.""" # Run after Collect Frames diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py index f6ae6246cd..8b9f193e99 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py @@ -1,9 +1,10 @@ import pyblish.api from ayon_core.lib import NumberDef from ayon_core.pipeline import AYONPyblishPluginMixin +from ayon_houdini.api import plugin -class CollectChunkSize(pyblish.api.InstancePlugin, +class CollectChunkSize(plugin.HoudiniInstancePlugin, AYONPyblishPluginMixin): """Collect chunk size for cache submission to Deadline.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py index 7b55778803..70f96e0104 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py @@ -2,9 +2,10 @@ import os import hou import pyblish.api +from ayon_houdini.api import plugin -class CollectHoudiniCurrentFile(pyblish.api.ContextPlugin): +class CollectHoudiniCurrentFile(plugin.HoudiniContextPlugin): """Inject the current working file into context""" order = pyblish.api.CollectorOrder - 0.1 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py index 586aa2da57..6acf216ef3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_houdini.api import plugin -class CollectFarmInstances(pyblish.api.InstancePlugin): +class CollectFarmInstances(plugin.HoudiniInstancePlugin): """Collect instances for farm render.""" order = pyblish.api.CollectorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py index 7805d8ec35..3378657bfd 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_frames.py @@ -5,10 +5,10 @@ import re import hou # noqa import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin -class CollectFrames(pyblish.api.InstancePlugin): +class CollectFrames(plugin.HoudiniInstancePlugin): """Collect all frames which would be saved from the ROP nodes""" # This specific order value is used so that diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py index 6cf6bbf430..eb7d196d7f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py @@ -1,7 +1,7 @@ from collections import deque import pyblish.api - +from ayon_houdini.api import plugin from ayon_core.pipeline import registered_host @@ -80,7 +80,7 @@ def iter_upstream(node): collected.update(ancestors) -class CollectUpstreamInputs(pyblish.api.InstancePlugin): +class CollectUpstreamInputs(plugin.HoudiniInstancePlugin): """Collect source input containers used for this publish. This will include `inputs` data of which loaded publishes were used in the diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py index ddf4b60c66..dc344c15fb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py @@ -1,11 +1,11 @@ import hou import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import usdlib -class CollectInstancesUsdLayered(pyblish.api.ContextPlugin): +class CollectInstancesUsdLayered(plugin.HoudiniContextPlugin): """Collect Instances from a ROP Network and its configured layer paths. The output nodes of the ROP node will only be published when *any* of the diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py index 62ceed9999..0b2110df4e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py @@ -9,11 +9,12 @@ from ayon_houdini.api.lib import ( get_color_management_preferences ) from ayon_houdini.api import ( - colorspace + colorspace, + plugin ) -class CollectKarmaROPRenderProducts(pyblish.api.InstancePlugin): +class CollectKarmaROPRenderProducts(plugin.HoudiniInstancePlugin): """Collect Karma Render Products Collects the instance.data["files"] for the multipart render product. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py index 0b3eab725d..f94cb58202 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py @@ -6,9 +6,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, apply_plugin_settings_automatically ) +from ayon_houdini.api import plugin -class CollectLocalRenderInstances(pyblish.api.InstancePlugin): +class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin): """Collect instances for local render. Agnostic Local Render Collector. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py index 09d4c82226..f9b6dd837d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py @@ -9,11 +9,12 @@ from ayon_houdini.api.lib import ( get_color_management_preferences ) from ayon_houdini.api import ( - colorspace + colorspace, + plugin ) -class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): +class CollectMantraROPRenderProducts(plugin.HoudiniInstancePlugin): """Collect Mantra Render Products Collects the instance.data["files"] for the render products. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py index 26381e065e..dba2f0bf39 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py @@ -1,9 +1,9 @@ import pyblish.api - +from ayon_houdini.api import plugin from ayon_core.pipeline.publish import KnownPublishError -class CollectOutputSOPPath(pyblish.api.InstancePlugin): +class CollectOutputSOPPath(plugin.HoudiniInstancePlugin): """Collect the out node's SOP/COP Path value.""" order = pyblish.api.CollectorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py index 3323e97c20..fa5a75d1f9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_pointcache_type.py @@ -4,9 +4,9 @@ This will add additional family to pointcache instance based on the creator_identifier parameter. """ import pyblish.api +from ayon_houdini.api import plugin - -class CollectPointcacheType(pyblish.api.InstancePlugin): +class CollectPointcacheType(plugin.HoudiniInstancePlugin): """Collect data type for pointcache instance.""" order = pyblish.api.CollectorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py index 7982b53a7e..c1d5267d0a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py @@ -9,11 +9,12 @@ from ayon_houdini.api.lib import ( get_color_management_preferences ) from ayon_houdini.api import ( - colorspace + colorspace, + plugin ) -class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): +class CollectRedshiftROPRenderProducts(plugin.HoudiniInstancePlugin): """Collect USD Render Products Collects the instance.data["files"] for the render products. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py index 845a7c4a1f..b23c8f588a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py @@ -2,10 +2,10 @@ import pyblish.api import hou from ayon_core.pipeline.publish import RepairAction -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin -class CollectRemotePublishSettings(pyblish.api.ContextPlugin): +class CollectRemotePublishSettings(plugin.HoudiniContextPlugin): """Collect custom settings of the Remote Publish node.""" order = pyblish.api.CollectorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py index fcd80e0082..cded3ac509 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py @@ -5,6 +5,7 @@ import hou import pxr.UsdRender import pyblish.api +from ayon_houdini.api import plugin def get_var_changed(variable=None): @@ -41,7 +42,7 @@ def get_var_changed(variable=None): return changed -class CollectRenderProducts(pyblish.api.InstancePlugin): +class CollectRenderProducts(plugin.HoudiniInstancePlugin): """Collect USD Render Products.""" label = "Collect Render Products" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py index ed2de785a2..9a2af9b9d8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py @@ -1,8 +1,9 @@ import hou import pyblish.api +from ayon_houdini.api import plugin -class CollectHoudiniReviewData(pyblish.api.InstancePlugin): +class CollectHoudiniReviewData(plugin.HoudiniInstancePlugin): """Collect Review Data.""" label = "Collect Review Data" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py index 78dc5fe11a..84cd8377a8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_reviewable_instances.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_houdini.api import plugin -class CollectReviewableInstances(pyblish.api.InstancePlugin): +class CollectReviewableInstances(plugin.HoudiniInstancePlugin): """Collect Reviewable Instances. Basically, all instances of the specified families diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py index b0d69a14e7..01cf095da1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py @@ -2,10 +2,10 @@ """Collector plugin for frames data on ROP instances.""" import hou # noqa import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin -class CollectRopFrameRange(pyblish.api.InstancePlugin): +class CollectRopFrameRange(plugin.HoudiniInstancePlugin): """Collect all frames which would be saved from the ROP nodes""" hosts = ["houdini"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py index db9efec7a1..91203d88e2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py @@ -2,9 +2,10 @@ """Collector for staticMesh types. """ import pyblish.api +from ayon_houdini.api import plugin -class CollectStaticMeshType(pyblish.api.InstancePlugin): +class CollectStaticMeshType(plugin.HoudiniInstancePlugin): """Collect data type for fbx instance.""" hosts = ["houdini"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py index cd82f1679a..e6da8f665e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py @@ -1,10 +1,10 @@ import pyblish.api import ayon_api - +from ayon_houdini.api import plugin from ayon_core.pipeline import usdlib, KnownPublishError -class CollectUsdBootstrap(pyblish.api.InstancePlugin): +class CollectUsdBootstrap(plugin.HoudiniInstancePlugin): """Collect special Asset/Shot bootstrap instances if those are needed. Some specific products are intended to be part of the default structure diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py index 41990d84d9..38ca0e5764 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py @@ -1,12 +1,13 @@ import os import pyblish.api +from ayon_houdini.api import plugin import ayon_houdini.api.usd as usdlib import hou -class CollectUsdLayers(pyblish.api.InstancePlugin): +class CollectUsdLayers(plugin.HoudiniInstancePlugin): """Collect the USD Layers that have configured save paths.""" order = pyblish.api.CollectorOrder + 0.35 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py index 2fd2dbd599..a340cf818e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py @@ -9,11 +9,12 @@ from ayon_houdini.api.lib import ( get_color_management_preferences ) from ayon_houdini.api import ( - colorspace + colorspace, + plugin ) -class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): +class CollectVrayROPRenderProducts(plugin.HoudiniInstancePlugin): """Collect Vray Render Products Collects the instance.data["files"] for the render products. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py index aa533bcf1b..bfa1a754c3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py @@ -1,9 +1,9 @@ import os import pyblish.api +from ayon_houdini.api import plugin - -class CollectWorkfile(pyblish.api.InstancePlugin): +class CollectWorkfile(plugin.HoudiniInstancePlugin): """Inject workfile representation into instance""" order = pyblish.api.CollectorOrder - 0.01 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py index 6f6cc978cd..91ad0836bd 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py @@ -1,8 +1,9 @@ +from ayon_houdini.api import plugin import pyblish.api import hou -class CollectWorksceneFPS(pyblish.api.ContextPlugin): +class CollectWorksceneFPS(plugin.HoudiniContextPlugin): """Get the FPS of the work scene.""" label = "Workscene FPS" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index 172399479f..d126911f79 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -1,11 +1,10 @@ import pyblish.api import tempfile -from ayon_core.pipeline import publish -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin from ayon_houdini.api.pipeline import IS_HEADLESS -class ExtractActiveViewThumbnail(publish.Extractor): +class ExtractActiveViewThumbnail(plugin.HoudiniInstancePlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py index 824ac468a2..0e658ec963 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py @@ -2,13 +2,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractAlembic(publish.Extractor): +class ExtractAlembic(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Alembic" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py index 23fe6678d4..a2e574483d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py @@ -2,13 +2,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractAss(publish.Extractor): +class ExtractAss(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Ass" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py index e477b7a552..f3a3af6556 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py @@ -2,14 +2,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish from ayon_houdini.api.lib import render_rop -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin import hou -class ExtractBGEO(publish.Extractor): +class ExtractBGEO(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract BGEO" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py index ca4c738a6a..b7061c6bcb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py @@ -2,12 +2,13 @@ import os import pyblish.api from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop, splitext import hou -class ExtractComposite(publish.Extractor, +class ExtractComposite(plugin.HoudiniInstancePlugin, publish.ColormanagedPyblishPluginMixin): order = pyblish.api.ExtractorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py index de1d8d3b3b..638c3c82d2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py @@ -3,13 +3,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractFBX(publish.Extractor): +class ExtractFBX(plugin.HoudiniInstancePlugin): label = "Extract FBX" families = ["fbx"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py index 5fe83e0dcf..3931edbb9e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py @@ -2,11 +2,11 @@ import os from pprint import pformat import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin import hou -class ExtractHDA(publish.Extractor): +class ExtractHDA(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract HDA" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py index f0bcf4b371..40dcc3e426 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py @@ -2,12 +2,12 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin import hou -class ExtractMantraIFD(publish.Extractor): +class ExtractMantraIFD(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Mantra ifd" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py index 6d608aacfa..c667ca3ca2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py @@ -3,12 +3,13 @@ import os import pyblish.api from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractOpenGL(publish.Extractor, +class ExtractOpenGL(plugin.HoudiniInstancePlugin, publish.ColormanagedPyblishPluginMixin): order = pyblish.api.ExtractorOrder - 0.01 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py index 634322b310..b445fdadb3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py @@ -2,13 +2,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractRedshiftProxy(publish.Extractor): +class ExtractRedshiftProxy(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Redshift Proxy" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 0506c7c8d5..6c5c0dbe00 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -1,12 +1,12 @@ import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou import os -class ExtractRender(publish.Extractor): +class ExtractRender(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Render" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py index 54051934d7..74e89614a0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py @@ -3,12 +3,12 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractUSD(publish.Extractor): +class ExtractUSD(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract USD" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py index df2bd0c4b6..40ae140a59 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py @@ -7,10 +7,8 @@ import hou import ayon_api import pyblish.api -from ayon_core.pipeline import ( - get_representation_path, - publish, -) +from ayon_core.pipeline import get_representation_path +from ayon_houdini.api import plugin import ayon_houdini.api.usd as hou_usdlib from ayon_houdini.api.lib import render_rop @@ -154,7 +152,7 @@ def parm_values(overrides): parm.set(value) -class ExtractUSDLayered(publish.Extractor): +class ExtractUSDLayered(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Layered USD" @@ -312,3 +310,14 @@ class ExtractUSDLayered(publish.Extractor): return False return filecmp.cmp(old_file, new_file) + + def staging_dir(self, instance): + """Provide a temporary directory in which to store extracted files + + Upon calling this method the staging directory is stored inside + the instance.data['stagingDir'] + """ + + from ayon_core.pipeline.publish import get_instance_staging_dir + + return get_instance_staging_dir(instance) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py index e1146e4978..148992001c 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py @@ -2,13 +2,13 @@ import os import pyblish.api -from ayon_core.pipeline import publish +from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop import hou -class ExtractVDBCache(publish.Extractor): +class ExtractVDBCache(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract VDB Cache" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py index 3e9291d5c2..f858c11830 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py @@ -1,4 +1,5 @@ import pyblish.api +from ayon_houdini.api import plugin from ayon_core.lib import version_up from ayon_core.pipeline import registered_host @@ -6,7 +7,7 @@ from ayon_core.pipeline.publish import get_errored_plugins_from_context from ayon_core.pipeline.publish import KnownPublishError -class IncrementCurrentFile(pyblish.api.ContextPlugin): +class IncrementCurrentFile(plugin.HoudiniContextPlugin): """Increment the current file. Saves the current scene with an increased version number. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py index 7c453038ea..43e9b95068 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py @@ -1,9 +1,10 @@ import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import registered_host -class SaveCurrentScene(pyblish.api.ContextPlugin): +class SaveCurrentScene(plugin.HoudiniContextPlugin): """Save current scene""" label = "Save current file" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py index 18a459bf7b..a6b6530b78 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from collections import defaultdict from ayon_core.pipeline import PublishValidationError -class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin): +class ValidateAbcPrimitiveToDetail(plugin.HoudiniInstancePlugin): """Validate Alembic ROP Primitive to Detail attribute is consistent. The Alembic ROP crashes Houdini whenever an attribute in the "Primitive to diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py index 40114bc40e..fa456ea395 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin import hou -class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin): +class ValidateAlembicROPFaceSets(plugin.HoudiniInstancePlugin): """Validate Face Sets are disabled for extraction to pointcache. When groups are saved as Face Sets with the Alembic these show up diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py index dbc38058e6..967b82d573 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateAlembicInputNode(pyblish.api.InstancePlugin): +class ValidateAlembicInputNode(plugin.HoudiniInstancePlugin): """Validate that the node connected to the output is correct. The connected node cannot be of the following types for Alembic: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py index 14bd3a05bd..e0c87f4962 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py @@ -1,11 +1,11 @@ import pyblish.api from ayon_core.pipeline.publish import PublishValidationError -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin import hou -class ValidateAnimationSettings(pyblish.api.InstancePlugin): +class ValidateAnimationSettings(plugin.HoudiniInstancePlugin): """Validate if the unexpanded string contains the frame ('$F') token This validator will only check the output parameter of the node if diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py index 8a83ff42fb..0be7a15cbc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateBypassed(pyblish.api.InstancePlugin): +class ValidateBypassed(plugin.HoudiniInstancePlugin): """Validate all primitives build hierarchy from attribute when enabled. The name of the attribute must exist on the prims and have the same name diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py index ad4ace988a..daa0f659f1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- """Validator plugin for Houdini Camera ROP settings.""" import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -class ValidateCameraROP(pyblish.api.InstancePlugin): +class ValidateCameraROP(plugin.HoudiniInstancePlugin): """Validate Camera ROP settings.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py index 91bd36018a..9ed326e153 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import hou import pyblish.api - +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -class ValidateCopOutputNode(pyblish.api.InstancePlugin): +class ValidateCopOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance COP Output Node. This will ensure: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py index 24d8c27bd6..2b2136c607 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py @@ -5,11 +5,12 @@ from ayon_houdini.api.action import ( SelectInvalidAction, SelectROPAction, ) +from ayon_houdini.api import plugin from ayon_houdini.api.lib import get_obj_node_output import hou -class ValidateFBXOutputNode(pyblish.api.InstancePlugin): +class ValidateFBXOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance Output Node. This will ensure: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py index 43083feeea..0b9fa1fe9f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py @@ -2,13 +2,13 @@ import os import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateFileExtension(pyblish.api.InstancePlugin): +class ValidateFileExtension(plugin.HoudiniInstancePlugin): """Validate the output file extension fits the output family. File extensions: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py index 08f82e12b8..31a0ecd2de 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline.publish import RepairAction from ayon_houdini.api.action import SelectInvalidAction - +from ayon_houdini.api import plugin import hou @@ -12,7 +12,7 @@ class DisableUseFolderHandlesAction(RepairAction): icon = "mdi.toggle-switch-off" -class ValidateFrameRange(pyblish.api.InstancePlugin): +class ValidateFrameRange(plugin.HoudiniInstancePlugin): """Validate Frame Range. Due to the usage of start and end handles, diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py index 1b8c167869..135062ff18 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py @@ -1,10 +1,10 @@ import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin import hou -class ValidateFrameToken(pyblish.api.InstancePlugin): +class ValidateFrameToken(plugin.HoudiniInstancePlugin): """Validate if the unexpanded string contains the frame ('$F') token. This validator will *only* check the output parameter of the node if diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py index 9a68c34405..b442dd1bc6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateHoudiniNotApprenticeLicense(pyblish.api.InstancePlugin): +class ValidateHoudiniNotApprenticeLicense(plugin.HoudiniInstancePlugin): """Validate the Houdini instance runs a non Apprentice license. USD ROPs: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py index 25f38c4600..0272765c47 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Validate if instance asset is the same as context asset.""" -import pyblish.api +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectROPAction from ayon_core.pipeline.publish import ( RepairAction, @@ -11,7 +11,7 @@ from ayon_core.pipeline.publish import ( ) -class ValidateInstanceInContextHoudini(pyblish.api.InstancePlugin, +class ValidateInstanceInContextHoudini(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validator to check if instance asset match context asset. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py index 6f78b9f4ff..89f0d92140 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- """Validator for correct naming of Static Meshes.""" -import pyblish.api from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin ) from ayon_core.pipeline.publish import ValidateContentsOrder +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.lib import get_output_children -class ValidateMeshIsStatic(pyblish.api.InstancePlugin, +class ValidateMeshIsStatic(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validate mesh is static. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py index 38f1c4e176..b4e48d1379 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin): +class ValidateIntermediateDirectoriesChecked(plugin.HoudiniInstancePlugin): """Validate Create Intermediate Directories is enabled on ROP node.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py index ae1e5cad27..4ad5a70930 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api import hou +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError @@ -26,7 +27,7 @@ def get_errors(node): return node.errors() -class ValidateNoErrors(pyblish.api.InstancePlugin): +class ValidateNoErrors(plugin.HoudiniInstancePlugin): """Validate the Instance has no current cooking errors.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py index f63cb23138..47e1c8b4ac 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline.publish import ( ValidateContentsOrder, @@ -14,7 +14,7 @@ class AddDefaultPathAction(RepairAction): icon = "mdi.pencil-plus-outline" -class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): +class ValidatePrimitiveHierarchyPaths(plugin.HoudiniInstancePlugin): """Validate all primitives build hierarchy from attribute when enabled. The name of the attribute must exist on the prims and have the same name diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py index 801ed08ce6..e254c4cc2f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py @@ -1,14 +1,14 @@ # -*-coding: utf-8 -*- import pyblish.api -from ayon_houdini.api import lib +from ayon_houdini.api import lib, plugin from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline import PublishValidationError import hou -class ValidateRemotePublishOutNode(pyblish.api.ContextPlugin): +class ValidateRemotePublishOutNode(plugin.HoudiniContextPlugin): """Validate the remote publish out node exists for Deadline to trigger.""" order = pyblish.api.ValidatorOrder - 0.4 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py index d4c6e7a45e..f47f1e46e3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py @@ -2,11 +2,12 @@ import pyblish.api import hou +from ayon_houdini.api import plugin from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline import PublishValidationError -class ValidateRemotePublishEnabled(pyblish.api.ContextPlugin): +class ValidateRemotePublishEnabled(plugin.HoudiniContextPlugin): """Validate the remote publish node is *not* bypassed.""" order = pyblish.api.ValidatorOrder - 0.39 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py index 30a8a35dca..a5d39378d2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py @@ -9,6 +9,7 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, apply_plugin_settings_automatically ) +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectROPAction import os @@ -20,7 +21,7 @@ class ResetViewSpaceAction(RepairAction): icon = "mdi.monitor" -class ValidateReviewColorspace(pyblish.api.InstancePlugin, +class ValidateReviewColorspace(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validate Review Colorspace parameters. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py index 0b09306b0d..a1ce0978e7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateSceneReview(pyblish.api.InstancePlugin): +class ValidateSceneReview(plugin.HoudiniInstancePlugin): """Validator Some Scene Settings before publishing the review 1. Scene Path 2. Resolution diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py index 59fa8cb134..7d33f6ef79 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- import pyblish.api from ayon_core.pipeline import PublishValidationError + +from ayon_houdini.api import plugin from ayon_houdini.api.action import ( SelectInvalidAction, SelectROPAction, @@ -9,7 +11,7 @@ from ayon_houdini.api.action import ( import hou -class ValidateSopOutputNode(pyblish.api.InstancePlugin): +class ValidateSopOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance SOP Output Node. This will ensure: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py index 3d284a4eec..ace888f6f6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- """Validator for correct naming of Static Meshes.""" -import pyblish.api from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin @@ -9,6 +8,7 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, ) +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction from ayon_core.pipeline.create import get_product_name @@ -19,7 +19,7 @@ class FixProductNameAction(RepairAction): label = "Fix Product Name" -class ValidateSubsetName(pyblish.api.InstancePlugin, +class ValidateSubsetName(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validate Product name. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py index 6b7c980fa2..5cae07d708 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py @@ -1,19 +1,19 @@ # -*- coding: utf-8 -*- """Validator for correct naming of Static Meshes.""" -import pyblish.api from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin ) from ayon_core.pipeline.publish import ValidateContentsOrder +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.lib import get_output_children import hou -class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, +class ValidateUnrealStaticMeshName(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validate name of Unreal Static Mesh. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py index 3dcf7206f1..4ad977c8cc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import pyblish.api - +from ayon_houdini.api import plugin import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError import hou -class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin): +class ValidateUSDLayerPathBackslashes(plugin.HoudiniInstancePlugin): """Validate USD loaded paths have no backslashes. This is a crucial validation for HUSK USD rendering as Houdini's diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py index 34440b70b0..c37f278c7e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import pyblish.api - +from ayon_houdini.api import plugin import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError @@ -17,7 +17,7 @@ def fullname(o): return module + "." + o.__name__ -class ValidateUsdModel(pyblish.api.InstancePlugin): +class ValidateUsdModel(plugin.HoudiniInstancePlugin): """Validate USD Model. Disallow Shaders, Render settings, products and vars and Lux lights. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py index 968d64e8fc..bede13a3ca 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -class ValidateUSDOutputNode(pyblish.api.InstancePlugin): +class ValidateUSDOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance USD LOPs Output Node. This will ensure: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py index 4825b7cc71..5f7d77de86 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import os import pyblish.api - +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -class ValidateUSDRenderProductNames(pyblish.api.InstancePlugin): +class ValidateUSDRenderProductNames(plugin.HoudiniInstancePlugin): """Validate USD Render Product names are correctly set absolute paths.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py index dc773b6770..9cc5ab8b38 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api - +from ayon_houdini.api import plugin import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError -class ValidateUsdSetDress(pyblish.api.InstancePlugin): +class ValidateUsdSetDress(plugin.HoudiniInstancePlugin): """Validate USD Set Dress. Must only have references or payloads. May not generate new mesh or diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py index 048d675c00..e56ed6cf89 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py @@ -2,7 +2,7 @@ import re import ayon_api -import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline.publish import ( ValidateContentsOrder, @@ -11,7 +11,7 @@ from ayon_core.pipeline.publish import ( ) -class ValidateUSDShadeModelExists(pyblish.api.InstancePlugin): +class ValidateUSDShadeModelExists(plugin.HoudiniInstancePlugin): """Validate the Instance has no current cooking errors.""" order = ValidateContentsOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py index 2ea4b5d816..f33fde1ae8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError import hou -class ValidateUsdShadeWorkspace(pyblish.api.InstancePlugin): +class ValidateUsdShadeWorkspace(plugin.HoudiniInstancePlugin): """Validate USD Shading Workspace is correct version. There have been some issues with outdated/erroneous Shading Workspaces diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py index 5c662c0084..c570285cb7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py @@ -5,6 +5,7 @@ import pyblish.api import hou from ayon_core.pipeline import PublishXmlValidationError +from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction @@ -60,7 +61,7 @@ def get_geometry_at_frame(sop_node, frame, force=True): return sop_node.geometryAtFrame(frame) -class ValidateVDBOutputNode(pyblish.api.InstancePlugin): +class ValidateVDBOutputNode(plugin.HoudiniInstancePlugin): """Validate that the node connected to the output node is of type VDB. All primitives of the output geometry must be VDBs, no other primitive diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py index f2008b8281..232ae4782a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api import hou +from ayon_houdini.api import plugin from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin @@ -9,7 +10,7 @@ from ayon_core.pipeline.publish import RepairAction class ValidateWorkfilePaths( - pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): + plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): """Validate workfile paths so they are absolute.""" order = pyblish.api.ValidatorOrder From c4ec025216e48b5ac4bd7949cb32240c7582ef1a Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 22:13:59 +0300 Subject: [PATCH 234/469] add missing blank line --- server_addon/houdini/client/ayon_houdini/api/plugin.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index 2c4b5749a6..7a2478f688 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -352,6 +352,7 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): for key, value in settings.items(): setattr(self, key, value) + class HoudiniLoader(load.LoaderPlugin): """Base class for most of the Houdini load plugins.""" From 753fab2197631b9bc478fca49ace71c1522f0453 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 22:15:11 +0300 Subject: [PATCH 235/469] use a constant for settings category --- server_addon/houdini/client/ayon_houdini/api/plugin.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index 7a2478f688..ea155274a8 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -21,6 +21,9 @@ from .lib import imprint, read, lsattr, add_self_publish_button import pyblish.api +SETTINGS_CATEGORY = "houdini" + + class Creator(LegacyCreator): """Creator plugin to create instances in Houdini @@ -356,16 +359,16 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): class HoudiniLoader(load.LoaderPlugin): """Base class for most of the Houdini load plugins.""" - settings_category = "houdini" + settings_category = SETTINGS_CATEGORY class HoudiniInstancePlugin(pyblish.api.InstancePlugin): """Base class for most of the Houdini instance publish plugins.""" - settings_category = "houdini" + settings_category = SETTINGS_CATEGORY class HoudiniContextPlugin(pyblish.api.ContextPlugin): """Base class for most of the Houdini context publish plugins.""" - settings_category = "houdini" + settings_category = SETTINGS_CATEGORY From d90fb46bfc3d08d977245bd95383c5a3cfcc0ebe Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 21 May 2024 22:15:31 +0300 Subject: [PATCH 236/469] use a constant for settings category --- server_addon/houdini/client/ayon_houdini/api/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index ea155274a8..a5557455bc 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -174,7 +174,7 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): settings_name = None add_publish_button = False - settings_category = "houdini" + settings_category = SETTINGS_CATEGORY def create(self, product_name, instance_data, pre_create_data): try: From caf3682e87bc3f4356f5ed8a9d54d0c040282588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A0=20Serra=20Arrizabalaga?= Date: Tue, 21 May 2024 22:22:33 +0200 Subject: [PATCH 237/469] Make sure actions in Launcher are sorted so they don't keep changing order randomly --- client/ayon_core/tools/launcher/models/actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/launcher/models/actions.py b/client/ayon_core/tools/launcher/models/actions.py index 32df600c87..c27f0cd757 100644 --- a/client/ayon_core/tools/launcher/models/actions.py +++ b/client/ayon_core/tools/launcher/models/actions.py @@ -332,7 +332,7 @@ class ActionsModel: selection = self._prepare_selection(project_name, folder_id, task_id) output = [] action_items = self._get_action_items(project_name) - for identifier, action in self._get_action_objects().items(): + for identifier, action in sorted(self._get_action_objects().items()): if not action.is_compatible(selection): continue From 6c461eb21c981ebb70c19d40013f63fcefbd1a5f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 09:54:27 +0200 Subject: [PATCH 238/469] add addon name to version.py --- server_addon/create_ayon_addons.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/server_addon/create_ayon_addons.py b/server_addon/create_ayon_addons.py index f0a36d4740..749077d2a8 100644 --- a/server_addon/create_ayon_addons.py +++ b/server_addon/create_ayon_addons.py @@ -47,7 +47,7 @@ plugin_for = ["ayon_server"] """ CLIENT_VERSION_CONTENT = '''# -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" +"""Package declaring AYON addon '{}' version.""" __version__ = "{}" ''' @@ -183,6 +183,7 @@ def create_addon_zip( def prepare_client_code( + addon_name: str, addon_dir: Path, addon_output_dir: Path, addon_version: str @@ -211,7 +212,9 @@ def prepare_client_code( version_path = subpath / "version.py" if version_path.exists(): with open(version_path, "w") as stream: - stream.write(CLIENT_VERSION_CONTENT.format(addon_version)) + stream.write( + CLIENT_VERSION_CONTENT.format(addon_name, addon_version) + ) zip_filepath = private_dir / "client.zip" with ZipFileLongPaths(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zipf: @@ -262,7 +265,9 @@ def create_addon_package( server_dir, addon_output_dir / "server", dirs_exist_ok=True ) - prepare_client_code(addon_dir, addon_output_dir, addon_version) + prepare_client_code( + package.name, addon_dir, addon_output_dir, addon_version + ) if create_zip: create_addon_zip( From f3b1d345453bb4ea64325cb1c5a006dca0b28b40 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 22 May 2024 19:23:59 +0800 Subject: [PATCH 239/469] check substance version when adding use selection into setting & tooltips edition for export channel --- .../plugins/create/create_textures.py | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index d36bf76568..402550b3e8 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -16,8 +16,8 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( ) from ayon_core.hosts.substancepainter.api.lib import get_export_presets +import substance_painter import substance_painter.project -import substance_painter as sp class CreateTextures(Creator): @@ -49,13 +49,12 @@ class CreateTextures(Creator): if key in pre_create_data: creator_attributes[key] = pre_create_data[key] #TODO: add the layer stack option - if sp.application.version_info()[0] >= 10 or ( - pre_create_data.get("use_selection")): - stack = sp.textureset.get_active_stack() + if pre_create_data.get("use_selection"): + stack = substance_painter.textureset.get_active_stack() - instance_data["selected_node_id"] = [ - node_number.uid() for node_number in - sp.layerstack.get_selected_nodes(stack)] + instance_data["selected_node_id"] = [ + node_number.uid() for node_number in + substance_painter.layerstack.get_selected_nodes(stack)] instance = self.create_instance_in_context(product_name, instance_data) @@ -116,7 +115,9 @@ class CreateTextures(Creator): default=None, label="Export Channel(s)", tooltip="Choose the channel which you " - "want to solely export"), + "want to solely export. The value " + "is 'None' by default which exports " + "all channels"), EnumDef("exportPresetUrl", items=get_export_presets(), label="Output Template"), @@ -198,7 +199,10 @@ class CreateTextures(Creator): def get_pre_create_attr_defs(self): # Use same attributes as for instance attributes - return [ - BoolDef("use_selection", label="Use selection", - tooltip="Select Layer Stack(s) for exporting") - ] + self.get_instance_attr_defs() + selection_list = [] + if substance_painter.application.version_info()[0] >= 10: + selection_list = [ + BoolDef("use_selection", label="Use selection", + tooltip="Select Layer Stack(s) for exporting") + ] + return selection_list + self.get_instance_attr_defs() From 597f4a24a3a5b09d99e86c446508b856f7b62c00 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 22 May 2024 19:24:43 +0800 Subject: [PATCH 240/469] code clean up & rename the contextmanager function to set_layer_stack_opacity --- .../hosts/substancepainter/api/lib.py | 90 ++++++++++++------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index df70a72b13..d98b7bca1a 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -4,7 +4,7 @@ import json from collections import defaultdict import contextlib -import substance_painter as sp +import substance_painter import substance_painter.project import substance_painter.resource import substance_painter.js @@ -645,47 +645,77 @@ def prompt_new_file_with_mesh(mesh_filepath): def get_export_presets_by_filtering(export_preset_name, channel_type_list): + """Function to get export presets included with specific channels + requested by users. + + Args: + export_preset_name (str): Name of export preset + channel_type_list (list): A list of channel type requested by users + + Returns: + dict: export preset data + """ + new_maps = [] export_presets = get_export_presets() + export_preset_nice_name = export_presets[export_preset_name] resource_presets = substance_painter.export.list_resource_export_presets() - preset = next((preset for preset in resource_presets - if preset.resource_id.name == ( - export_presets[export_preset_name])), None) + preset = next( + ( + preset for preset in resource_presets + if preset.resource_id.name == export_preset_nice_name + ), None + ) + if preset is None: + return {} + maps = preset.list_output_maps() + for channel_map in maps: + for n in channel_type_list: + if not channel_map.get("fileName"): + continue - if preset is not None: - maps = preset.list_output_maps() - for channel_map in maps: - for n in channel_type_list: - if n in channel_map["fileName"]: - new_maps.append(channel_map) - # Create a new preset - return { - "exportPresets": [ - { - "name": export_preset_name, - "maps": new_maps - } - ], - } - return {} + if n in channel_map["fileName"]: + new_maps.append(channel_map) + # Create a new preset + return { + "exportPresets": [ + { + "name": export_preset_name, + "maps": new_maps + } + ], + } @contextlib.contextmanager -def supsend_publish_layer_stack(node_ids, channel_type): +def set_layer_stack_opacity(node_ids, channel_type): + """Function to set the opacity of the layer stack during + context + Args: + node_ids (list): A list of substance painter node ids + channel_type (list): A list of channel types + """ + all_selected_nodes = [] opacity_set_list = [] - stack = sp.textureset.get_active_stack() - stack_root_layers = sp.layerstack.get_root_layer_nodes(stack) - if node_ids and channel_type: - for node_id in node_ids: - node = sp.layerstack.get_node_by_uid(int(node_id)) - all_selected_nodes.append(node) - filtered_nodes = [node for node in stack_root_layers - if node not in all_selected_nodes] + stack = substance_painter.textureset.get_active_stack() + stack_root_layers = ( + substance_painter.layerstack.get_root_layer_nodes(stack) + ) + # Do nothing + if not node_ids or not channel_type: + yield + return + + for node_id in node_ids: + node = substance_painter.layerstack.get_node_by_uid(int(node_id)) + all_selected_nodes.append(node) + filtered_nodes = {node for node in stack_root_layers + if node not in all_selected_nodes} for node in filtered_nodes: for channel in channel_type: - chan = getattr(sp.textureset.ChannelType, channel) + chan = getattr(substance_painter.textureset.ChannelType, channel) opacity_set_list.append((chan, node.get_opacity(chan))) try: for node in filtered_nodes: From 2dd6c12390c7e3a1bb257a9e3c0ae85c848e9e87 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 22 May 2024 19:25:10 +0800 Subject: [PATCH 241/469] rename the contextlib function --- .../substancepainter/plugins/publish/extract_textures.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py b/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py index 973a62de7a..361ad788ca 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py @@ -1,6 +1,6 @@ import substance_painter.export from ayon_core.pipeline import KnownPublishError, publish -from ayon_core.hosts.substancepainter.api.lib import supsend_publish_layer_stack +from ayon_core.hosts.substancepainter.api.lib import set_layer_stack_opacity class ExtractTextures(publish.Extractor, @@ -29,7 +29,7 @@ class ExtractTextures(publish.Extractor, export_channel = creator_attrs.get("exportChannel", []) node_ids = instance.data.get("selected_node_id", []) - with supsend_publish_layer_stack(node_ids, export_channel): + with set_layer_stack_opacity(node_ids, export_channel): result = substance_painter.export.export_project_textures(config) if result.status != substance_painter.export.ExportStatus.Success: From dd29bd8fa8f88853fb8cf4ea4ec496ec8e2a41cf Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 22 May 2024 15:46:03 +0300 Subject: [PATCH 242/469] remove original render instance --- .../ayon_core/hosts/houdini/plugins/publish/extract_render.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 7b4762a25f..651df15c10 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -72,3 +72,6 @@ class ExtractRender(publish.Extractor): raise RuntimeError("Failed to complete render extraction. " "Missing output files: {}".format( missing_frames)) + + # Remove original render instance + instance.context.remove(instance) From 9570d0baae3893bc9de594762f8e9d8c0abface8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 22 May 2024 22:11:57 +0800 Subject: [PATCH 243/469] use dict as item values for export channel settings --- .../plugins/create/create_textures.py | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index 402550b3e8..a75aaf7cd3 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -97,20 +97,38 @@ class CreateTextures(Creator): return instance def get_instance_attr_defs(self): - layer_stack_channel_enum = ["BaseColor", "Metallic", "Roughness", - "Normal", "Height", "Specular", - "SpecularEdgeColor", "Emissive", "Opacity", - "Displacement", "Glossiness", "Anisotropylevel", - "AO", "Anisotropyangle", "Transmissive", - "Reflection", "Diffuse", "Ior", - "Specularlevel", "BlendingMask", "Translucency", - "Scattering", "ScatterColor", "SheenOpacity", - "SheenRoughness", "SheenColor", "CoatOpacity", - "CoatColor", "CoatRoughness", "CoatSpecularLevel", - "CoatNormal"] return [ EnumDef("exportChannel", - items=layer_stack_channel_enum, + items={ + "BaseColor": "Base Color", + "Metallic": "Metallic", + "Roughness": "Roughness", + "SpecularEdgeColor": "Specular Edge Color", + "Emissive": "Emissive", + "Opacity": "Opacity", + "Displacement": "Displacement", + "Glossiness": "Glossiness", + "Anisotropylevel": "Anisotropy Level", + "AO": "Ambient Occulsion", + "Anisotropyangle": "Anisotropy Angle", + "Transmissive": "Transmissive", + "Reflection": "Reflection", + "Diffuse": "Diffuse", + "Ior": "Index of Refraction", + "Specularlevel": "Specular Level", + "BlendingMask": "Blending Mask", + "Translucency": "Translucency", + "Scattering": "Scattering", + "ScatterColor": "Scatter Color", + "SheenOpacity": "Sheen Opacity", + "SheenRoughness": "Sheen Roughness", + "SheenColor": "Sheen Color", + "CoatOpacity": "Coat Opacity", + "CoatColor": "Coat Color", + "CoatRoughness": "Coat Roughness", + "CoatSpecularLevel": "Coat Specular Level", + "CoatNormal": "Coat Normal", + }, multiselection=True, default=None, label="Export Channel(s)", From 86595f282c1e7d01cfea1dcf81a6cd30244aa179 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:17:30 +0200 Subject: [PATCH 244/469] move tvpaint client code next to server codebase --- .../tvpaint/client/ayon_tvpaint}/__init__.py | 0 .../tvpaint/client/ayon_tvpaint}/addon.py | 0 .../tvpaint/client/ayon_tvpaint}/api/__init__.py | 0 .../ayon_tvpaint}/api/communication_server.py | 0 .../client/ayon_tvpaint}/api/launch_script.py | 0 .../tvpaint/client/ayon_tvpaint}/api/lib.py | 0 .../tvpaint/client/ayon_tvpaint}/api/pipeline.py | 0 .../tvpaint/client/ayon_tvpaint}/api/plugin.py | 0 .../client/ayon_tvpaint}/hooks/pre_launch_args.py | 0 .../tvpaint/client/ayon_tvpaint}/lib.py | 0 .../ayon_tvpaint}/plugins/create/convert_legacy.py | 0 .../ayon_tvpaint}/plugins/create/create_render.py | 0 .../ayon_tvpaint}/plugins/create/create_review.py | 0 .../ayon_tvpaint}/plugins/create/create_workfile.py | 0 .../client/ayon_tvpaint}/plugins/load/load_image.py | 0 .../plugins/load/load_reference_image.py | 0 .../client/ayon_tvpaint}/plugins/load/load_sound.py | 0 .../ayon_tvpaint}/plugins/load/load_workfile.py | 0 .../plugins/publish/collect_instance_frames.py | 0 .../plugins/publish/collect_render_instances.py | 0 .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/collect_workfile_data.py | 0 .../plugins/publish/extract_convert_to_exr.py | 0 .../plugins/publish/extract_sequence.py | 0 .../plugins/publish/help/validate_asset_name.xml | 0 .../help/validate_duplicated_layer_names.xml | 0 .../publish/help/validate_layers_visibility.xml | 0 .../plugins/publish/help/validate_marks.xml | 0 .../publish/help/validate_missing_layer_names.xml | 0 .../publish/help/validate_render_layer_group.xml | 0 .../publish/help/validate_render_pass_group.xml | 0 .../publish/help/validate_scene_settings.xml | 0 .../plugins/publish/help/validate_start_frame.xml | 0 .../publish/help/validate_workfile_metadata.xml | 0 .../publish/help/validate_workfile_project_name.xml | 0 .../plugins/publish/increment_workfile_version.py | 0 .../plugins/publish/validate_asset_name.py | 0 .../publish/validate_duplicated_layer_names.py | 0 .../plugins/publish/validate_layers_visibility.py | 0 .../ayon_tvpaint}/plugins/publish/validate_marks.py | 0 .../plugins/publish/validate_missing_layer_names.py | 0 .../plugins/publish/validate_render_layer_group.py | 0 .../plugins/publish/validate_render_pass_group.py | 0 .../plugins/publish/validate_scene_settings.py | 0 .../plugins/publish/validate_start_frame.py | 0 .../plugins/publish/validate_workfile_metadata.py | 0 .../publish/validate_workfile_project_name.py | 0 .../client/ayon_tvpaint}/resources/template.tvpp | Bin .../client/ayon_tvpaint}/tvpaint_plugin/__init__.py | 0 .../tvpaint_plugin/plugin_code/CMakeLists.txt | 0 .../tvpaint_plugin/plugin_code/README.md | 0 .../tvpaint_plugin/plugin_code/library.cpp | 0 .../tvpaint_plugin/plugin_code/library.def | 0 .../windows_x64/plugin/OpenPypePlugin.dll | Bin .../windows_x86/plugin/OpenPypePlugin.dll | Bin .../tvpaint/client/ayon_tvpaint}/worker/__init__.py | 0 .../client/ayon_tvpaint}/worker/init_file.tvpp | Bin .../tvpaint/client/ayon_tvpaint}/worker/worker.py | 0 .../client/ayon_tvpaint}/worker/worker_job.py | 0 59 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/__init__.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/addon.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/__init__.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/communication_server.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/launch_script.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/lib.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/pipeline.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/api/plugin.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/hooks/pre_launch_args.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/lib.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/create/convert_legacy.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/create/create_render.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/create/create_review.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/load/load_image.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/load/load_reference_image.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/load/load_sound.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/load/load_workfile.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/collect_instance_frames.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/collect_render_instances.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/collect_workfile_data.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/extract_convert_to_exr.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/extract_sequence.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_asset_name.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_duplicated_layer_names.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_layers_visibility.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_marks.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_missing_layer_names.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_render_layer_group.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_render_pass_group.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_scene_settings.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_start_frame.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_workfile_metadata.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/help/validate_workfile_project_name.xml (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/increment_workfile_version.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_asset_name.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_duplicated_layer_names.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_layers_visibility.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_marks.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_missing_layer_names.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_render_layer_group.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_render_pass_group.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_scene_settings.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_start_frame.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_workfile_metadata.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/plugins/publish/validate_workfile_project_name.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/resources/template.tvpp (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/__init__.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_code/CMakeLists.txt (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_code/README.md (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_code/library.cpp (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_code/library.def (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/worker/__init__.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/worker/init_file.tvpp (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/worker/worker.py (100%) rename {client/ayon_core/hosts/tvpaint => server_addon/tvpaint/client/ayon_tvpaint}/worker/worker_job.py (100%) diff --git a/client/ayon_core/hosts/tvpaint/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/__init__.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/__init__.py rename to server_addon/tvpaint/client/ayon_tvpaint/__init__.py diff --git a/client/ayon_core/hosts/tvpaint/addon.py b/server_addon/tvpaint/client/ayon_tvpaint/addon.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/addon.py rename to server_addon/tvpaint/client/ayon_tvpaint/addon.py diff --git a/client/ayon_core/hosts/tvpaint/api/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/__init__.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/__init__.py diff --git a/client/ayon_core/hosts/tvpaint/api/communication_server.py b/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/communication_server.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py diff --git a/client/ayon_core/hosts/tvpaint/api/launch_script.py b/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/launch_script.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py diff --git a/client/ayon_core/hosts/tvpaint/api/lib.py b/server_addon/tvpaint/client/ayon_tvpaint/api/lib.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/lib.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/lib.py diff --git a/client/ayon_core/hosts/tvpaint/api/pipeline.py b/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/pipeline.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py diff --git a/client/ayon_core/hosts/tvpaint/api/plugin.py b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/api/plugin.py rename to server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py diff --git a/client/ayon_core/hosts/tvpaint/hooks/pre_launch_args.py b/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/hooks/pre_launch_args.py rename to server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py diff --git a/client/ayon_core/hosts/tvpaint/lib.py b/server_addon/tvpaint/client/ayon_tvpaint/lib.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/lib.py rename to server_addon/tvpaint/client/ayon_tvpaint/lib.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/create/convert_legacy.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/create/convert_legacy.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/create/create_render.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/create/create_render.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/create/create_review.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/create/create_review.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/create/create_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/create/create_workfile.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/load/load_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/load/load_image.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/load/load_reference_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/load/load_reference_image.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/load/load_sound.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/load/load_sound.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/load/load_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/load/load_workfile.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/collect_instance_frames.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/collect_instance_frames.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/collect_render_instances.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/collect_render_instances.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/collect_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/collect_workfile.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/collect_workfile_data.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/collect_workfile_data.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/extract_convert_to_exr.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/extract_convert_to_exr.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/extract_sequence.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/extract_sequence.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_asset_name.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_asset_name.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_asset_name.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_duplicated_layer_names.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_layers_visibility.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_layers_visibility.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_layers_visibility.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_marks.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_marks.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_marks.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_missing_layer_names.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_missing_layer_names.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_missing_layer_names.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_render_layer_group.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_render_layer_group.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_layer_group.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_render_pass_group.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_render_pass_group.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_render_pass_group.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_scene_settings.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_scene_settings.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_scene_settings.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_start_frame.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_start_frame.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_start_frame.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_workfile_metadata.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_workfile_metadata.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_metadata.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_workfile_project_name.xml b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/help/validate_workfile_project_name.xml rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/help/validate_workfile_project_name.xml diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/increment_workfile_version.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/increment_workfile_version.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_asset_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_asset_name.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_duplicated_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_duplicated_layer_names.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_layers_visibility.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_layers_visibility.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_marks.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_marks.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_missing_layer_names.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_render_layer_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_render_layer_group.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_render_pass_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_render_pass_group.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_scene_settings.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_scene_settings.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_start_frame.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_start_frame.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_workfile_metadata.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py diff --git a/client/ayon_core/hosts/tvpaint/plugins/publish/validate_workfile_project_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/plugins/publish/validate_workfile_project_name.py rename to server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py diff --git a/client/ayon_core/hosts/tvpaint/resources/template.tvpp b/server_addon/tvpaint/client/ayon_tvpaint/resources/template.tvpp similarity index 100% rename from client/ayon_core/hosts/tvpaint/resources/template.tvpp rename to server_addon/tvpaint/client/ayon_tvpaint/resources/template.tvpp diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/__init__.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/__init__.py rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/__init__.py diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/CMakeLists.txt diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/README.md similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/README.md rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/README.md diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/library.cpp rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.cpp diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_code/library.def rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_code/library.def diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x64/plugin/OpenPypePlugin.dll diff --git a/client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll b/server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll similarity index 100% rename from client/ayon_core/hosts/tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll rename to server_addon/tvpaint/client/ayon_tvpaint/tvpaint_plugin/plugin_files/windows_x86/plugin/OpenPypePlugin.dll diff --git a/client/ayon_core/hosts/tvpaint/worker/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/worker/__init__.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/worker/__init__.py rename to server_addon/tvpaint/client/ayon_tvpaint/worker/__init__.py diff --git a/client/ayon_core/hosts/tvpaint/worker/init_file.tvpp b/server_addon/tvpaint/client/ayon_tvpaint/worker/init_file.tvpp similarity index 100% rename from client/ayon_core/hosts/tvpaint/worker/init_file.tvpp rename to server_addon/tvpaint/client/ayon_tvpaint/worker/init_file.tvpp diff --git a/client/ayon_core/hosts/tvpaint/worker/worker.py b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/worker/worker.py rename to server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py diff --git a/client/ayon_core/hosts/tvpaint/worker/worker_job.py b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py similarity index 100% rename from client/ayon_core/hosts/tvpaint/worker/worker_job.py rename to server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py From 60a76239bf254406eb19eef3096e3b94a40d0060 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Wed, 22 May 2024 18:32:28 +0300 Subject: [PATCH 245/469] disable integration for the original render instance Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../ayon_core/hosts/houdini/plugins/publish/extract_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 651df15c10..20e9341ebd 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -74,4 +74,4 @@ class ExtractRender(publish.Extractor): missing_frames)) # Remove original render instance - instance.context.remove(instance) + instance.data["integrate"] = False From ab8d5186b9f9c9a9fc885272dc398b579aa8225e Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 22 May 2024 18:42:19 +0300 Subject: [PATCH 246/469] update comment about skipping integration --- .../ayon_core/hosts/houdini/plugins/publish/extract_render.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 20e9341ebd..267280ad9f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -73,5 +73,5 @@ class ExtractRender(publish.Extractor): "Missing output files: {}".format( missing_frames)) - # Remove original render instance + # Skip integrating original render instance instance.data["integrate"] = False From 48167e23c79baf4510d514426139f07f9ec86a9b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:43:31 +0200 Subject: [PATCH 247/469] Implement sorting proxy model --- .../tools/launcher/ui/actions_widget.py | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/launcher/ui/actions_widget.py b/client/ayon_core/tools/launcher/ui/actions_widget.py index a225827418..3e4dfaf6e4 100644 --- a/client/ayon_core/tools/launcher/ui/actions_widget.py +++ b/client/ayon_core/tools/launcher/ui/actions_widget.py @@ -290,6 +290,34 @@ class ActionDelegate(QtWidgets.QStyledItemDelegate): painter.drawPixmap(extender_x, extender_y, pix) +class ActionsProxyModel(QtCore.QSortFilterProxyModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) + + def lessThan(self, left, right): + # Sort by action order and then by label + left_value = left.data(ACTION_SORT_ROLE) + right_value = right.data(ACTION_SORT_ROLE) + + # Values are same -> use super sorting + if left_value == right_value: + # Default behavior is using DisplayRole + return super().lessThan(left, right) + + # Validate 'None' values + if right_value is None: + return True + if left_value is None: + return False + # Sort values and handle incompatible types + try: + return left_value < right_value + except TypeError: + return True + + class ActionsWidget(QtWidgets.QWidget): def __init__(self, controller, parent): super(ActionsWidget, self).__init__(parent) @@ -316,10 +344,7 @@ class ActionsWidget(QtWidgets.QWidget): model = ActionsQtModel(controller) - proxy_model = QtCore.QSortFilterProxyModel() - proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) - proxy_model.setSortRole(ACTION_SORT_ROLE) - + proxy_model = ActionsProxyModel() proxy_model.setSourceModel(model) view.setModel(proxy_model) From 88cae86ee67a0cedd2e0635dd1fe1f6a2a45f4d9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:43:42 +0200 Subject: [PATCH 248/469] reverse sorting in actions model --- client/ayon_core/tools/launcher/models/actions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/launcher/models/actions.py b/client/ayon_core/tools/launcher/models/actions.py index c27f0cd757..32df600c87 100644 --- a/client/ayon_core/tools/launcher/models/actions.py +++ b/client/ayon_core/tools/launcher/models/actions.py @@ -332,7 +332,7 @@ class ActionsModel: selection = self._prepare_selection(project_name, folder_id, task_id) output = [] action_items = self._get_action_items(project_name) - for identifier, action in sorted(self._get_action_objects().items()): + for identifier, action in self._get_action_objects().items(): if not action.is_compatible(selection): continue From 7f586576415493f0c49bdb497fb70c9921b038ed Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 22 May 2024 18:46:39 +0300 Subject: [PATCH 249/469] move code to a dedicated place --- .../plugins/publish/collect_local_render_instances.py | 6 +++--- .../hosts/houdini/plugins/publish/extract_render.py | 3 --- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py index 5a446fa0d3..474002e1ee 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/collect_local_render_instances.py @@ -132,6 +132,6 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin): ] }) - # Remove original render instance - # I can't remove it here as I still need it to trigger the render. - # context.remove(instance) + # Skip integrating original render instance. + # We are not removing it because it's used to trigger the render. + instance.data["integrate"] = False diff --git a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py index 267280ad9f..7b4762a25f 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/extract_render.py @@ -72,6 +72,3 @@ class ExtractRender(publish.Extractor): raise RuntimeError("Failed to complete render extraction. " "Missing output files: {}".format( missing_frames)) - - # Skip integrating original render instance - instance.data["integrate"] = False From 299b9d14733f34a0a77f6ff6ffe2419ac4cd5ef9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:52:56 +0200 Subject: [PATCH 250/469] fix imports --- .../tvpaint/client/ayon_tvpaint/api/communication_server.py | 2 +- .../tvpaint/client/ayon_tvpaint/api/launch_script.py | 2 +- server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py | 3 ++- .../tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py | 2 +- .../client/ayon_tvpaint/plugins/create/convert_legacy.py | 4 ++-- .../client/ayon_tvpaint/plugins/create/create_render.py | 4 ++-- .../client/ayon_tvpaint/plugins/create/create_review.py | 2 +- .../client/ayon_tvpaint/plugins/create/create_workfile.py | 2 +- .../tvpaint/client/ayon_tvpaint/plugins/load/load_image.py | 4 ++-- .../ayon_tvpaint/plugins/load/load_reference_image.py | 6 +++--- .../tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py | 4 ++-- .../client/ayon_tvpaint/plugins/load/load_workfile.py | 6 +++--- .../ayon_tvpaint/plugins/publish/collect_workfile_data.py | 4 ++-- .../client/ayon_tvpaint/plugins/publish/extract_sequence.py | 4 ++-- .../ayon_tvpaint/plugins/publish/validate_asset_name.py | 2 +- .../client/ayon_tvpaint/plugins/publish/validate_marks.py | 2 +- .../ayon_tvpaint/plugins/publish/validate_start_frame.py | 2 +- server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py | 4 ++-- .../tvpaint/client/ayon_tvpaint/worker/worker_job.py | 2 +- 19 files changed, 31 insertions(+), 30 deletions(-) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py b/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py index d185bdf685..7ccb49f07e 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/api/communication_server.py @@ -22,7 +22,7 @@ from aiohttp_json_rpc.protocol import ( from aiohttp_json_rpc.exceptions import RpcError from ayon_core.lib import emit_event -from ayon_core.hosts.tvpaint.tvpaint_plugin import get_plugin_files_path +from ayon_tvpaint.tvpaint_plugin import get_plugin_files_path log = logging.getLogger(__name__) log.setLevel(logging.DEBUG) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py b/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py index bcc92d8b6d..1e23e95572 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/api/launch_script.py @@ -10,7 +10,7 @@ from qtpy import QtWidgets, QtCore, QtGui from ayon_core import style from ayon_core.pipeline import install_host -from ayon_core.hosts.tvpaint.api import ( +from ayon_tvpaint.api import ( TVPaintHost, CommunicationWrapper, ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py b/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py index 6f5c4d49d4..5ec6355138 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/api/pipeline.py @@ -7,8 +7,9 @@ import requests import ayon_api import pyblish.api +from ayon_tvpaint import TVPAINT_ROOT_DIR + from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost -from ayon_core.hosts.tvpaint import TVPAINT_ROOT_DIR from ayon_core.settings import get_current_project_settings from ayon_core.lib import register_event_callback from ayon_core.pipeline import ( diff --git a/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py b/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py index 691b81e089..8ee91aa0e7 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/hooks/pre_launch_args.py @@ -37,6 +37,6 @@ class TvpaintPrelaunchHook(PreLaunchHook): self.launch_context.launch_args.extend(remainders) def launch_script_path(self): - from ayon_core.hosts.tvpaint import get_launch_script_path + from ayon_tvpaint import get_launch_script_path return get_launch_script_path() diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py index 34fe0ce8f4..e79a6565e8 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/convert_legacy.py @@ -4,8 +4,8 @@ from ayon_core.pipeline.create.creator_plugins import ( ProductConvertorPlugin, cache_and_get_instances, ) -from ayon_core.hosts.tvpaint.api.plugin import SHARED_DATA_KEY -from ayon_core.hosts.tvpaint.api.lib import get_groups_data +from ayon_tvpaint.api.plugin import SHARED_DATA_KEY +from ayon_tvpaint.api.lib import get_groups_data class TVPaintLegacyConverted(ProductConvertorPlugin): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py index dc9c2466e0..2286a4417a 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_render.py @@ -52,11 +52,11 @@ from ayon_core.pipeline.create import ( CreatedInstance, CreatorError, ) -from ayon_core.hosts.tvpaint.api.plugin import ( +from ayon_tvpaint.api.plugin import ( TVPaintCreator, TVPaintAutoCreator, ) -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api.lib import ( get_layers_data, get_groups_data, execute_george_through_file, diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py index acb4f0f8d6..6068ffa1d8 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_review.py @@ -1,7 +1,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance -from ayon_core.hosts.tvpaint.api.plugin import TVPaintAutoCreator +from ayon_tvpaint.api.plugin import TVPaintAutoCreator class TVPaintReviewCreator(TVPaintAutoCreator): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py index f21f41439e..b08f731869 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/create/create_workfile.py @@ -1,7 +1,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance -from ayon_core.hosts.tvpaint.api.plugin import TVPaintAutoCreator +from ayon_tvpaint.api.plugin import TVPaintAutoCreator class TVPaintWorkfileCreator(TVPaintAutoCreator): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py index aad8f92d26..de61992d3f 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py @@ -1,6 +1,6 @@ from ayon_core.lib.attribute_definitions import BoolDef -from ayon_core.hosts.tvpaint.api import plugin -from ayon_core.hosts.tvpaint.api.lib import execute_george_through_file +from ayon_tvpaint.api import plugin +from ayon_tvpaint.api.lib import execute_george_through_file class ImportImage(plugin.Loader): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py index a7fcb9f4a4..ce08aa9cd9 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py @@ -2,12 +2,12 @@ import collections from ayon_core.lib.attribute_definitions import BoolDef from ayon_core.pipeline import registered_host -from ayon_core.hosts.tvpaint.api import plugin -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api import plugin +from ayon_tvpaint.api.lib import ( get_layers_data, execute_george_through_file, ) -from ayon_core.hosts.tvpaint.api.pipeline import ( +from ayon_tvpaint.api.pipeline import ( write_workfile_metadata, SECTION_NAME_CONTAINERS, containerise, diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py index 7e8c8022d6..086afba079 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_sound.py @@ -1,7 +1,7 @@ import os import tempfile -from ayon_core.hosts.tvpaint.api import plugin -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api import plugin +from ayon_tvpaint.api.lib import ( execute_george_through_file, ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py index 07c2d91533..045e22f188 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_workfile.py @@ -10,11 +10,11 @@ from ayon_core.pipeline.workfile import ( get_last_workfile_with_version, ) from ayon_core.pipeline.template_data import get_template_data_with_names -from ayon_core.hosts.tvpaint.api import plugin -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api import plugin +from ayon_tvpaint.api.lib import ( execute_george_through_file, ) -from ayon_core.hosts.tvpaint.api.pipeline import ( +from ayon_tvpaint.api.pipeline import ( get_current_workfile_context, ) from ayon_core.pipeline.version_start import get_versioning_start diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py index 3155773bda..8f32b57e67 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py @@ -4,13 +4,13 @@ import tempfile import pyblish.api -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api.lib import ( execute_george, execute_george_through_file, get_layers_data, get_groups_data, ) -from ayon_core.hosts.tvpaint.api.pipeline import ( +from ayon_tvpaint.api.pipeline import ( SECTION_NAME_CONTEXT, SECTION_NAME_INSTANCES, SECTION_NAME_CONTAINERS, diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py index fe5e148b7b..dc06726295 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py @@ -10,13 +10,13 @@ from ayon_core.pipeline.publish import ( KnownPublishError, get_publish_instance_families, ) -from ayon_core.hosts.tvpaint.api.lib import ( +from ayon_tvpaint.api.lib import ( execute_george, execute_george_through_file, get_layers_pre_post_behavior, get_layers_exposure_frames, ) -from ayon_core.hosts.tvpaint.lib import ( +from ayon_tvpaint.lib import ( calculate_layers_extraction_data, get_frame_filename_template, fill_reference_frames, diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py index 764c090720..55b06aa489 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( PublishXmlValidationError, OptionalPyblishPluginMixin, ) -from ayon_core.hosts.tvpaint.api.pipeline import ( +from ayon_tvpaint.api.pipeline import ( list_instances, write_instances, ) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py index 6bfbe840bb..f4e7eae2e1 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( PublishXmlValidationError, OptionalPyblishPluginMixin, ) -from ayon_core.hosts.tvpaint.api.lib import execute_george +from ayon_tvpaint.api.lib import execute_george class ValidateMarksRepair(pyblish.api.Action): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py index fea64bd6a8..f8f4fbb3c9 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( PublishXmlValidationError, OptionalPyblishPluginMixin, ) -from ayon_core.hosts.tvpaint.api.lib import execute_george +from ayon_tvpaint.api.lib import execute_george class RepairStartFrame(pyblish.api.Action): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py index 3d9b1ef2b8..aa79fd442c 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker.py @@ -5,11 +5,11 @@ import tempfile import shutil import asyncio -from ayon_core.hosts.tvpaint.api.communication_server import ( +from ayon_tvpaint.api.communication_server import ( BaseCommunicator, CommunicationWrapper ) -from openpype_modules.job_queue.job_workers import WorkerJobsConnection +from ayon_core.modules.job_queue.job_workers import WorkerJobsConnection from .worker_job import ProcessTVPaintCommands diff --git a/server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py index f111ed369a..db91010c47 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/worker/worker_job.py @@ -256,7 +256,7 @@ class CollectSceneData(BaseCommand): name = "collect_scene_data" def execute(self): - from ayon_core.hosts.tvpaint.api.lib import ( + from ayon_tvpaint.api.lib import ( get_layers_data, get_groups_data, get_layers_pre_post_behavior, From ff55f08ad55bbaf4db41d6de18c51736a95c31b9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:53:08 +0200 Subject: [PATCH 251/469] use ayon naming over openpype --- server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py index e715b959f4..ed3c38d564 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py @@ -12,7 +12,7 @@ from ayon_core.pipeline.create.creator_plugins import cache_and_get_instances from .lib import get_layers_data -SHARED_DATA_KEY = "openpype.tvpaint.instances" +SHARED_DATA_KEY = "ayon.tvpaint.instances" class TVPaintCreatorCommon: From 9a5421674a2e41dba8f1ac3679229062ec6eacf7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 17:59:35 +0200 Subject: [PATCH 252/469] change version and add more information about addon --- server_addon/tvpaint/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/tvpaint/package.py b/server_addon/tvpaint/package.py index 2be3164f4a..c9e482efe7 100644 --- a/server_addon/tvpaint/package.py +++ b/server_addon/tvpaint/package.py @@ -1,3 +1,10 @@ name = "tvpaint" title = "TVPaint" -version = "0.1.2" +version = "0.2.0" +app_host_name = "tvpaint" +client_dir = "ayon_tvpaint" + +ayon_required_addons = { + "core": ">0.3.1", +} +ayon_compatible_addons = {} From f629148ae94eff0dad6fc2074842b72e7ab1fa5b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 18:00:17 +0200 Subject: [PATCH 253/469] add milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 21b1193b07..d9bd5b6af3 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "tvpaint": VersionInfo(0, 2, 0), } # Inherit from `object` for Python 2 hosts From 0f033d394a58b909d9a315bc99eff871968cfa2c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 18:08:09 +0200 Subject: [PATCH 254/469] define 'settings_category' on plugins --- server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py | 5 +++++ .../ayon_tvpaint/plugins/publish/collect_instance_frames.py | 2 ++ .../ayon_tvpaint/plugins/publish/collect_render_instances.py | 1 + .../client/ayon_tvpaint/plugins/publish/collect_workfile.py | 2 ++ .../ayon_tvpaint/plugins/publish/collect_workfile_data.py | 2 ++ .../ayon_tvpaint/plugins/publish/extract_convert_to_exr.py | 2 ++ .../client/ayon_tvpaint/plugins/publish/extract_sequence.py | 2 ++ .../plugins/publish/increment_workfile_version.py | 2 ++ .../ayon_tvpaint/plugins/publish/validate_asset_name.py | 2 ++ .../plugins/publish/validate_duplicated_layer_names.py | 2 ++ .../plugins/publish/validate_layers_visibility.py | 2 ++ .../client/ayon_tvpaint/plugins/publish/validate_marks.py | 2 ++ .../plugins/publish/validate_missing_layer_names.py | 2 ++ .../plugins/publish/validate_render_layer_group.py | 2 ++ .../plugins/publish/validate_render_pass_group.py | 2 ++ .../ayon_tvpaint/plugins/publish/validate_scene_settings.py | 2 ++ .../ayon_tvpaint/plugins/publish/validate_start_frame.py | 2 ++ .../plugins/publish/validate_workfile_metadata.py | 2 ++ .../plugins/publish/validate_workfile_project_name.py | 2 ++ 19 files changed, 40 insertions(+) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py index ed3c38d564..9dd6ae530a 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/api/plugin.py @@ -89,6 +89,8 @@ class TVPaintCreatorCommon: class TVPaintCreator(Creator, TVPaintCreatorCommon): + settings_category = "tvpaint" + def collect_instances(self): self._collect_create_instances() @@ -140,6 +142,8 @@ class TVPaintCreator(Creator, TVPaintCreatorCommon): class TVPaintAutoCreator(AutoCreator, TVPaintCreatorCommon): + settings_category = "tvpaint" + def collect_instances(self): self._collect_create_instances() @@ -152,6 +156,7 @@ class TVPaintAutoCreator(AutoCreator, TVPaintCreatorCommon): class Loader(LoaderPlugin): hosts = ["tvpaint"] + settings_category = "tvpaint" @staticmethod def get_members_from_container(container): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py index 5f134a0cd0..a9e69166d7 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_instance_frames.py @@ -14,6 +14,8 @@ class CollectOutputFrameRange(pyblish.api.InstancePlugin): hosts = ["tvpaint"] families = ["review", "render"] + settings_category = "tvpaint" + def process(self, instance): folder_entity = instance.data.get("folderEntity") if not folder_entity: diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py index 596d257f22..00af624700 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_render_instances.py @@ -9,6 +9,7 @@ class CollectRenderInstances(pyblish.api.InstancePlugin): hosts = ["tvpaint"] families = ["render", "review"] + settings_category = "tvpaint" ignore_render_pass_transparency = False def process(self, instance): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py index a9e9db3872..27de086a46 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile.py @@ -9,6 +9,8 @@ class CollectWorkfile(pyblish.api.InstancePlugin): hosts = ["tvpaint"] families = ["workfile"] + settings_category = "tvpaint" + def process(self, instance): context = instance.context current_file = context.data["currentFile"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py index 8f32b57e67..a34a718ff5 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/collect_workfile_data.py @@ -58,6 +58,8 @@ class CollectWorkfileData(pyblish.api.ContextPlugin): hosts = ["tvpaint"] actions = [ResetTVPaintWorkfileMetadata] + settings_category = "tvpaint" + def process(self, context): current_project_id = execute_george("tv_projectcurrentid") execute_george("tv_projectselect {}".format(current_project_id)) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py index d1bc68ef35..020ebc1a89 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_convert_to_exr.py @@ -23,6 +23,8 @@ class ExtractConvertToEXR(pyblish.api.InstancePlugin): hosts = ["tvpaint"] families = ["render"] + settings_category = "tvpaint" + enabled = False # Replace source PNG files or just add diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py index dc06726295..86c20c6528 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/extract_sequence.py @@ -31,6 +31,8 @@ class ExtractSequence(pyblish.api.InstancePlugin): hosts = ["tvpaint"] families = ["review", "render"] + settings_category = "tvpaint" + # Modifiable with settings review_bg = [255, 255, 255, 1.0] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py index 5dd6110bc7..601d276b97 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/increment_workfile_version.py @@ -12,6 +12,8 @@ class IncrementWorkfileVersion(pyblish.api.ContextPlugin): optional = True hosts = ["tvpaint"] + settings_category = "tvpaint" + def process(self, context): assert all(result["success"] for result in context.data["results"]), ( diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py index 55b06aa489..8763c005dc 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_asset_name.py @@ -48,6 +48,8 @@ class ValidateAssetName( hosts = ["tvpaint"] actions = [FixFolderPaths] + settings_category = "tvpaint" + def process(self, context): if not self.is_active(context.data): return diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py index aab0557bdd..be4dc0f123 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_duplicated_layer_names.py @@ -9,6 +9,8 @@ class ValidateLayersGroup(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder families = ["renderPass"] + settings_category = "tvpaint" + def process(self, instance): # Prepare layers layers_by_name = instance.context.data["layersByName"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py index 1bcdf7baa1..f58b8a6973 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_layers_visibility.py @@ -10,6 +10,8 @@ class ValidateLayersVisiblity(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder families = ["review", "render"] + settings_category = "tvpaint" + def process(self, instance): layers = instance.data.get("layers") # Instance have empty layers diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py index f4e7eae2e1..0911beb4e8 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_marks.py @@ -41,6 +41,8 @@ class ValidateMarks( optional = True actions = [ValidateMarksRepair] + settings_category = "tvpaint" + @staticmethod def get_expected_data(context): scene_mark_in = context.data["sceneMarkIn"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py index 3fc80f6e78..f340d3c10d 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_missing_layer_names.py @@ -9,6 +9,8 @@ class ValidateMissingLayers(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder families = ["renderPass"] + settings_category = "tvpaint" + def process(self, instance): # Prepare layers layers_by_name = instance.context.data["layersByName"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py index 0e97a01de2..b20ea3cac6 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_layer_group.py @@ -12,6 +12,8 @@ class ValidateRenderLayerGroups(pyblish.api.ContextPlugin): label = "Validate Render Layers Group" order = pyblish.api.ValidatorOrder + 0.1 + settings_category = "tvpaint" + def process(self, context): # Prepare layers render_layers_by_group_id = collections.defaultdict(list) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py index 874af38dd4..3d00fd031f 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_render_pass_group.py @@ -13,6 +13,8 @@ class ValidateLayersGroup(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 families = ["renderPass"] + settings_category = "tvpaint" + def process(self, instance): # Prepare layers layers_data = instance.context.data["layersData"] diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py index 5e42b5ab2f..8bad5c43c8 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_scene_settings.py @@ -16,6 +16,8 @@ class ValidateProjectSettings( label = "Validate Scene Settings" order = pyblish.api.ValidatorOrder + + settings_category = "tvpaint" optional = True def process(self, context): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py index f8f4fbb3c9..9669acf1b5 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_start_frame.py @@ -27,6 +27,8 @@ class ValidateStartFrame( order = pyblish.api.ValidatorOrder hosts = ["tvpaint"] actions = [RepairStartFrame] + + settings_category = "tvpaint" optional = True def process(self, context): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py index 1d9954d051..34c02c78ed 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_metadata.py @@ -31,6 +31,8 @@ class ValidateWorkfileMetadata(pyblish.api.ContextPlugin): actions = [ValidateWorkfileMetadataRepair] + settings_category = "tvpaint" + required_keys = {"project_name", "folder_path", "task_name"} def process(self, context): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py index 5b42842717..868c7d44fc 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/publish/validate_workfile_project_name.py @@ -12,6 +12,8 @@ class ValidateWorkfileProjectName(pyblish.api.ContextPlugin): label = "Validate Workfile Project Name" order = pyblish.api.ValidatorOrder + settings_category = "tvpaint" + def process(self, context): workfile_context = context.data.get("workfile_context") # If workfile context is missing than project is matching to From 3dc40e4ba406cafddb3751d4be4fd60657d1a081 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 22 May 2024 18:14:19 +0200 Subject: [PATCH 255/469] remove 'app_host_name' as it's supported since server 1.1.1 --- server_addon/tvpaint/package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server_addon/tvpaint/package.py b/server_addon/tvpaint/package.py index c9e482efe7..073d04c07e 100644 --- a/server_addon/tvpaint/package.py +++ b/server_addon/tvpaint/package.py @@ -1,7 +1,6 @@ name = "tvpaint" title = "TVPaint" version = "0.2.0" -app_host_name = "tvpaint" client_dir = "ayon_tvpaint" ayon_required_addons = { From 22564b2071dc25acdf0afe8b17e2b65e6c597365 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 00:56:34 +0800 Subject: [PATCH 256/469] Update server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../client/ayon_substancepainter/deploy/plugins/ayon_plugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index fd819bf476..4d7b318e44 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,6 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - print(widget.__module__) if widget.__module__.startswith("ayon_substancepainter."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) From b2c0fc08b7989975ec1b97832ee61a87d1ff13a9 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 00:57:01 +0800 Subject: [PATCH 257/469] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index b82168c27e..1508225fd8 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,7 +1,6 @@ name = "substancepainter" title = "Substance Painter" version = "0.2.0" -app_host_name = "substancepainter" client_dir = "ayon_substancepainter" From 11eb3d7def6c7faf2510f0f94cd4d4b966e64f70 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 01:00:05 +0800 Subject: [PATCH 258/469] use ayon_ to capture widget in ayon_core too --- .../client/ayon_substancepainter/deploy/plugins/ayon_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 4d7b318e44..85bb56d73c 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,7 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("ayon_substancepainter."): + if widget.__module__.startswith("ayon_"): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) From d56628e68bb1fa901ee34372f71170f4cd9105a5 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Wed, 22 May 2024 20:07:03 +0300 Subject: [PATCH 259/469] remove `app_host_name` Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/houdini/package.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 467806f364..9e5fe56e34 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -2,8 +2,6 @@ name = "houdini" title = "Houdini" version = "0.3.0" -app_host_name = "houdini" - client_dir = "ayon_houdini" ayon_required_addons = { From 4d85f56193c359c4dbd6d69f1be0910bb89cce30 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 23 May 2024 12:28:46 +0300 Subject: [PATCH 260/469] revert changes in `Applications settings` docstring --- server_addon/applications/server/settings.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index ec6b4ba1d7..6c131a5e9d 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -144,15 +144,7 @@ class ToolGroupModel(BaseSettingsModel): class ApplicationsSettings(BaseSettingsModel): - """Applications settings - - Define applications available to your studio, locations of their - executables, and their additional environment variables. - - AYON uses the following definitions to populate the applications list - in project anatomy > attributes. - So, You'd still need modify your project anatomy settings. - """ + """Applications settings""" maya: AppGroupWithPython = SettingsField( default_factory=AppGroupWithPython, title="Autodesk Maya") From 4bef6c9911ff47edf88dfa1b45fbb36c945e90e6 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Thu, 23 May 2024 12:34:54 +0300 Subject: [PATCH 261/469] refactor an if condition Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../plugins/publish/validate_export_is_a_single_frame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py b/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py index 6775699adf..b188055bc7 100644 --- a/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py +++ b/client/ayon_core/hosts/houdini/plugins/publish/validate_export_is_a_single_frame.py @@ -42,7 +42,7 @@ class ValidateSingleFrame(pyblish.api.InstancePlugin, frame_end = instance.data.get("frameEndHandle") # This happens if instance node has no 'trange' parameter. - if (frame_start or frame_end) is None: + if frame_start is None or frame_end is None: cls.log.debug( "No frame data, skipping check.." ) From a97a33af6eea5b76daa34046491cb0cce7132ac9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 18:21:37 +0800 Subject: [PATCH 262/469] add channel mapping setting into ayon project setting --- .../plugins/create/create_textures.py | 45 +++++---------- server_addon/substancepainter/package.py | 2 +- .../server/settings/creator_plugins.py | 56 +++++++++++++++++++ .../substancepainter/server/settings/main.py | 5 ++ 4 files changed, 75 insertions(+), 33 deletions(-) create mode 100644 server_addon/substancepainter/server/settings/creator_plugins.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index a75aaf7cd3..3a6387d71d 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -28,9 +28,14 @@ class CreateTextures(Creator): icon = "picture-o" default_variant = "Main" + channel_mapping = [] + + def apply_settings(self, project_settings): + settings = project_settings["substancepainter"].get("create") # noqa + self.channel_mapping = settings["CreateTextures"].get("channel_mapping") + def create(self, product_name, instance_data, pre_create_data): - if not substance_painter.project.is_open(): raise CreatorError("Can't create a Texture Set instance without " "an open project.") @@ -48,7 +53,7 @@ class CreateTextures(Creator): ]: if key in pre_create_data: creator_attributes[key] = pre_create_data[key] - #TODO: add the layer stack option + if pre_create_data.get("use_selection"): stack = substance_painter.textureset.get_active_stack() @@ -97,38 +102,14 @@ class CreateTextures(Creator): return instance def get_instance_attr_defs(self): + export_channel_enum = { + item["value"]: item["name"] + for item in self.channel_mapping + } + return [ EnumDef("exportChannel", - items={ - "BaseColor": "Base Color", - "Metallic": "Metallic", - "Roughness": "Roughness", - "SpecularEdgeColor": "Specular Edge Color", - "Emissive": "Emissive", - "Opacity": "Opacity", - "Displacement": "Displacement", - "Glossiness": "Glossiness", - "Anisotropylevel": "Anisotropy Level", - "AO": "Ambient Occulsion", - "Anisotropyangle": "Anisotropy Angle", - "Transmissive": "Transmissive", - "Reflection": "Reflection", - "Diffuse": "Diffuse", - "Ior": "Index of Refraction", - "Specularlevel": "Specular Level", - "BlendingMask": "Blending Mask", - "Translucency": "Translucency", - "Scattering": "Scattering", - "ScatterColor": "Scatter Color", - "SheenOpacity": "Sheen Opacity", - "SheenRoughness": "Sheen Roughness", - "SheenColor": "Sheen Color", - "CoatOpacity": "Coat Opacity", - "CoatColor": "Coat Color", - "CoatRoughness": "Coat Roughness", - "CoatSpecularLevel": "Coat Specular Level", - "CoatNormal": "Coat Normal", - }, + items=export_channel_enum, multiselection=True, default=None, label="Export Channel(s)", diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index d445b0059f..bd71e1d67d 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,3 +1,3 @@ name = "substancepainter" title = "Substance Painter" -version = "0.1.1" +version = "0.1.2" diff --git a/server_addon/substancepainter/server/settings/creator_plugins.py b/server_addon/substancepainter/server/settings/creator_plugins.py new file mode 100644 index 0000000000..b16c9504aa --- /dev/null +++ b/server_addon/substancepainter/server/settings/creator_plugins.py @@ -0,0 +1,56 @@ +from ayon_server.settings import BaseSettingsModel, SettingsField + + +class ChannelMappingItemModel(BaseSettingsModel): + _layout = "compact" + name: str = SettingsField(title="Channel Type") + value: str = SettingsField(title="Channel Name") + + +class CreateTextureModel(BaseSettingsModel): + channel_mapping: list[ChannelMappingItemModel] = SettingsField( + default_factory=list, title="Channel Mapping") + + +class CreatorsModel(BaseSettingsModel): + CreateTextures: CreateTextureModel = SettingsField( + default_factory=CreateTextureModel, + title="Create Textures" + ) + + +DEFAULT_CREATOR_SETTINGS = { + "CreateTextures": { + "channel_mapping": [ + {"name": "Base Color", "value": "BaseColor"}, + {"name": "Metallic", "value": "Metallic"}, + {"name": "Specular Edge Color", + "value": "SpecularEdgeColor"}, + {"name": "Opacity", "value": "Opacity"}, + {"name": "Displacement", "value": "Displacement"}, + {"name": "Glossiness", "value": "Glossiness"}, + {"name": "Anisotropy Level", + "value": "Anisotropylevel"}, + {"name": "Ambient Occulsion", "value": "AO"}, + {"name": "Anisotropy Angle", + "value": "Anisotropyangle"}, + {"name": "Transmissive", "value": "Transmissive"}, + {"name": "Reflection", "value": "Reflection"}, + {"name": "Diffuse", "value": "Diffuse"}, + {"name": "Index of Refraction", "value": "Ior"}, + {"name": "Specular Level", "value": "Specularlevel"}, + {"name": "Blending Mask", "value": "BlendingMask"}, + {"name": "Translucency", "value": "Translucency"}, + {"name": "Scattering", "value": "Scattering"}, + {"name": "Scatter Color", "value": "ScatterColor"}, + {"name": "Sheen Opacity", "value": "SheenOpacity"}, + {"name": "Sheen Color", "value": "SheenColor"}, + {"name": "Coat Opacity", "value": "CoatOpacity"}, + {"name": "Coat Color", "value": "CoatColor"}, + {"name": "Coat Roughness", "value": "CoatRoughness"}, + {"name": "CoatSpecularLevel", + "value": "Coat Specular Level"}, + {"name": "CoatNormal", "value": "Coat Normal"} + ], + } +} \ No newline at end of file diff --git a/server_addon/substancepainter/server/settings/main.py b/server_addon/substancepainter/server/settings/main.py index 93523fd650..9a13d2c32f 100644 --- a/server_addon/substancepainter/server/settings/main.py +++ b/server_addon/substancepainter/server/settings/main.py @@ -1,5 +1,6 @@ from ayon_server.settings import BaseSettingsModel, SettingsField from .imageio import ImageIOSettings, DEFAULT_IMAGEIO_SETTINGS +from .creator_plugins import CreatorsModel, DEFAULT_CREATOR_SETTINGS from .load_plugins import LoadersModel, DEFAULT_LOADER_SETTINGS @@ -18,6 +19,8 @@ class SubstancePainterSettings(BaseSettingsModel): default_factory=list, title="Shelves" ) + create: CreatorsModel = SettingsField( + default_factory=DEFAULT_CREATOR_SETTINGS, title="Creators") load: LoadersModel = SettingsField( default_factory=DEFAULT_LOADER_SETTINGS, title="Loaders") @@ -25,5 +28,7 @@ class SubstancePainterSettings(BaseSettingsModel): DEFAULT_SPAINTER_SETTINGS = { "imageio": DEFAULT_IMAGEIO_SETTINGS, "shelves": [], + "create": DEFAULT_CREATOR_SETTINGS, "load": DEFAULT_LOADER_SETTINGS, + } From ced2ac05d059fa36726c1dd2b66ee89f4dbefae5 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 19:22:49 +0800 Subject: [PATCH 263/469] Update client/ayon_core/hosts/substancepainter/api/lib.py Co-authored-by: Roy Nieterau --- .../ayon_core/hosts/substancepainter/api/lib.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index d98b7bca1a..4fb586a8d6 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -656,20 +656,18 @@ def get_export_presets_by_filtering(export_preset_name, channel_type_list): dict: export preset data """ - new_maps = [] - export_presets = get_export_presets() export_preset_nice_name = export_presets[export_preset_name] resource_presets = substance_painter.export.list_resource_export_presets() - preset = next( - ( - preset for preset in resource_presets - if preset.resource_id.name == export_preset_nice_name - ), None - ) - if preset is None: + for preset in resource_presets: + if preset.resource_id.name == export_preset_nice_name: + break + else: + # No matching preset found return {} + maps = preset.list_output_maps() + new_maps = [] for channel_map in maps: for n in channel_type_list: if not channel_map.get("fileName"): From d9705392a6f16ba6f0c0e71781417348a117aaee Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 19:54:46 +0800 Subject: [PATCH 264/469] code tweaks - big roy's comment --- .../hosts/substancepainter/api/lib.py | 74 ++++++++----------- .../plugins/create/create_textures.py | 6 +- .../publish/collect_textureset_images.py | 7 +- 3 files changed, 41 insertions(+), 46 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index 4fb586a8d6..e92a730b28 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -644,67 +644,57 @@ def prompt_new_file_with_mesh(mesh_filepath): return project_mesh -def get_export_presets_by_filtering(export_preset_name, channel_type_list): - """Function to get export presets included with specific channels - requested by users. +def get_export_preset_by_name(preset_name: str) -> substance_painter.export.Resource: + export_presets= get_export_presets() + preset_full_name = export_presets[preset_name] + for export_preset in substance_painter.export.list_resource_export_presets(): + if export_preset.resource_id.name == preset_full_name: + return export_preset - Args: - export_preset_name (str): Name of export preset - channel_type_list (list): A list of channel type requested by users - Returns: - dict: export preset data - """ +def get_export_preset_with_filtered_maps( + export_preset: substance_painter.export.Resource, + channel_type_names: list[str]) -> dict: + filtered_maps = [] + for output_map in export_preset.list_output_maps(): + output_filename = output_map.get("fileName") + if not output_filename: + continue - export_presets = get_export_presets() - export_preset_nice_name = export_presets[export_preset_name] - resource_presets = substance_painter.export.list_resource_export_presets() - for preset in resource_presets: - if preset.resource_id.name == export_preset_nice_name: - break - else: - # No matching preset found - return {} - - maps = preset.list_output_maps() - new_maps = [] - for channel_map in maps: - for n in channel_type_list: - if not channel_map.get("fileName"): - continue - - if n in channel_map["fileName"]: - new_maps.append(channel_map) + if any( + channel_type_name in output_filename + for channel_type_name in channel_type_names + ): + filtered_maps.append(output_map) # Create a new preset return { "exportPresets": [ { - "name": export_preset_name, - "maps": new_maps + "name": export_preset.resource_id.name, + "maps": filtered_maps } ], } @contextlib.contextmanager -def set_layer_stack_opacity(node_ids, channel_type): +def set_layer_stack_opacity(node_ids, channel_types): """Function to set the opacity of the layer stack during context Args: node_ids (list): A list of substance painter node ids - channel_type (list): A list of channel types + channel_types (list): A list of channel types """ - + # Do nothing + if not node_ids or not channel_types: + yield + return all_selected_nodes = [] - opacity_set_list = [] + original_opacity_values = [] stack = substance_painter.textureset.get_active_stack() stack_root_layers = ( substance_painter.layerstack.get_root_layer_nodes(stack) ) - # Do nothing - if not node_ids or not channel_type: - yield - return for node_id in node_ids: node = substance_painter.layerstack.get_node_by_uid(int(node_id)) @@ -712,16 +702,16 @@ def set_layer_stack_opacity(node_ids, channel_type): filtered_nodes = {node for node in stack_root_layers if node not in all_selected_nodes} for node in filtered_nodes: - for channel in channel_type: + for channel in channel_types: chan = getattr(substance_painter.textureset.ChannelType, channel) - opacity_set_list.append((chan, node.get_opacity(chan))) + original_opacity_values.append((chan, node.get_opacity(chan))) try: for node in filtered_nodes: - for channel, _ in opacity_set_list: + for channel, _ in original_opacity_values: node.set_opacity(0.0, channel) yield finally: for node in filtered_nodes: - for channel, opacity in opacity_set_list: + for channel, opacity in original_opacity_values: node.set_opacity(opacity, channel) diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index 3a6387d71d..044561af6c 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -31,8 +31,10 @@ class CreateTextures(Creator): channel_mapping = [] def apply_settings(self, project_settings): - settings = project_settings["substancepainter"].get("create") # noqa - self.channel_mapping = settings["CreateTextures"].get("channel_mapping") + settings = project_settings["substancepainter"].get("create", []) # noqa + if settings: + self.channel_mapping = settings["CreateTextures"].get( + "channel_mapping", []) def create(self, product_name, instance_data, pre_create_data): diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py index b90e77db80..31740840c6 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py @@ -8,7 +8,8 @@ import substance_painter.textureset from ayon_core.pipeline import publish from ayon_core.hosts.substancepainter.api.lib import ( get_parsed_export_maps, - get_export_presets_by_filtering, + get_export_preset_by_name, + get_export_preset_with_filtered_maps, strip_template ) from ayon_core.pipeline.create import get_product_name @@ -210,6 +211,8 @@ class CollectTextureSet(pyblish.api.InstancePlugin): parameters.pop(key) channel_layer = creator_attrs.get("exportChannel", []) if channel_layer: - maps = get_export_presets_by_filtering(preset_url, channel_layer) + export_preset_nice_name = get_export_preset_by_name(preset_url) + maps = get_export_preset_with_filtered_maps( + export_preset_nice_name, channel_layer) config.update(maps) return config From e9a56f356d9d93d6cd2bcb1abb151781866704e3 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 19:59:15 +0800 Subject: [PATCH 265/469] implement backward compatibility for the channel setting in creator --- .../hosts/substancepainter/api/lib.py | 37 +++++++++++++++++++ .../plugins/create/create_textures.py | 14 ++++--- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index e92a730b28..43765e7bdd 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -13,6 +13,43 @@ import substance_painter.export from qtpy import QtGui, QtWidgets, QtCore +def get_channel_map_enum(): + """Function to get channel map items value. + For backward compatibility only. Will be removed after + client addon migration + """ + return { + "BaseColor": "Base Color", + "Metallic": "Metallic", + "Roughness": "Roughness", + "SpecularEdgeColor": "Specular Edge Color", + "Emissive": "Emissive", + "Opacity": "Opacity", + "Displacement": "Displacement", + "Glossiness": "Glossiness", + "Anisotropylevel": "Anisotropy Level", + "AO": "Ambient Occulsion", + "Anisotropyangle": "Anisotropy Angle", + "Transmissive": "Transmissive", + "Reflection": "Reflection", + "Diffuse": "Diffuse", + "Ior": "Index of Refraction", + "Specularlevel": "Specular Level", + "BlendingMask": "Blending Mask", + "Translucency": "Translucency", + "Scattering": "Scattering", + "ScatterColor": "Scatter Color", + "SheenOpacity": "Sheen Opacity", + "SheenRoughness": "Sheen Roughness", + "SheenColor": "Sheen Color", + "CoatOpacity": "Coat Opacity", + "CoatColor": "Coat Color", + "CoatRoughness": "Coat Roughness", + "CoatSpecularLevel": "Coat Specular Level", + "CoatNormal": "Coat Normal", + } + + def get_export_presets(): """Return Export Preset resource URLs for all available Export Presets. diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index 044561af6c..ca766d3ce9 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -14,7 +14,9 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( set_instances, remove_instance ) -from ayon_core.hosts.substancepainter.api.lib import get_export_presets +from ayon_core.hosts.substancepainter.api.lib import ( + get_export_presets, get_channel_map_enum +) import substance_painter import substance_painter.project @@ -35,6 +37,8 @@ class CreateTextures(Creator): if settings: self.channel_mapping = settings["CreateTextures"].get( "channel_mapping", []) + else: + self.channel_mapping = get_channel_map_enum() def create(self, product_name, instance_data, pre_create_data): @@ -200,10 +204,10 @@ class CreateTextures(Creator): def get_pre_create_attr_defs(self): # Use same attributes as for instance attributes - selection_list = [] + attr_defs = [] if substance_painter.application.version_info()[0] >= 10: - selection_list = [ + attr_defs.append( BoolDef("use_selection", label="Use selection", tooltip="Select Layer Stack(s) for exporting") - ] - return selection_list + self.get_instance_attr_defs() + ) + return attr_defs + self.get_instance_attr_defs() From b70e0b304b9e08854875ae38316606086b019a8a Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 20:08:23 +0800 Subject: [PATCH 266/469] renaming filtered_nodes to excluded_nodes & make sure the code implmentation in creator doesn't break the integration --- .../ayon_core/hosts/substancepainter/api/lib.py | 17 +++++++++-------- .../plugins/create/create_textures.py | 14 +++++++------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index 43765e7bdd..0b5a328cb8 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -726,29 +726,30 @@ def set_layer_stack_opacity(node_ids, channel_types): if not node_ids or not channel_types: yield return - all_selected_nodes = [] - original_opacity_values = [] + stack = substance_painter.textureset.get_active_stack() stack_root_layers = ( substance_painter.layerstack.get_root_layer_nodes(stack) ) - + all_selected_nodes = [] for node_id in node_ids: node = substance_painter.layerstack.get_node_by_uid(int(node_id)) all_selected_nodes.append(node) - filtered_nodes = {node for node in stack_root_layers - if node not in all_selected_nodes} - for node in filtered_nodes: + excluded_nodes = {node for node in stack_root_layers + if node not in all_selected_nodes} + + original_opacity_values = [] + for node in excluded_nodes: for channel in channel_types: chan = getattr(substance_painter.textureset.ChannelType, channel) original_opacity_values.append((chan, node.get_opacity(chan))) try: - for node in filtered_nodes: + for node in excluded_nodes: for channel, _ in original_opacity_values: node.set_opacity(0.0, channel) yield finally: - for node in filtered_nodes: + for node in excluded_nodes: for channel, opacity in original_opacity_values: node.set_opacity(opacity, channel) diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index ca766d3ce9..04b471f24d 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -15,7 +15,8 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( remove_instance ) from ayon_core.hosts.substancepainter.api.lib import ( - get_export_presets, get_channel_map_enum + get_export_presets, + get_channel_map_enum ) import substance_painter @@ -35,8 +36,11 @@ class CreateTextures(Creator): def apply_settings(self, project_settings): settings = project_settings["substancepainter"].get("create", []) # noqa if settings: - self.channel_mapping = settings["CreateTextures"].get( + self.channel_mapping = { + item["value"]: item["name"] + for item in settings["CreateTextures"].get( "channel_mapping", []) + } else: self.channel_mapping = get_channel_map_enum() @@ -108,14 +112,10 @@ class CreateTextures(Creator): return instance def get_instance_attr_defs(self): - export_channel_enum = { - item["value"]: item["name"] - for item in self.channel_mapping - } return [ EnumDef("exportChannel", - items=export_channel_enum, + items=self.channel_mapping, multiselection=True, default=None, label="Export Channel(s)", From 63398b1c61cafe089731e739f1b93513cec31d42 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 20:19:58 +0800 Subject: [PATCH 267/469] make sure the code doesn't break the integration --- .../ayon_core/hosts/substancepainter/api/lib.py | 7 ++----- .../plugins/create/create_textures.py | 16 +++++++++------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index 0b5a328cb8..edf7851aa0 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -681,7 +681,7 @@ def prompt_new_file_with_mesh(mesh_filepath): return project_mesh -def get_export_preset_by_name(preset_name: str) -> substance_painter.export.Resource: +def get_export_preset_by_name(preset_name: str): export_presets= get_export_presets() preset_full_name = export_presets[preset_name] for export_preset in substance_painter.export.list_resource_export_presets(): @@ -689,9 +689,7 @@ def get_export_preset_by_name(preset_name: str) -> substance_painter.export.Reso return export_preset -def get_export_preset_with_filtered_maps( - export_preset: substance_painter.export.Resource, - channel_type_names: list[str]) -> dict: +def get_export_preset_with_filtered_maps(export_preset, channel_type_names): filtered_maps = [] for output_map in export_preset.list_output_maps(): output_filename = output_map.get("fileName") @@ -752,4 +750,3 @@ def set_layer_stack_opacity(node_ids, channel_types): for node in excluded_nodes: for channel, opacity in original_opacity_values: node.set_opacity(opacity, channel) - diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index 04b471f24d..36dd9d6dba 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -36,13 +36,8 @@ class CreateTextures(Creator): def apply_settings(self, project_settings): settings = project_settings["substancepainter"].get("create", []) # noqa if settings: - self.channel_mapping = { - item["value"]: item["name"] - for item in settings["CreateTextures"].get( + self.channel_mapping = settings["CreateTextures"].get( "channel_mapping", []) - } - else: - self.channel_mapping = get_channel_map_enum() def create(self, product_name, instance_data, pre_create_data): @@ -112,10 +107,17 @@ class CreateTextures(Creator): return instance def get_instance_attr_defs(self): + if self.channel_mapping: + export_channel_enum = { + item["value"]: item["name"] + for item in self.channel_mapping + } + else: + export_channel_enum = get_channel_map_enum() return [ EnumDef("exportChannel", - items=self.channel_mapping, + items=export_channel_enum, multiselection=True, default=None, label="Export Channel(s)", From b57854784f9d0aff4fb7116d5f0aa58ac39b8059 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 20:37:01 +0800 Subject: [PATCH 268/469] make sure the export channel filtering function is working --- .../hosts/substancepainter/api/lib.py | 52 ++++++++++++------- .../publish/collect_textureset_images.py | 7 +-- 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index edf7851aa0..f026425f24 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -681,32 +681,46 @@ def prompt_new_file_with_mesh(mesh_filepath): return project_mesh -def get_export_preset_by_name(preset_name: str): - export_presets= get_export_presets() - preset_full_name = export_presets[preset_name] - for export_preset in substance_painter.export.list_resource_export_presets(): - if export_preset.resource_id.name == preset_full_name: - return export_preset +def get_export_presets_by_filtering(export_preset_name, channel_type_names): + """Function to get export presets included with specific channels + requested by users. + Args: + export_preset_name (str): Name of export preset + channel_type_list (list): A list of channel type requested by users -def get_export_preset_with_filtered_maps(export_preset, channel_type_names): - filtered_maps = [] - for output_map in export_preset.list_output_maps(): - output_filename = output_map.get("fileName") - if not output_filename: - continue + Returns: + dict: export preset data + """ - if any( - channel_type_name in output_filename - for channel_type_name in channel_type_names - ): - filtered_maps.append(output_map) + target_maps = [] + + export_presets = get_export_presets() + export_preset_nice_name = export_presets[export_preset_name] + resource_presets = substance_painter.export.list_resource_export_presets() + preset = next( + ( + preset for preset in resource_presets + if preset.resource_id.name == export_preset_nice_name + ), None + ) + if preset is None: + return {} + + maps = preset.list_output_maps() + for channel_map in maps: + for channel_name in channel_type_names: + if not channel_map.get("fileName"): + continue + + if channel_name in channel_map["fileName"]: + target_maps.append(channel_map) # Create a new preset return { "exportPresets": [ { - "name": export_preset.resource_id.name, - "maps": filtered_maps + "name": export_preset_name, + "maps": target_maps } ], } diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py index 31740840c6..b90e77db80 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py @@ -8,8 +8,7 @@ import substance_painter.textureset from ayon_core.pipeline import publish from ayon_core.hosts.substancepainter.api.lib import ( get_parsed_export_maps, - get_export_preset_by_name, - get_export_preset_with_filtered_maps, + get_export_presets_by_filtering, strip_template ) from ayon_core.pipeline.create import get_product_name @@ -211,8 +210,6 @@ class CollectTextureSet(pyblish.api.InstancePlugin): parameters.pop(key) channel_layer = creator_attrs.get("exportChannel", []) if channel_layer: - export_preset_nice_name = get_export_preset_by_name(preset_url) - maps = get_export_preset_with_filtered_maps( - export_preset_nice_name, channel_layer) + maps = get_export_presets_by_filtering(preset_url, channel_layer) config.update(maps) return config From c86c3770b54f03b898188ed74c780db18a75d517 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 14:39:47 +0200 Subject: [PATCH 269/469] bump version to '0.3.2' --- client/ayon_core/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 275e1b1dd6..655595d9f4 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON core addon version.""" -__version__ = "0.3.2-dev.1" +__version__ = "0.3.2" diff --git a/package.py b/package.py index b7b8d2dae6..cf9d7b2035 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "0.3.2-dev.1" +version = "0.3.2" client_dir = "ayon_core" From 5be9f4e253f9765e635a3c98444712bfdf5365e9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 14:40:20 +0200 Subject: [PATCH 270/469] bump version to '0.3.3-dev.1' --- client/ayon_core/version.py | 2 +- package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/version.py b/client/ayon_core/version.py index 655595d9f4..e4297e2000 100644 --- a/client/ayon_core/version.py +++ b/client/ayon_core/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON core addon version.""" -__version__ = "0.3.2" +__version__ = "0.3.3-dev.1" diff --git a/package.py b/package.py index cf9d7b2035..73f7174b6f 100644 --- a/package.py +++ b/package.py @@ -1,6 +1,6 @@ name = "core" title = "Core" -version = "0.3.2" +version = "0.3.3-dev.1" client_dir = "ayon_core" From a25bda81a1a29f3987a88181ff11ea93bb64d360 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 15:01:47 +0200 Subject: [PATCH 271/469] fix version requirements --- server_addon/clockify/package.py | 2 +- server_addon/tvpaint/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/clockify/package.py b/server_addon/clockify/package.py index 9482d7e0f7..61e0685191 100644 --- a/server_addon/clockify/package.py +++ b/server_addon/clockify/package.py @@ -4,6 +4,6 @@ version = "0.2.0" client_dir = "ayon_clockify" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {} diff --git a/server_addon/tvpaint/package.py b/server_addon/tvpaint/package.py index 073d04c07e..3ab35f727e 100644 --- a/server_addon/tvpaint/package.py +++ b/server_addon/tvpaint/package.py @@ -4,6 +4,6 @@ version = "0.2.0" client_dir = "ayon_tvpaint" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {} From c2984fcc3b97323a75af48b4396bb595bac0ac9a Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 21:08:13 +0800 Subject: [PATCH 272/469] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 1508225fd8..4db5ef634f 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -5,6 +5,6 @@ version = "0.2.0" client_dir = "ayon_substancepainter" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {} From f3033a08f8ad926a420902b8ed797f404a0674f4 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 22:27:46 +0800 Subject: [PATCH 273/469] rename channel name to channel map --- .../substancepainter/server/settings/creator_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/server/settings/creator_plugins.py b/server_addon/substancepainter/server/settings/creator_plugins.py index b16c9504aa..363ed7fe88 100644 --- a/server_addon/substancepainter/server/settings/creator_plugins.py +++ b/server_addon/substancepainter/server/settings/creator_plugins.py @@ -4,7 +4,7 @@ from ayon_server.settings import BaseSettingsModel, SettingsField class ChannelMappingItemModel(BaseSettingsModel): _layout = "compact" name: str = SettingsField(title="Channel Type") - value: str = SettingsField(title="Channel Name") + value: str = SettingsField(title="Channel Map") class CreateTextureModel(BaseSettingsModel): From d92385c3d491c84d4466a8f115684961d19100c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 23 May 2024 17:05:58 +0200 Subject: [PATCH 274/469] :recyce: move maya addon --- client/ayon_core/addon/base.py | 4 +++- .../plugins/publish/submit_maya_deadline.py | 4 ++-- pyproject.toml | 4 ++++ .../maya/client/ayon_maya}/__init__.py | 0 .../maya/client/ayon_maya}/addon.py | 0 .../maya/client/ayon_maya}/api/__init__.py | 0 .../maya/client/ayon_maya}/api/action.py | 0 .../maya/client/ayon_maya}/api/alembic.py | 2 +- .../maya/client/ayon_maya}/api/commands.py | 0 .../maya/client/ayon_maya}/api/customize.py | 0 .../maya/client/ayon_maya}/api/exitstack.py | 2 +- .../maya/client/ayon_maya}/api/fbx.py | 2 +- .../maya/client/ayon_maya}/api/gltf.py | 2 +- .../maya/client/ayon_maya}/api/lib.py | 0 .../ayon_maya}/api/lib_renderproducts.py | 0 .../ayon_maya}/api/lib_rendersettings.py | 2 +- .../client/ayon_maya}/api/lib_rendersetup.py | 2 +- .../maya/client/ayon_maya}/api/menu.py | 2 +- .../maya/client/ayon_maya}/api/pipeline.py | 6 ++--- .../maya/client/ayon_maya}/api/plugin.py | 2 +- .../ayon_maya}/api/render_setup_tools.py | 0 .../maya/client/ayon_maya}/api/setdress.py | 2 +- .../api/workfile_template_builder.py | 0 .../maya/client/ayon_maya}/api/workio.py | 0 .../maya/client/ayon_maya}/api/yeti.py | 0 .../ayon_maya}/hooks/pre_auto_load_plugins.py | 0 .../client/ayon_maya}/hooks/pre_copy_mel.py | 2 +- .../pre_open_workfile_post_initialization.py | 0 .../maya/client/ayon_maya}/lib.py | 0 .../client/ayon_maya}/plugins/__init__.py | 0 .../plugins/create/convert_legacy.py | 6 ++--- .../create/create_animation_pointcache.py | 2 +- .../create/create_arnold_scene_source.py | 2 +- .../plugins/create/create_assembly.py | 2 +- .../plugins/create/create_camera.py | 2 +- .../plugins/create/create_layout.py | 2 +- .../ayon_maya}/plugins/create/create_look.py | 2 +- .../plugins/create/create_matchmove.py | 2 +- .../plugins/create/create_maya_usd.py | 2 +- .../plugins/create/create_mayascene.py | 2 +- .../ayon_maya}/plugins/create/create_model.py | 2 +- .../plugins/create/create_multishot_layout.py | 2 +- .../plugins/create/create_multiverse_look.py | 2 +- .../plugins/create/create_multiverse_usd.py | 2 +- .../create/create_multiverse_usd_comp.py | 2 +- .../create/create_multiverse_usd_over.py | 2 +- .../plugins/create/create_proxy_abc.py | 2 +- .../plugins/create/create_redshift_proxy.py | 2 +- .../plugins/create/create_render.py | 2 +- .../plugins/create/create_rendersetup.py | 2 +- .../plugins/create/create_review.py | 2 +- .../ayon_maya}/plugins/create/create_rig.py | 2 +- .../plugins/create/create_setdress.py | 2 +- .../create/create_unreal_skeletalmesh.py | 2 +- .../create/create_unreal_staticmesh.py | 2 +- .../plugins/create/create_unreal_yeticache.py | 2 +- .../plugins/create/create_vrayproxy.py | 2 +- .../plugins/create/create_vrayscene.py | 2 +- .../plugins/create/create_workfile.py | 2 +- .../ayon_maya}/plugins/create/create_xgen.py | 2 +- .../plugins/create/create_yeti_cache.py | 2 +- .../plugins/create/create_yeti_rig.py | 2 +- .../plugins/inventory/connect_geometry.py | 2 +- .../plugins/inventory/connect_xgen.py | 0 .../plugins/inventory/connect_yeti_rig.py | 2 +- .../plugins/inventory/import_modelrender.py | 2 +- .../plugins/inventory/import_reference.py | 2 +- .../rig_recreate_animation_instance.py | 2 +- .../plugins/inventory/select_containers.py | 2 +- .../plugins/load/_load_animation.py | 8 +++---- .../client/ayon_maya}/plugins/load/actions.py | 6 ++--- .../plugins/load/load_arnold_standin.py | 6 ++--- .../plugins/load/load_as_template.py | 2 +- .../ayon_maya}/plugins/load/load_assembly.py | 6 ++--- .../ayon_maya}/plugins/load/load_audio.py | 4 ++-- .../ayon_maya}/plugins/load/load_gpucache.py | 6 ++--- .../ayon_maya}/plugins/load/load_image.py | 4 ++-- .../plugins/load/load_image_plane.py | 4 ++-- .../ayon_maya}/plugins/load/load_look.py | 8 +++---- .../ayon_maya}/plugins/load/load_matchmove.py | 0 .../ayon_maya}/plugins/load/load_maya_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd_over.py | 4 ++-- .../plugins/load/load_redshift_proxy.py | 6 ++--- .../ayon_maya}/plugins/load/load_reference.py | 4 ++-- .../plugins/load/load_rendersetup.py | 4 ++-- .../plugins/load/load_vdb_to_arnold.py | 6 ++--- .../plugins/load/load_vdb_to_redshift.py | 6 ++--- .../plugins/load/load_vdb_to_vray.py | 8 +++---- .../ayon_maya}/plugins/load/load_vrayproxy.py | 6 ++--- .../ayon_maya}/plugins/load/load_vrayscene.py | 6 ++--- .../ayon_maya}/plugins/load/load_xgen.py | 8 +++---- .../plugins/load/load_yeti_cache.py | 8 +++---- .../ayon_maya}/plugins/load/load_yeti_rig.py | 4 ++-- .../ayon_maya}/plugins/publish/__init__.py | 0 .../plugins/publish/collect_animation.py | 0 .../publish/collect_arnold_scene_source.py | 2 +- .../plugins/publish/collect_assembly.py | 4 ++-- .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_fbx_animation.py | 0 .../plugins/publish/collect_fbx_camera.py | 0 .../publish/collect_file_dependencies.py | 0 .../plugins/publish/collect_gltf.py | 0 .../plugins/publish/collect_history.py | 0 .../plugins/publish/collect_inputs.py | 4 ++-- .../plugins/publish/collect_instances.py | 8 ++++--- .../plugins/publish/collect_look.py | 2 +- .../publish/collect_maya_scene_time.py | 0 .../plugins/publish/collect_maya_units.py | 0 .../plugins/publish/collect_maya_workspace.py | 0 .../plugins/publish/collect_model.py | 0 .../publish/collect_multiverse_look.py | 2 +- .../plugins/publish/collect_pointcache.py | 0 .../plugins/publish/collect_remove_marked.py | 0 .../plugins/publish/collect_render.py | 4 ++-- .../publish/collect_render_layer_aovs.py | 2 +- .../publish/collect_renderable_camera.py | 2 +- .../plugins/publish/collect_review.py | 2 +- .../plugins/publish/collect_rig_sets.py | 0 .../plugins/publish/collect_skeleton_mesh.py | 0 .../publish/collect_unreal_skeletalmesh.py | 0 .../publish/collect_unreal_staticmesh.py | 0 .../collect_user_defined_attributes.py | 0 .../plugins/publish/collect_vrayproxy.py | 0 .../plugins/publish/collect_vrayscene.py | 2 +- .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/collect_workscene_fps.py | 0 .../plugins/publish/collect_xgen.py | 2 +- .../plugins/publish/collect_yeti_cache.py | 4 ++-- .../plugins/publish/collect_yeti_rig.py | 2 +- .../publish/determine_future_version.py | 0 .../publish/extract_active_view_thumbnail.py | 2 +- .../publish/extract_arnold_scene_source.py | 2 +- .../plugins/publish/extract_assembly.py | 2 +- .../plugins/publish/extract_camera_alembic.py | 2 +- .../publish/extract_camera_mayaScene.py | 2 +- .../ayon_maya}/plugins/publish/extract_fbx.py | 4 ++-- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../plugins/publish/extract_gltf.py | 6 ++--- .../plugins/publish/extract_gpu_cache.py | 0 .../publish/extract_import_reference.py | 2 +- .../plugins/publish/extract_layout.py | 0 .../plugins/publish/extract_look.py | 2 +- .../plugins/publish/extract_maya_scene_raw.py | 2 +- .../plugins/publish/extract_maya_usd.py | 2 +- .../plugins/publish/extract_model.py | 2 +- .../publish/extract_multiverse_look.py | 2 +- .../plugins/publish/extract_multiverse_usd.py | 2 +- .../publish/extract_multiverse_usd_comp.py | 2 +- .../publish/extract_multiverse_usd_over.py | 2 +- .../ayon_maya}/plugins/publish/extract_obj.py | 2 +- .../plugins/publish/extract_playblast.py | 2 +- .../plugins/publish/extract_pointcache.py | 4 ++-- .../plugins/publish/extract_proxy_abc.py | 4 ++-- .../plugins/publish/extract_redshift_proxy.py | 4 ++-- .../plugins/publish/extract_rendersetup.py | 0 .../ayon_maya}/plugins/publish/extract_rig.py | 2 +- .../plugins/publish/extract_skeleton_mesh.py | 2 +- .../plugins/publish/extract_thumbnail.py | 2 +- .../extract_unreal_skeletalmesh_abc.py | 4 ++-- .../extract_unreal_skeletalmesh_fbx.py | 2 +- .../publish/extract_unreal_staticmesh.py | 4 ++-- .../publish/extract_unreal_yeticache.py | 0 .../plugins/publish/extract_vrayproxy.py | 2 +- .../plugins/publish/extract_vrayscene.py | 4 ++-- .../plugins/publish/extract_workfile_xgen.py | 2 +- .../plugins/publish/extract_xgen.py | 2 +- .../plugins/publish/extract_yeti_cache.py | 0 .../plugins/publish/extract_yeti_rig.py | 2 +- .../submit_maya_remote_publish_deadline.xml | 2 +- ...ate_animation_out_set_related_node_ids.xml | 4 ++-- .../publish/help/validate_maya_units.xml | 0 .../help/validate_mesh_non_manifold.xml | 0 .../publish/help/validate_node_ids.xml | 0 .../help/validate_rig_out_set_node_ids.xml | 2 +- .../help/validate_skeletalmesh_hierarchy.xml | 0 .../increment_current_file_deadline.py | 0 .../plugins/publish/reset_xgen_attributes.py | 0 .../ayon_maya}/plugins/publish/save_scene.py | 0 .../validate_alembic_options_defaults.py | 16 +++++++------- .../publish/validate_animation_content.py | 4 ++-- ...date_animation_out_set_related_node_ids.py | 6 ++--- .../publish/validate_arnold_scene_source.py | 2 +- .../validate_arnold_scene_source_cbid.py | 2 +- .../publish/validate_ass_relative_paths.py | 0 .../plugins/publish/validate_assembly_name.py | 4 ++-- .../publish/validate_assembly_namespaces.py | 4 ++-- .../publish/validate_assembly_transforms.py | 8 +++---- .../plugins/publish/validate_attributes.py | 2 +- .../publish/validate_camera_attributes.py | 4 ++-- .../publish/validate_camera_contents.py | 4 ++-- .../plugins/publish/validate_color_sets.py | 4 ++-- ...validate_current_renderlayer_renderable.py | 0 .../plugins/publish/validate_cycle_error.py | 6 ++--- .../plugins/publish/validate_frame_range.py | 2 +- .../plugins/publish/validate_glsl_material.py | 0 .../plugins/publish/validate_glsl_plugin.py | 0 .../publish/validate_instance_has_members.py | 4 ++-- .../publish/validate_instance_in_context.py | 4 ++-- .../publish/validate_instance_subset.py | 0 .../plugins/publish/validate_loaded_plugin.py | 0 .../plugins/publish/validate_look_contents.py | 4 ++-- ...lidate_look_default_shaders_connections.py | 0 .../validate_look_id_reference_edits.py | 4 ++-- .../validate_look_no_default_shaders.py | 4 ++-- .../plugins/publish/validate_look_sets.py | 6 ++--- .../publish/validate_look_shading_group.py | 4 ++-- .../publish/validate_look_single_shader.py | 4 ++-- .../plugins/publish/validate_maya_units.py | 2 +- .../validate_mesh_arnold_attributes.py | 6 ++--- .../plugins/publish/validate_mesh_empty.py | 4 ++-- .../plugins/publish/validate_mesh_has_uv.py | 6 ++--- .../publish/validate_mesh_lamina_faces.py | 4 ++-- .../plugins/publish/validate_mesh_ngons.py | 6 ++--- .../validate_mesh_no_negative_scale.py | 4 ++-- .../publish/validate_mesh_non_manifold.py | 4 ++-- .../publish/validate_mesh_non_zero_edge.py | 6 ++--- .../publish/validate_mesh_normals_unlocked.py | 4 ++-- .../publish/validate_mesh_overlapping_uvs.py | 4 ++-- .../validate_mesh_shader_connections.py | 4 ++-- .../publish/validate_mesh_single_uv_set.py | 6 ++--- .../publish/validate_mesh_uv_set_map1.py | 10 ++++----- .../validate_mesh_vertices_have_edges.py | 6 ++--- .../plugins/publish/validate_model_content.py | 18 +++++++-------- .../publish/validate_mvlook_contents.py | 4 ++-- .../plugins/publish/validate_no_animation.py | 4 ++-- .../publish/validate_no_default_camera.py | 4 ++-- .../plugins/publish/validate_no_namespace.py | 4 ++-- .../publish/validate_no_null_transforms.py | 4 ++-- .../publish/validate_no_unknown_nodes.py | 4 ++-- .../plugins/publish/validate_no_vraymesh.py | 0 .../plugins/publish/validate_node_ids.py | 8 +++---- .../validate_node_ids_deformed_shapes.py | 6 ++--- .../publish/validate_node_ids_in_database.py | 8 +++---- .../publish/validate_node_ids_related.py | 22 +++++++++---------- .../publish/validate_node_ids_unique.py | 8 +++---- .../publish/validate_node_no_ghosting.py | 4 ++-- .../validate_plugin_path_attributes.py | 4 ++-- .../publish/validate_render_image_rule.py | 0 .../validate_render_no_default_cameras.py | 4 ++-- .../publish/validate_render_single_camera.py | 10 ++++----- .../publish/validate_renderlayer_aovs.py | 4 ++-- .../publish/validate_rendersettings.py | 4 ++-- .../plugins/publish/validate_resolution.py | 4 ++-- .../plugins/publish/validate_resources.py | 0 .../plugins/publish/validate_review.py | 0 .../plugins/publish/validate_rig_contents.py | 4 ++-- .../publish/validate_rig_controllers.py | 6 ++--- ...idate_rig_controllers_arnold_attributes.py | 6 ++--- .../publish/validate_rig_joints_hidden.py | 6 ++--- .../publish/validate_rig_out_set_node_ids.py | 6 ++--- .../publish/validate_rig_output_ids.py | 6 ++--- .../publish/validate_scene_set_workspace.py | 0 .../plugins/publish/validate_setdress_root.py | 0 .../plugins/publish/validate_shader_name.py | 4 ++-- .../publish/validate_shape_default_names.py | 4 ++-- .../publish/validate_shape_render_stats.py | 4 ++-- .../plugins/publish/validate_shape_zero.py | 6 ++--- .../publish/validate_single_assembly.py | 0 .../validate_skeletalmesh_hierarchy.py | 0 .../validate_skeletalmesh_triangulated.py | 2 +- .../validate_skeleton_top_group_hierarchy.py | 0 .../validate_skinCluster_deformer_set.py | 4 ++-- .../plugins/publish/validate_step_size.py | 4 ++-- .../validate_transform_naming_suffix.py | 4 ++-- .../publish/validate_transform_zero.py | 6 ++--- .../plugins/publish/validate_unique_names.py | 4 ++-- .../validate_unreal_mesh_triangulated.py | 4 ++-- .../validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_unreal_up_axis.py | 0 .../plugins/publish/validate_visible_only.py | 6 ++--- .../plugins/publish/validate_vray.py | 0 .../validate_vray_distributed_rendering.py | 2 +- .../publish/validate_vray_referenced_aovs.py | 0 .../validate_vray_translator_settings.py | 0 .../plugins/publish/validate_vrayproxy.py | 0 .../publish/validate_vrayproxy_members.py | 4 ++-- .../plugins/publish/validate_xgen.py | 0 .../validate_yeti_renderscript_callbacks.py | 0 .../publish/validate_yeti_rig_cache_state.py | 4 ++-- .../validate_yeti_rig_input_in_instance.py | 4 ++-- .../publish/validate_yeti_rig_settings.py | 0 .../workfile_build/load_placeholder.py | 4 ++-- .../workfile_build/script_placeholder.py | 2 +- .../client/ayon_maya}/startup/userSetup.py | 2 +- .../maya/client/ayon_maya}/tools/__init__.py | 0 .../ayon_maya}/tools/mayalookassigner/LICENSE | 0 .../tools/mayalookassigner/__init__.py | 0 .../tools/mayalookassigner/alembic.py | 0 .../ayon_maya}/tools/mayalookassigner/app.py | 2 +- .../tools/mayalookassigner/arnold_standin.py | 2 +- .../tools/mayalookassigner/commands.py | 2 +- .../ayon_maya}/tools/mayalookassigner/lib.py | 2 +- .../tools/mayalookassigner/models.py | 0 .../ayon_maya}/tools/mayalookassigner/usd.py | 0 .../tools/mayalookassigner/views.py | 0 .../tools/mayalookassigner/vray_proxies.py | 2 +- .../tools/mayalookassigner/widgets.py | 0 .../ayon_maya}/vendor/python/capture.py | 0 server_addon/maya/package.py | 6 ++++- 300 files changed, 416 insertions(+), 404 deletions(-) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/addon.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/action.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/alembic.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/commands.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/customize.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/exitstack.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/fbx.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/gltf.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_renderproducts.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_rendersettings.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_rendersetup.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/menu.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/pipeline.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/plugin.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/render_setup_tools.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/setdress.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/workfile_template_builder.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/workio.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/yeti.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_auto_load_plugins.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_copy_mel.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_open_workfile_post_initialization.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/lib.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/convert_legacy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_animation_pointcache.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_arnold_scene_source.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_assembly.py (83%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_camera.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_layout.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_look.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_matchmove.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_maya_usd.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_mayascene.py (84%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_model.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multishot_layout.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_look.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd_comp.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd_over.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_proxy_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_redshift_proxy.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_render.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_rendersetup.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_review.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_rig.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_setdress.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_skeletalmesh.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_staticmesh.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_yeticache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_vrayscene.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_workfile.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_xgen.py (79%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_yeti_cache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_yeti_rig.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_geometry.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_xgen.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_yeti_rig.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/import_modelrender.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/import_reference.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/rig_recreate_animation_instance.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/select_containers.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/_load_animation.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/actions.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_arnold_standin.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_as_template.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_assembly.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_audio.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_gpucache.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_image.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_image_plane.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_look.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_matchmove.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_maya_usd.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_multiverse_usd.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_multiverse_usd_over.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_redshift_proxy.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_reference.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_rendersetup.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_arnold.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_redshift.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_vray.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vrayscene.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_xgen.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_yeti_cache.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_yeti_rig.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_animation.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_arnold_scene_source.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_assembly.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_fbx_animation.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_fbx_camera.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_file_dependencies.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_gltf.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_history.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_inputs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_instances.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_scene_time.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_units.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_workspace.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_model.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_multiverse_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_pointcache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_remove_marked.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_render.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_render_layer_aovs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_renderable_camera.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_review.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_rig_sets.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_skeleton_mesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_unreal_skeletalmesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_unreal_staticmesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_user_defined_attributes.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_vrayproxy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_vrayscene.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_workscene_fps.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_xgen.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_yeti_cache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_yeti_rig.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/determine_future_version.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_active_view_thumbnail.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_arnold_scene_source.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_assembly.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_camera_alembic.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_camera_mayaScene.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_fbx.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_fbx_animation.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_gltf.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_gpu_cache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_import_reference.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_layout.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_maya_scene_raw.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_maya_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_model.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_look.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd_comp.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd_over.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_obj.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_playblast.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_pointcache.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_proxy_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_redshift_proxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_rendersetup.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_rig.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_skeleton_mesh.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_thumbnail.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_skeletalmesh_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_skeletalmesh_fbx.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_staticmesh.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_yeticache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_vrayscene.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_workfile_xgen.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_xgen.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_yeti_cache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_yeti_rig.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/submit_maya_remote_publish_deadline.xml (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_animation_out_set_related_node_ids.xml (90%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_maya_units.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_mesh_non_manifold.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_node_ids.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_rig_out_set_node_ids.xml (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_skeletalmesh_hierarchy.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/increment_current_file_deadline.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/reset_xgen_attributes.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/save_scene.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_alembic_options_defaults.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_animation_content.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_animation_out_set_related_node_ids.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_arnold_scene_source.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_arnold_scene_source_cbid.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_ass_relative_paths.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_name.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_namespaces.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_transforms.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_attributes.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_camera_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_camera_contents.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_color_sets.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_current_renderlayer_renderable.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_cycle_error.py (86%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_frame_range.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_glsl_material.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_glsl_plugin.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_has_members.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_in_context.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_subset.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_loaded_plugin.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_contents.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_default_shaders_connections.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_id_reference_edits.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_no_default_shaders.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_sets.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_shading_group.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_single_shader.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_maya_units.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_arnold_attributes.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_empty.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_has_uv.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_lamina_faces.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_ngons.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_no_negative_scale.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_non_manifold.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_non_zero_edge.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_normals_unlocked.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_overlapping_uvs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_shader_connections.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_single_uv_set.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_uv_set_map1.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_vertices_have_edges.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_model_content.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mvlook_contents.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_animation.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_default_camera.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_namespace.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_null_transforms.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_unknown_nodes.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_vraymesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids.py (89%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_deformed_shapes.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_in_database.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_related.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_unique.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_no_ghosting.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_plugin_path_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_image_rule.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_no_default_cameras.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_single_camera.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_renderlayer_aovs.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rendersettings.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_resolution.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_resources.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_review.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_contents.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_controllers.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_controllers_arnold_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_joints_hidden.py (90%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_out_set_node_ids.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_output_ids.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_scene_set_workspace.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_setdress_root.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shader_name.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_default_names.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_render_stats.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_zero.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_single_assembly.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeletalmesh_hierarchy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeletalmesh_triangulated.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeleton_top_group_hierarchy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skinCluster_deformer_set.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_step_size.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_transform_naming_suffix.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_transform_zero.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unique_names.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_mesh_triangulated.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_staticmesh_naming.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_up_axis.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_visible_only.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_distributed_rendering.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_referenced_aovs.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_translator_settings.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vrayproxy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vrayproxy_members.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_xgen.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_renderscript_callbacks.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_cache_state.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_input_in_instance.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_settings.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/workfile_build/load_placeholder.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/workfile_build/script_placeholder.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/startup/userSetup.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/LICENSE (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/alembic.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/app.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/arnold_standin.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/commands.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/lib.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/models.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/usd.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/views.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/vray_proxies.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/widgets.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/vendor/python/capture.py (100%) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d49358b0d2..2c6082256a 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -53,8 +53,10 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), + "maya": VersionInfo(0, 2, 0), } + # Inherit from `object` for Python 2 hosts class _ModuleClass(object): """Fake module class for storing AYON addons. @@ -1323,7 +1325,7 @@ class TrayAddonsManager(AddonsManager): self.doubleclick_callback = None def add_doubleclick_callback(self, addon, callback): - """Register doubleclick callbacks on tray icon. + """Register double-click callbacks on tray icon. Currently, there is no way how to determine which is launched. Name of callback can be defined with `doubleclick_callback` attribute. diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py index f1bc1cb2be..b1193fb914 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -39,8 +39,8 @@ from ayon_core.lib import ( EnumDef, is_in_tests, ) -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings -from ayon_core.hosts.maya.api.lib import get_attr_in_layer +from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.lib import get_attr_in_layer from openpype_modules.deadline import abstract_submit_deadline from openpype_modules.deadline.abstract_submit_deadline import DeadlineJobInfo diff --git a/pyproject.toml b/pyproject.toml index 4726bef41a..63d7434c06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,10 @@ line-ending = "auto" # Ignore words that are not in the dictionary. ignore-words-list = "ayon,ynput,parms,parm,hda,developpement,ue" +# Ignore lines that contain this regex. This is hack for missing inline ignore. +# Remove with next codespell release (>2.2.6) +ignore-regex = ".*codespell:ignore.*" + skip = "./.*,./package/*,*/vendor/*,*/unreal/integration/*,*/aftereffects/api/extension/js/libs/*" count = true quiet-level = 3 diff --git a/client/ayon_core/hosts/maya/__init__.py b/server_addon/maya/client/ayon_maya/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/__init__.py rename to server_addon/maya/client/ayon_maya/__init__.py diff --git a/client/ayon_core/hosts/maya/addon.py b/server_addon/maya/client/ayon_maya/addon.py similarity index 100% rename from client/ayon_core/hosts/maya/addon.py rename to server_addon/maya/client/ayon_maya/addon.py diff --git a/client/ayon_core/hosts/maya/api/__init__.py b/server_addon/maya/client/ayon_maya/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/api/__init__.py rename to server_addon/maya/client/ayon_maya/api/__init__.py diff --git a/client/ayon_core/hosts/maya/api/action.py b/server_addon/maya/client/ayon_maya/api/action.py similarity index 100% rename from client/ayon_core/hosts/maya/api/action.py rename to server_addon/maya/client/ayon_maya/api/action.py diff --git a/client/ayon_core/hosts/maya/api/alembic.py b/server_addon/maya/client/ayon_maya/api/alembic.py similarity index 99% rename from client/ayon_core/hosts/maya/api/alembic.py rename to server_addon/maya/client/ayon_maya/api/alembic.py index 6bd00e1cb1..007e3ce4f3 100644 --- a/client/ayon_core/hosts/maya/api/alembic.py +++ b/server_addon/maya/client/ayon_maya/api/alembic.py @@ -4,7 +4,7 @@ import os from maya import cmds # noqa -from ayon_core.hosts.maya.api.lib import evaluation +from ayon_maya.api.lib import evaluation log = logging.getLogger(__name__) diff --git a/client/ayon_core/hosts/maya/api/commands.py b/server_addon/maya/client/ayon_maya/api/commands.py similarity index 100% rename from client/ayon_core/hosts/maya/api/commands.py rename to server_addon/maya/client/ayon_maya/api/commands.py diff --git a/client/ayon_core/hosts/maya/api/customize.py b/server_addon/maya/client/ayon_maya/api/customize.py similarity index 100% rename from client/ayon_core/hosts/maya/api/customize.py rename to server_addon/maya/client/ayon_maya/api/customize.py diff --git a/client/ayon_core/hosts/maya/api/exitstack.py b/server_addon/maya/client/ayon_maya/api/exitstack.py similarity index 98% rename from client/ayon_core/hosts/maya/api/exitstack.py rename to server_addon/maya/client/ayon_maya/api/exitstack.py index 5eb7e15784..c35724e889 100644 --- a/client/ayon_core/hosts/maya/api/exitstack.py +++ b/server_addon/maya/client/ayon_maya/api/exitstack.py @@ -6,7 +6,7 @@ compatible implementation to support bothPython 2 and Python 3. Instead of using ExitStack from contextlib, use it from this module: ->>> from ayon_core.hosts.maya.api.exitstack import ExitStack +>>> from ayon_maya.api.exitstack import ExitStack It will provide the appropriate ExitStack implementation for the current running Python version. diff --git a/client/ayon_core/hosts/maya/api/fbx.py b/server_addon/maya/client/ayon_maya/api/fbx.py similarity index 99% rename from client/ayon_core/hosts/maya/api/fbx.py rename to server_addon/maya/client/ayon_maya/api/fbx.py index fd1bf2c901..28a4058551 100644 --- a/client/ayon_core/hosts/maya/api/fbx.py +++ b/server_addon/maya/client/ayon_maya/api/fbx.py @@ -4,7 +4,7 @@ import logging from maya import cmds # noqa import maya.mel as mel # noqa -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class FBXExtractor: diff --git a/client/ayon_core/hosts/maya/api/gltf.py b/server_addon/maya/client/ayon_maya/api/gltf.py similarity index 97% rename from client/ayon_core/hosts/maya/api/gltf.py rename to server_addon/maya/client/ayon_maya/api/gltf.py index 2a983f1573..9aa4bf37ef 100644 --- a/client/ayon_core/hosts/maya/api/gltf.py +++ b/server_addon/maya/client/ayon_maya/api/gltf.py @@ -16,7 +16,7 @@ _gltf_options = { "hbu": bool, # hashBufferURI "ext": bool, # externalTextures "ivt": int, # initialValuesTime - "acn": str, # animationClipName + "acn": str, # animationClipName # codespell:ignore acn "ast": int, # animationClipStartTime "aet": int, # animationClipEndTime "afr": float, # animationClipFrameRate diff --git a/client/ayon_core/hosts/maya/api/lib.py b/server_addon/maya/client/ayon_maya/api/lib.py similarity index 100% rename from client/ayon_core/hosts/maya/api/lib.py rename to server_addon/maya/client/ayon_maya/api/lib.py diff --git a/client/ayon_core/hosts/maya/api/lib_renderproducts.py b/server_addon/maya/client/ayon_maya/api/lib_renderproducts.py similarity index 100% rename from client/ayon_core/hosts/maya/api/lib_renderproducts.py rename to server_addon/maya/client/ayon_maya/api/lib_renderproducts.py diff --git a/client/ayon_core/hosts/maya/api/lib_rendersettings.py b/server_addon/maya/client/ayon_maya/api/lib_rendersettings.py similarity index 99% rename from client/ayon_core/hosts/maya/api/lib_rendersettings.py rename to server_addon/maya/client/ayon_maya/api/lib_rendersettings.py index f9e243146a..f7f3f1d746 100644 --- a/client/ayon_core/hosts/maya/api/lib_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/api/lib_rendersettings.py @@ -8,7 +8,7 @@ from ayon_core.settings import get_project_settings from ayon_core.pipeline import CreatorError, get_current_project_name from ayon_core.pipeline.context_tools import get_current_folder_entity -from ayon_core.hosts.maya.api.lib import reset_frame_range +from ayon_maya.api.lib import reset_frame_range class RenderSettings(object): diff --git a/client/ayon_core/hosts/maya/api/lib_rendersetup.py b/server_addon/maya/client/ayon_maya/api/lib_rendersetup.py similarity index 99% rename from client/ayon_core/hosts/maya/api/lib_rendersetup.py rename to server_addon/maya/client/ayon_maya/api/lib_rendersetup.py index 6dca8eb6dd..d93e6af0e2 100644 --- a/client/ayon_core/hosts/maya/api/lib_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/api/lib_rendersetup.py @@ -19,7 +19,7 @@ from maya.app.renderSetup.model.override import ( UniqueOverride ) -from ayon_core.hosts.maya.api.lib import get_attribute +from ayon_maya.api.lib import get_attribute EXACT_MATCH = 0 PARENT_MATCH = 1 diff --git a/client/ayon_core/hosts/maya/api/menu.py b/server_addon/maya/client/ayon_maya/api/menu.py similarity index 99% rename from client/ayon_core/hosts/maya/api/menu.py rename to server_addon/maya/client/ayon_maya/api/menu.py index e3ef50cdc0..153aff07c3 100644 --- a/client/ayon_core/hosts/maya/api/menu.py +++ b/server_addon/maya/client/ayon_maya/api/menu.py @@ -15,7 +15,7 @@ from ayon_core.pipeline import ( ) from ayon_core.pipeline.workfile import BuildWorkfile from ayon_core.tools.utils import host_tools -from ayon_core.hosts.maya.api import lib, lib_rendersettings +from ayon_maya.api import lib, lib_rendersettings from .lib import get_main_window, IS_HEADLESS from ..tools import show_look_assigner diff --git a/client/ayon_core/hosts/maya/api/pipeline.py b/server_addon/maya/client/ayon_maya/api/pipeline.py similarity index 99% rename from client/ayon_core/hosts/maya/api/pipeline.py rename to server_addon/maya/client/ayon_maya/api/pipeline.py index 74d73e5f95..84268cc6f1 100644 --- a/client/ayon_core/hosts/maya/api/pipeline.py +++ b/server_addon/maya/client/ayon_maya/api/pipeline.py @@ -45,8 +45,8 @@ from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_locked, is_workfile_lock_enabled ) -from ayon_core.hosts.maya import MAYA_ROOT_DIR -from ayon_core.hosts.maya.lib import create_workspace_mel +from ayon_maya import MAYA_ROOT_DIR +from ayon_maya.lib import create_workspace_mel from . import menu, lib from .workio import ( @@ -58,7 +58,7 @@ from .workio import ( current_file ) -log = logging.getLogger("ayon_core.hosts.maya") +log = logging.getLogger("ayon_maya") PLUGINS_DIR = os.path.join(MAYA_ROOT_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/client/ayon_core/hosts/maya/api/plugin.py b/server_addon/maya/client/ayon_maya/api/plugin.py similarity index 99% rename from client/ayon_core/hosts/maya/api/plugin.py rename to server_addon/maya/client/ayon_maya/api/plugin.py index 6f8b74c906..0eb998cb36 100644 --- a/client/ayon_core/hosts/maya/api/plugin.py +++ b/server_addon/maya/client/ayon_maya/api/plugin.py @@ -809,7 +809,7 @@ class ReferenceLoader(Loader): def update(self, container, context): from maya import cmds - from ayon_core.hosts.maya.api.lib import get_container_members + from ayon_maya.api.lib import get_container_members node = container["objectName"] diff --git a/client/ayon_core/hosts/maya/api/render_setup_tools.py b/server_addon/maya/client/ayon_maya/api/render_setup_tools.py similarity index 100% rename from client/ayon_core/hosts/maya/api/render_setup_tools.py rename to server_addon/maya/client/ayon_maya/api/render_setup_tools.py diff --git a/client/ayon_core/hosts/maya/api/setdress.py b/server_addon/maya/client/ayon_maya/api/setdress.py similarity index 99% rename from client/ayon_core/hosts/maya/api/setdress.py rename to server_addon/maya/client/ayon_maya/api/setdress.py index b1d5beb343..a130b93f4f 100644 --- a/client/ayon_core/hosts/maya/api/setdress.py +++ b/server_addon/maya/client/ayon_maya/api/setdress.py @@ -20,7 +20,7 @@ from ayon_core.pipeline import ( get_representation_path, get_current_project_name, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( matrix_equals, unique_namespace, get_container_transforms, diff --git a/client/ayon_core/hosts/maya/api/workfile_template_builder.py b/server_addon/maya/client/ayon_maya/api/workfile_template_builder.py similarity index 100% rename from client/ayon_core/hosts/maya/api/workfile_template_builder.py rename to server_addon/maya/client/ayon_maya/api/workfile_template_builder.py diff --git a/client/ayon_core/hosts/maya/api/workio.py b/server_addon/maya/client/ayon_maya/api/workio.py similarity index 100% rename from client/ayon_core/hosts/maya/api/workio.py rename to server_addon/maya/client/ayon_maya/api/workio.py diff --git a/client/ayon_core/hosts/maya/api/yeti.py b/server_addon/maya/client/ayon_maya/api/yeti.py similarity index 100% rename from client/ayon_core/hosts/maya/api/yeti.py rename to server_addon/maya/client/ayon_maya/api/yeti.py diff --git a/client/ayon_core/hosts/maya/hooks/pre_auto_load_plugins.py b/server_addon/maya/client/ayon_maya/hooks/pre_auto_load_plugins.py similarity index 100% rename from client/ayon_core/hosts/maya/hooks/pre_auto_load_plugins.py rename to server_addon/maya/client/ayon_maya/hooks/pre_auto_load_plugins.py diff --git a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py b/server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py similarity index 92% rename from client/ayon_core/hosts/maya/hooks/pre_copy_mel.py rename to server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py index 683b4c59c7..c3268b09ee 100644 --- a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py +++ b/server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py @@ -1,5 +1,5 @@ from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.maya.lib import create_workspace_mel +from ayon_maya.lib import create_workspace_mel class PreCopyMel(PreLaunchHook): diff --git a/client/ayon_core/hosts/maya/hooks/pre_open_workfile_post_initialization.py b/server_addon/maya/client/ayon_maya/hooks/pre_open_workfile_post_initialization.py similarity index 100% rename from client/ayon_core/hosts/maya/hooks/pre_open_workfile_post_initialization.py rename to server_addon/maya/client/ayon_maya/hooks/pre_open_workfile_post_initialization.py diff --git a/client/ayon_core/hosts/maya/lib.py b/server_addon/maya/client/ayon_maya/lib.py similarity index 100% rename from client/ayon_core/hosts/maya/lib.py rename to server_addon/maya/client/ayon_maya/lib.py diff --git a/client/ayon_core/hosts/maya/plugins/__init__.py b/server_addon/maya/client/ayon_maya/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/__init__.py rename to server_addon/maya/client/ayon_maya/plugins/__init__.py diff --git a/client/ayon_core/hosts/maya/plugins/create/convert_legacy.py b/server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/convert_legacy.py rename to server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py index 81cf9613b4..8616413bdd 100644 --- a/client/ayon_core/hosts/maya/plugins/create/convert_legacy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py @@ -1,8 +1,8 @@ import ayon_api from ayon_core.pipeline.create.creator_plugins import ProductConvertorPlugin -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api.lib import read +from ayon_maya.api import plugin +from ayon_maya.api.lib import read from maya import cmds from maya.app.renderSetup.model import renderSetup @@ -12,7 +12,7 @@ class MayaLegacyConvertor(ProductConvertorPlugin, plugin.MayaCreatorBase): """Find and convert any legacy products in the scene. - This Convertor will find all legacy products in the scene and will + This Converter will find all legacy products in the scene and will transform them to the current system. Since the old products doesn't retain any information about their original creators, the only mapping we can do is based on their families. diff --git a/client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py index 069762e4ae..ea4cdb57fe 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import lib, plugin +from ayon_maya.api import lib, plugin from ayon_core.lib import ( BoolDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py index e321c13ca0..8ae2759628 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_assembly.py b/server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py similarity index 83% rename from client/ayon_core/hosts/maya/plugins/create/create_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py index 92df125748..dff04f059e 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateAssembly(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_camera.py b/server_addon/maya/client/ayon_maya/plugins/create/create_camera.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_camera.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_camera.py index 4b1265bd3b..393176f5dd 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_camera.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_layout.py b/server_addon/maya/client/ayon_maya/plugins/create/create_layout.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/create/create_layout.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_layout.py index 6cbc697502..1d9bc2c1c8 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_layout.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_look.py b/server_addon/maya/client/ayon_maya/plugins/create/create_look.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_look.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_look.py index ac3625c38f..1f90d18607 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_look.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( plugin, lib ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/create/create_matchmove.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py index 44443a8b9f..9cb2a3dd47 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py index 3f34a541b4..19b55384f3 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, EnumDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_mayascene.py b/server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py similarity index 84% rename from client/ayon_core/hosts/maya/plugins/create/create_mayascene.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py index cfe46336a2..9913efc016 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_mayascene.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateMayaScene(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_model.py b/server_addon/maya/client/ayon_maya/plugins/create/create_model.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_model.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_model.py index b47df421f3..87696c58d2 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_model.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import ( BoolDef, TextDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py index 7216236719..5229823110 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py @@ -8,7 +8,7 @@ from ayon_api import ( ) from maya import cmds # noqa: F401 -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef, EnumDef, TextDef from ayon_core.pipeline import ( Creator, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py index de604a33b3..f2dcb77187 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import ( BoolDef, EnumDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py index 668700995f..bdcea4cd2c 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py index 120e6ad920..2459704d14 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py index 26208794e3..b070daf550 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py index ecc031436c..431f113941 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py index d99fe5a787..c4cc874a2a 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Creator of Redshift proxy product types.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_render.py b/server_addon/maya/client/ayon_maya/plugins/create/create_render.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_render.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_render.py index e5a8d4dbd8..5defee7d07 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_render.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create ``Render`` instance in Maya.""" -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib_rendersettings, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py index 3d8d6a7309..415ab4ff8c 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.pipeline import CreatorError diff --git a/client/ayon_core/hosts/maya/plugins/create/create_review.py b/server_addon/maya/client/ayon_maya/plugins/create/create_review.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_review.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_review.py index 8a2f2df745..26fad91ed9 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_review.py @@ -3,7 +3,7 @@ import json from maya import cmds import ayon_api -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_rig.py b/server_addon/maya/client/ayon_maya/plugins/create/create_rig.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_rig.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_rig.py index 54be50c169..135e51bcbf 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateRig(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_setdress.py b/server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/create/create_setdress.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py index 0f72d4d184..12532e0724 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_setdress.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py index a32e94971e..a182fe7a24 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator for Unreal Skeletal Meshes.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, TextDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py index 76c33f00cc..e5436bca64 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator for Unreal Static Meshes.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from maya import cmds # noqa diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py index dea64b40fb..eea866d406 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py index d565ec37e0..742e14ace0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( plugin, lib ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py index cf5e7b5364..11c356fdef 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create instance of vrayscene.""" -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib_rendersettings, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_workfile.py b/server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_workfile.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py index f636ed7b74..e0c94611b0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py @@ -3,7 +3,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/create/create_xgen.py b/server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py similarity index 79% rename from client/ayon_core/hosts/maya/plugins/create/create_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py index fec2f07456..d13d032a13 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateXgen(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py index bf20acaca8..8a834f18c0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py index dfe224ceb1..c5378dc1b8 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py index 5410546a2e..ccb88313e9 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction, get_repres_contexts -from ayon_core.hosts.maya.api.lib import get_id +from ayon_maya.api.lib import get_id class ConnectGeometry(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_xgen.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_xgen.py diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py index 8f13cc6ae5..2385444403 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py @@ -9,7 +9,7 @@ from ayon_core.pipeline import ( get_repres_contexts, get_representation_path, ) -from ayon_core.hosts.maya.api.lib import get_container_members, get_id +from ayon_maya.api.lib import get_container_members, get_id class ConnectYetiRig(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py b/server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py index 4655017ae5..5e36ec6bc1 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( InventoryAction, get_current_project_name, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, apply_shaders ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/import_reference.py b/server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/inventory/import_reference.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py index 771cb96a57..5e42facad4 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction -from ayon_core.hosts.maya.api.lib import get_reference_node +from ayon_maya.api.lib import get_reference_node class ImportReference(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py b/server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py index cbff293cd7..796a651f8a 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( get_current_project_name, ) from ayon_core.pipeline.load import get_representation_contexts_by_ids -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( create_rig_animation_instance, get_container_members, ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/select_containers.py b/server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/inventory/select_containers.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py index f0bb2fc376..e45c8a5706 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/select_containers.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction, registered_host -from ayon_core.hosts.maya.api.lib import get_container_members +from ayon_maya.api.lib import get_container_members class SelectInScene(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/load/_load_animation.py b/server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/load/_load_animation.py rename to server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py index 393f6b0115..6d4ebe250c 100644 --- a/client/ayon_core/hosts/maya/plugins/load/_load_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py @@ -1,4 +1,4 @@ -import ayon_core.hosts.maya.api.plugin +import ayon_maya.api.plugin import maya.cmds as cmds @@ -14,7 +14,7 @@ def _process_reference(file_url, name, namespace, options): Returns: list: list of object nodes """ - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.lib import unique_namespace # Get name from asset being loaded # Assuming name is product name from the animation, we split the number # suffix from the name to ensure the namespace is unique @@ -43,7 +43,7 @@ def _process_reference(file_url, name, namespace, options): return nodes -class AbcLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class AbcLoader(ayon_maya.api.plugin.ReferenceLoader): """Loader to reference an Alembic file""" product_types = { @@ -74,7 +74,7 @@ class AbcLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): return nodes -class FbxLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class FbxLoader(ayon_maya.api.plugin.ReferenceLoader): """Loader to reference an Fbx files""" product_types = { diff --git a/client/ayon_core/hosts/maya/plugins/load/actions.py b/server_addon/maya/client/ayon_maya/plugins/load/actions.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/actions.py rename to server_addon/maya/client/ayon_maya/plugins/load/actions.py index 8bef219812..d28645ea43 100644 --- a/client/ayon_core/hosts/maya/plugins/load/actions.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/actions.py @@ -3,11 +3,11 @@ """ import qargparse from ayon_core.pipeline import load -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, get_custom_namespace ) -import ayon_core.hosts.maya.api.plugin +import ayon_maya.api.plugin class SetFrameRangeLoader(load.LoaderPlugin): @@ -85,7 +85,7 @@ class SetFrameRangeWithHandlesLoader(load.LoaderPlugin): animationEndTime=end) -class ImportMayaLoader(ayon_core.hosts.maya.api.plugin.Loader): +class ImportMayaLoader(ayon_maya.api.plugin.Loader): """Import action for Maya (unmanaged) Warning: diff --git a/client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index ae3b68965a..db81199ed6 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -8,14 +8,14 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( unique_namespace, get_attribute_input, maintained_selection, get_fps_for_current_context ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type def is_sequence(files): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/load/load_as_template.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index f696d369e3..2a29faa77d 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, registered_host ) -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaTemplateBuilder ) diff --git a/client/ayon_core/hosts/maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/load/load_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index 0fcbc6bd07..b37bf14101 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -5,9 +5,9 @@ from ayon_core.pipeline import ( remove_container ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace -from ayon_core.hosts.maya.api import setdress +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api import setdress class AssemblyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_audio.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 228189f1a1..81e49c616e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -4,8 +4,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace, get_container_members +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace, get_container_members class AudioLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/load/load_gpucache.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index 9832d2d657..fb6db94cee 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -1,13 +1,13 @@ import maya.cmds as cmds -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace from ayon_core.pipeline import ( load, get_representation_path ) from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type class GpuCacheLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/load/load_image.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 171920f747..28b44ac99c 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -13,8 +13,8 @@ from ayon_core.pipeline.colorspace import ( ) from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import ( unique_namespace, namespaced ) diff --git a/client/ayon_core/hosts/maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_image_plane.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 15c7654c52..2740f106d6 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -4,8 +4,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import ( unique_namespace, namespaced, pairwise, diff --git a/client/ayon_core/hosts/maya/plugins/load/load_look.py b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_look.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_look.py index af0e000dd2..f61d0e9c35 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py @@ -7,14 +7,14 @@ from qtpy import QtWidgets from ayon_api import get_representation_by_name from ayon_core.pipeline import get_representation_path -import ayon_core.hosts.maya.api.plugin -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib import get_reference_node +import ayon_maya.api.plugin +from ayon_maya.api import lib +from ayon_maya.api.lib import get_reference_node from ayon_core.tools.utils import ScrollMessageBox -class LookLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class LookLoader(ayon_maya.api.plugin.ReferenceLoader): """Specific loader for lookdev""" product_types = {"look"} diff --git a/client/ayon_core/hosts/maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/load/load_matchmove.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py diff --git a/client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index 628a25e574..6c2945f4a8 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -6,11 +6,11 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.load import get_representation_path_from_context -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MayaUsdLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index f32c76481d..93bb95092e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -9,12 +9,12 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MultiverseUsdLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index b23fa48f07..e51353887e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -10,10 +10,10 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MultiverseUsdOverLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index 7760d4081c..fba6314fec 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -10,13 +10,13 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( namespaced, maintained_selection, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class RedshiftProxyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_reference.py b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/load/load_reference.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_reference.py index 847591bd11..4aad3ddb22 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py @@ -5,8 +5,8 @@ from maya import cmds import qargparse from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api import plugin +from ayon_maya.api.lib import ( maintained_selection, get_container_members, parent_nodes, diff --git a/client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index d5685b2c4c..96f38ba1ce 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -16,8 +16,8 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api import lib +from ayon_maya.api.pipeline import containerise from maya import cmds import maya.app.renderSetup.model.renderSetup as renderSetup diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index 5b0c78fd6f..d326c224bf 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type # TODO aiVolume doesn't automatically set velocity fps correctly, set manual? @@ -22,8 +22,8 @@ class LoadVDBtoArnold(load.LoaderPlugin): def load(self, context, name, namespace, data): from maya import cmds - from ayon_core.hosts.maya.api.pipeline import containerise - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace product_type = context["product"]["productType"] diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index e345a7bf6f..5ac8dfa05e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type class LoadVDBtoRedShift(load.LoaderPlugin): @@ -28,8 +28,8 @@ class LoadVDBtoRedShift(load.LoaderPlugin): def load(self, context, name=None, namespace=None, data=None): from maya import cmds - from ayon_core.hosts.maya.api.pipeline import containerise - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace product_type = context["product"]["productType"] diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index d6d1c948b0..7a3129dfe7 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type from maya import cmds @@ -86,8 +86,8 @@ class LoadVDBtoVRay(load.LoaderPlugin): def load(self, context, name, namespace, data): - from ayon_core.hosts.maya.api.lib import unique_namespace - from ayon_core.hosts.maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise path = self.filepath_from_context(context) assert os.path.exists(path), ( @@ -159,7 +159,7 @@ class LoadVDBtoVRay(load.LoaderPlugin): def _set_path(self, grid_node, path, show_preset_popup=True): - from ayon_core.hosts.maya.api.lib import attribute_values + from ayon_maya.api.lib import attribute_values from maya import cmds def _get_filename_from_folder(path): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 14d645021c..014c8fea48 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -15,13 +15,13 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class VRayProxyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index ea3215da97..17b0c2cd44 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -5,13 +5,13 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class VRaySceneLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index e2664439b0..f1f25640bd 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -6,18 +6,18 @@ import xgenm from qtpy import QtWidgets -import ayon_core.hosts.maya.api.plugin -from ayon_core.hosts.maya.api.lib import ( +import ayon_maya.api.plugin +from ayon_maya.api.lib import ( maintained_selection, get_container_members, attribute_values, write_xgen_file ) -from ayon_core.hosts.maya.api import current_file +from ayon_maya.api import current_file from ayon_core.pipeline import get_representation_path -class XgenLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): """Load Xgen as reference""" product_types = {"xgen"} diff --git a/client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index 4ca9ae9d03..bb7d2792c5 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -11,10 +11,10 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.yeti import create_yeti_variable -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api import lib +from ayon_maya.api.yeti import create_yeti_variable +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type # Do not reset these values on update but only apply on first load diff --git a/client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py index 7444566ee1..41129b0245 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py @@ -2,8 +2,8 @@ from typing import List import maya.cmds as cmds -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import plugin +from ayon_maya.api import lib from ayon_core.pipeline import registered_host from ayon_core.pipeline.create import CreateContext diff --git a/client/ayon_core/hosts/maya/plugins/publish/__init__.py b/server_addon/maya/client/ayon_maya/plugins/publish/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/__init__.py rename to server_addon/maya/client/ayon_maya/plugins/publish/__init__.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index fb71e128eb..cdeadd9036 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_all_children +from ayon_maya.api.lib import get_all_children class CollectArnoldSceneSource(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index eebbbd4447..affb22c530 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -2,8 +2,8 @@ from collections import defaultdict import pyblish.api from maya import cmds, mel -from ayon_core.hosts.maya import api -from ayon_core.hosts.maya.api import lib +from ayon_maya import api +from ayon_maya.api import lib # TODO : Publish of assembly: -unique namespace for all assets, VALIDATOR! diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_current_file.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_fbx_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_fbx_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_file_dependencies.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_gltf.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_history.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index fa5a694a76..28788ac50d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -5,8 +5,8 @@ import maya.api.OpenMaya as om import pyblish.api from ayon_core.pipeline import registered_host -from ayon_core.hosts.maya.api.lib import get_container_members -from ayon_core.hosts.maya.api.lib_rendersetup import get_shader_in_layer +from ayon_maya.api.lib import get_container_members +from ayon_maya.api.lib_rendersetup import get_shader_in_layer def iter_history(nodes, diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/collect_instances.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 774c217cfd..758b977c8d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_all_children +from ayon_maya.api.lib import get_all_children class CollectNewInstances(pyblish.api.InstancePlugin): @@ -105,8 +105,10 @@ class CollectNewInstances(pyblish.api.InstancePlugin): parents = set() for node in nodes: - splitted = node.split("|") - items = ["|".join(splitted[0:i]) for i in range(2, len(splitted))] + split_parts = node.split("|") + items = [ + "|".join(split_parts[:i]) for i in range(2, len(split_parts)) + ] parents.update(items) return parents diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index a3a32bc0cb..f4bc26506b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -6,7 +6,7 @@ import glob from maya import cmds # noqa import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib SHAPE_ATTRS = {"castsShadows", "receiveShadows", diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_scene_time.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_units.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_workspace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_model.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index 83e743c92e..9910936e7d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -4,7 +4,7 @@ import re from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib SHAPE_ATTRS = ["castsShadows", "receiveShadows", diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_remove_marked.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_render.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index 21095935a2..cacde15561 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -42,11 +42,11 @@ import pyblish.api from ayon_core.pipeline import KnownPublishError from ayon_core.lib import get_formatted_current_time -from ayon_core.hosts.maya.api.lib_renderproducts import ( +from ayon_maya.api.lib_renderproducts import ( get as get_layer_render_products, UnsupportedRendererException ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectMayaRender(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index 1c83918155..d23a4edb4d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index 97d857079b..d2d05971e9 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api.lib_rendersetup import get_attr_in_layer +from ayon_maya.api.lib_rendersetup import get_attr_in_layer class CollectRenderableCamera(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_review.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 4e35b3bcc2..490e197ce0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -4,7 +4,7 @@ import ayon_api import pyblish.api from ayon_core.pipeline import KnownPublishError -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectReview(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_rig_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_skeleton_mesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_unreal_skeletalmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_user_defined_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index 9548cd9387..ea7064292b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -4,7 +4,7 @@ import pyblish.api from ayon_core.lib import get_formatted_current_time -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectVrayScene(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_workfile.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_workscene_fps.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index f8f506376d..d09f60c827 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -3,7 +3,7 @@ import os from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_attribute_input +from ayon_maya.api.lib import get_attribute_input class CollectXgen(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index e1755e4212..fa9670820f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.yeti import get_yeti_user_variables +from ayon_maya.api import lib +from ayon_maya.api.yeti import get_yeti_user_variables SETTINGS = { diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 8964e17f14..95e6afdb01 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import KnownPublishError diff --git a/client/ayon_core/hosts/maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/determine_future_version.py rename to server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index b5054b4846..777bc2000a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -4,7 +4,7 @@ import maya.api.OpenMayaUI as omui import pyblish.api import tempfile -from ayon_core.hosts.maya.api.lib import IS_HEADLESS +from ayon_maya.api.lib import IS_HEADLESS class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index fb4c41f1de..2829420ae1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -6,7 +6,7 @@ from maya import cmds import arnold from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractArnoldSceneSource(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index 5f51dc38cb..df390c0798 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -2,7 +2,7 @@ import os import json from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic +from ayon_maya.api.alembic import extract_alembic from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index 74abc8de75..e36f964abd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -4,7 +4,7 @@ import json from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractCameraAlembic(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index cb3951ec0c..62ce0a1806 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -7,7 +7,7 @@ import contextlib from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.lib import ( BoolDef ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index bb2a6dad07..d6a1de8455 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -6,8 +6,8 @@ import maya.mel as mel # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api import fbx class ExtractFBX(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 77b5b79b5f..92ba0be953 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -5,8 +5,8 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import fbx -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api import fbx +from ayon_maya.api.lib import ( namespaced, get_namespace, strip_namespace ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index ff11bf0c1f..1472454af7 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -4,8 +4,8 @@ from maya import cmds, mel import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.gltf import extract_gltf +from ayon_maya.api import lib +from ayon_maya.api.gltf import extract_gltf class ExtractGLB(publish.Extractor): @@ -39,7 +39,7 @@ class ExtractGLB(publish.Extractor): "aet": end_frame, "afr": fps, "dsa": 1, - "acn": instance.name, + "acn": instance.name, # codespell:ignore acn "glb": True, "vno": True # visibleNodeOnly } diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_gpu_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index 3fb84c8d83..e461499d88 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -9,7 +9,7 @@ import tempfile from ayon_core.lib import run_subprocess from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractImportReference(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_layout.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index 2a86b20131..f6b5e7d5a8 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -25,7 +25,7 @@ from ayon_core.lib import ( ) from ayon_core.pipeline import publish, KnownPublishError -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib # Modes for transfer COPY = 1 diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index 2fd4f44449..bc0a9afd97 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -4,7 +4,7 @@ import os from maya import cmds -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection from ayon_core.pipeline import ( AYON_CONTAINER_ID, AVALON_CONTAINER_ID, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index cfaea8e479..b6f6529ca5 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -7,7 +7,7 @@ from maya import cmds import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection @contextlib.contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_model.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index 543af59e8f..b439d05a1a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -5,7 +5,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractModel(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index 2dd8821b3a..d69c179712 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseLook(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index 8c195c25fd..a787093648 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -6,7 +6,7 @@ from maya import mel import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseUsd(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index d31660d1b4..eac150ec1a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseUsdComposition(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index 00303e604c..d1e806da9f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,7 +1,7 @@ import os from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_obj.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 6ce40a8728..16204b6008 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -4,7 +4,7 @@ import os from maya import cmds import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractObj(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index a394d880ff..8a94b24e3a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -3,7 +3,7 @@ import os import clique from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index cc930e49cc..04a895ff41 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -4,8 +4,8 @@ from collections import OrderedDict from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( get_all_children, suspended_refresh, maintained_selection, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index 5aefdfc33a..dd15622f5f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -3,8 +3,8 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( suspended_refresh, maintained_selection, iter_visible_nodes_in_range diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 66dd805437..9d0f4085a3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -5,11 +5,11 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, renderlayer ) -from ayon_core.hosts.maya.api.render_setup_tools import ( +from ayon_maya.api.render_setup_tools import ( allow_export_from_render_setup_layer ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 305f4698c6..58e4373d74 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -5,7 +5,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractRig(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index a6811d6a6f..76e49d1588 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -6,7 +6,7 @@ import pyblish.api from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx class ExtractSkeletonMesh(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index d3140487a6..2863e4460b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -3,7 +3,7 @@ import glob import tempfile from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractThumbnail(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index b5cc7745a1..f0096e37e3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -5,8 +5,8 @@ import os from maya import cmds # noqa from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( suspended_refresh, maintained_selection ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 6292afcf41..95e12795de 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -8,7 +8,7 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx @contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index 9cf8a543f4..140a4e4147 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -7,11 +7,11 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( parent_nodes, maintained_selection ) -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx class ExtractUnrealStaticMesh(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_yeticache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index d16f9e8701..581195c5da 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractVRayProxy(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index 023a15e67a..d55c0ddef6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -4,8 +4,8 @@ import os import re from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.render_setup_tools import export_in_rs_layer -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.render_setup_tools import export_in_rs_layer +from ayon_maya.api.lib import maintained_selection from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index 54d295b479..227c16d62a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -5,7 +5,7 @@ import copy from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.alembic import extract_alembic +from ayon_maya.api.alembic import extract_alembic from ayon_core.pipeline import publish diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index b672089a63..61cad1dc33 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -6,7 +6,7 @@ from maya import cmds import xgenm from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, attribute_values, write_xgen_file, delete_after ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 0b67117ebc..8ef43fbf13 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -8,7 +8,7 @@ import contextlib from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib @contextlib.contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml index e92320ccdc..fa908fe425 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml @@ -13,4 +13,4 @@ Check all failing plugins (should be highlighted in red) and fix issues if possi - \ No newline at end of file + diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml similarity index 90% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml index a855dd90a5..cdaf97b8f4 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml @@ -6,13 +6,13 @@ Meshes are detected where the (deformed) mesh has a different `cbId` than the same mesh in its deformation history. -Theses should normally be the same. +These should normally be the same. ### How to repair? By using the repair action the IDs from the shape in history will be copied to the deformed shape. For **animation** instances using the -repair action usually is usually the correct fix. +repair action is usually the correct fix. diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_maya_units.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_maya_units.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_maya_units.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_maya_units.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_mesh_non_manifold.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_mesh_non_manifold.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_mesh_non_manifold.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_mesh_non_manifold.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_node_ids.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_node_ids.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml index 374b8e59ae..956a7adb3b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml @@ -6,7 +6,7 @@ Meshes are detected in the **rig** where the (deformed) mesh has a different `cbId` than the same mesh in its deformation history. -Theses should normally be the same. +These should normally be the same. ### How to repair? diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/increment_current_file_deadline.py rename to server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/reset_xgen_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/save_scene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index 11f4c313fa..bd69e7a3cd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -54,8 +54,8 @@ class ValidateAlembicDefaultsPointcache( default_value = settings[key] - # Lists are best to compared sorted since we cant rely on the order - # of the items. + # Lists are best to compared sorted since we can't rely on + # the order of the items. if isinstance(value, list): value = sorted(value) default_value = sorted(default_value) @@ -79,15 +79,15 @@ class ValidateAlembicDefaultsPointcache( def get_description(): return inspect.cleandoc( """### Alembic Extract settings differ from defaults - - The alembic export options differ from the project default values. - - If this is intentional you can disable this validation by + + The alembic export options differ from the project default values. + + If this is intentional you can disable this validation by disabling **Validate Alembic Options Default**. - + If not you may use the "Repair" action to revert all the options to their default values. - + """ ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index ea989bbcf3..17b9bf4e85 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -20,7 +20,7 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["animation"] label = "Animation Content" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index 7ecd602662..6d53608fb2 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -1,8 +1,8 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -29,7 +29,7 @@ class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin, hosts = ['maya'] label = 'Animation Out Set Related Node Ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 8574b3ecc8..43c7b99ece 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -5,7 +5,7 @@ import pyblish.api from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_core.hosts.maya.api.lib import is_visible +from ayon_maya.api.lib import is_visible class ValidateArnoldSceneSource(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index e5dbe178fc..546d65e84c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -1,5 +1,5 @@ import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_ass_relative_paths.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index c829f4bf74..c5ac22dd84 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -1,6 +1,6 @@ import pyblish.api import maya.cmds as cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -17,7 +17,7 @@ class ValidateAssemblyName(pyblish.api.InstancePlugin, label = "Validate Assembly Name" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] active = False optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 814a8295c4..51b9485999 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -21,7 +21,7 @@ class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin, label = "Validate Assembly Namespaces" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index 3bcae5de49..c5f0b6fd65 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, @@ -32,7 +32,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder + 0.49 label = "Assembly Model Transforms" families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] prompt_message = ("You are about to reset the matrix to the default values." @@ -53,7 +53,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, @classmethod def get_invalid(cls, instance): - from ayon_core.hosts.maya.api import lib + from ayon_maya.api import lib # Get all transforms in the loaded containers container_roots = cmds.listRelatives(instance.data["nodesHierarchy"], @@ -100,7 +100,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, from qtpy import QtWidgets - from ayon_core.hosts.maya.api import lib + from ayon_maya.api import lib # Store namespace in variable, cosmetics thingy choice = QtWidgets.QMessageBox.warning( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 1514972159..08620e22bf 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -4,7 +4,7 @@ from collections import defaultdict import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api.lib import set_attribute +from ayon_maya.api.lib import set_attribute from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 5fd8772a96..95d1e76b83 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -23,7 +23,7 @@ class ValidateCameraAttributes(pyblish.api.InstancePlugin, families = ['camera'] hosts = ['maya'] label = 'Camera Attributes' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True DEFAULTS = [ diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 0f14a057f9..3ce512aebc 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -23,7 +23,7 @@ class ValidateCameraContents(pyblish.api.InstancePlugin, families = ['camera'] hosts = ['maya'] label = 'Camera Contents' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] validate_shapes = True optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index f70b46f89e..40d7297444 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -24,7 +24,7 @@ class ValidateColorSets(pyblish.api.InstancePlugin, families = ['model'] label = 'Mesh ColorSets' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py similarity index 86% rename from client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index f969ff533b..ac773a586a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import maintained_selection +import ayon_maya.api.action +from ayon_maya.api.lib import maintained_selection from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) @@ -15,7 +15,7 @@ class ValidateCycleError(pyblish.api.InstancePlugin, label = "Cycle Errors" hosts = ["maya"] families = ["rig"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index 5736e726e9..20feee8756 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api.lib_rendersetup import ( +from ayon_maya.api.lib_rendersetup import ( get_attr_overrides, get_attr_in_layer, ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_glsl_material.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_glsl_plugin.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index 16e04af446..de20a7c150 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -12,7 +12,7 @@ class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): order = ValidateContentsOrder hosts = ["maya"] label = 'Instance has members' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index e6f4b908bb..f67845bcd5 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -3,7 +3,7 @@ from __future__ import absolute_import import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -28,7 +28,7 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin, optional = True hosts = ["maya"] actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_subset.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_loaded_plugin.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index a8d8ec373a..4709a7bb1e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder @@ -27,7 +27,7 @@ class ValidateLookContents(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Data Contents' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index 7ae3b4b9b5..5a4ccc16ca 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -2,7 +2,7 @@ from collections import defaultdict from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -24,7 +24,7 @@ class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Id Reference Edits' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index 3a67bbd72b..21a056c81c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -30,7 +30,7 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look No Default Shaders' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] DEFAULT_SHADERS = {"lambert1", "initialShadingGroup", "initialParticleSE", "particleCloud1"} diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index dd7515c1fb..97c790c8c6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -1,6 +1,6 @@ import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -44,7 +44,7 @@ class ValidateLookSets(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Sets' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 070974aef5..25e4eb046d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -22,7 +22,7 @@ class ValidateShadingEngine(pyblish.api.InstancePlugin, hosts = ["maya"] label = "Look Shading Engine Naming" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index c0ffaaf9c0..de0a9619b4 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder) @@ -17,7 +17,7 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Single Shader Per Shape' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] # The default connections to check def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 47314b64ac..8171e7e8fa 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.lib as mayalib +import ayon_maya.api.lib as mayalib from ayon_core.pipeline.publish import ( RepairContextAction, ValidateSceneOrder, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index e9d9a17ff4..5a9841b6c0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import ( +import ayon_maya.api.action +from ayon_maya.api.lib import ( maintained_selection, delete_after, undo_chunk, @@ -30,7 +30,7 @@ class ValidateMeshArnoldAttributes(pyblish.api.InstancePlugin, families = ["model"] label = "Mesh Arnold Attributes" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index c95e1ec816..ad2b08ba19 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -21,7 +21,7 @@ class ValidateMeshEmpty(pyblish.api.InstancePlugin): families = ["model"] label = "Mesh Empty" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 633fc29732..25da24db1c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -1,13 +1,13 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_core.hosts.maya.api.lib import len_flattened +from ayon_maya.api.lib import len_flattened class ValidateMeshHasUVs(pyblish.api.InstancePlugin, @@ -24,7 +24,7 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Has UVs' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index bfb4257f23..ee6acd1685 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -21,7 +21,7 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Lamina Faces' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True description = ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index 58d015e962..f4d907636c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -25,7 +25,7 @@ class ValidateMeshNgons(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Mesh ngons" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True description = ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index bf1489f92e..7868015a30 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, PublishValidationError, @@ -33,7 +33,7 @@ class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh No Negative Scale' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index 958707e4f4..dc561be981 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -1,7 +1,7 @@ from maya import cmds, mel import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, PublishXmlValidationError, @@ -114,7 +114,7 @@ class ValidateMeshNonManifold(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Non-Manifold Edges/Vertices' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, CleanupMatchingPolygons] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index 0a8d6cf159..7830e10f2a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -25,7 +25,7 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, families = ['model'] hosts = ['maya'] label = 'Mesh Edge Length Non Zero' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True __tolerance = 1e-5 diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index 76b716d01f..2d8370166b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -2,7 +2,7 @@ from maya import cmds import maya.api.OpenMaya as om2 import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -31,7 +31,7 @@ class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Normals Unlocked' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index a13d16e849..9606ec3202 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -5,7 +5,7 @@ from maya import cmds import maya.api.OpenMaya as om import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -248,7 +248,7 @@ class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Has Overlapping UVs' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 70ede83f2d..2e91df87a3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -96,7 +96,7 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = "Mesh Shader Connections" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index 21697cd903..d807833a77 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -26,7 +26,7 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, families = ['model', 'pointcache'] optional = True label = "Mesh Single UV Set" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index 305a58d78e..c4d3abc624 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -3,7 +3,7 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -28,7 +28,7 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, families = ['model'] optional = True label = "Mesh has map1 UV Set" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @classmethod @@ -120,10 +120,10 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, @staticmethod def get_description(): return inspect.cleandoc("""### Mesh found without map1 uv set - + A mesh must have a default UV set named `map1` to adhere to the default mesh behavior of Maya meshes. - + There may be meshes that: - Have no UV set - Have no `map1` uv set but are using a different name @@ -131,7 +131,7 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, #### Repair - + Using repair will try to make the first UV set the `map1` uv set. If it does not exist yet it will be created or renames the current first UV set to `map1`. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index f0962148dc..9dbdc8fd2b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import len_flattened +import ayon_maya.api.action +from ayon_maya.api.lib import len_flattened from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, @@ -35,7 +35,7 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Vertices Have Edges' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index bbc644c3db..b06b45db81 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -3,8 +3,8 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -24,7 +24,7 @@ class ValidateModelContent(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Model Content" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] validate_top_group = True optional = False @@ -120,18 +120,18 @@ class ValidateModelContent(pyblish.api.InstancePlugin, message="Model content is invalid. See log for more details.", description=self.get_description() ) - + @classmethod def get_description(cls): return inspect.cleandoc(f""" ### Model content is invalid - - Your model instance does not adhere to the rules of a + + Your model instance does not adhere to the rules of a model product type: - + - Must have at least one visible shape in it, like a mesh. - - Must have one root node. When exporting multiple meshes they + - Must have one root node. When exporting multiple meshes they must be inside a group. - - May only contain the following node types: + - May only contain the following node types: {", ".join(cls.allowed)} """) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 8c2bbf2a36..980565afad 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -1,6 +1,6 @@ import os import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -18,7 +18,7 @@ class ValidateMvLookContents(pyblish.api.InstancePlugin, families = ['mvLook'] hosts = ['maya'] label = 'Validate mvLook Data' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] # Allow this validation step to be skipped when you just need to # get things pushed through. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index bf45c0e974..0e1f179483 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -31,7 +31,7 @@ class ValidateNoAnimation(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] optional = True - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): if not self.is_active(instance.data): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index 3e21ec6e50..be469cd4df 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -29,7 +29,7 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['camera'] label = "No Default Cameras" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index f546caff2c..0d7b67e179 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -8,7 +8,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin ) -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action def _as_report_list(values, prefix="- ", suffix="\n"): @@ -33,7 +33,7 @@ class ValidateNoNamespace(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'No Namespaces' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 38955fd777..876be073a0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -50,7 +50,7 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin, families = ['model'] label = 'No Empty/Null Transforms' actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 5cc3e95593..8b4d873014 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -33,7 +33,7 @@ class ValidateNoUnknownNodes(pyblish.api.InstancePlugin, families = ['model', 'rig'] optional = True label = "Unknown Nodes" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_vraymesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py similarity index 89% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index 2d6f231cb5..810dbc4fa1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -4,8 +4,8 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishXmlValidationError ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib class ValidateNodeIDs(pyblish.api.InstancePlugin): @@ -28,8 +28,8 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): "yetiRig", "assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 545ab8e28c..4fc8f776ef 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ValidateContentsOrder) @@ -22,7 +22,7 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): hosts = ['maya'] label = 'Deformed shape ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index d679c510af..a1fde89fc3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -1,8 +1,8 @@ import pyblish.api import ayon_api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( PublishValidationError, ValidatePipelineOrder) @@ -23,8 +23,8 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): hosts = ['maya'] families = ["*"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index 17eb58f421..0ad497d119 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -3,8 +3,8 @@ import uuid from collections import defaultdict import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidatePipelineOrder) from ayon_api import get_folders @@ -31,8 +31,8 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, "rig"] optional = True - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): @@ -109,14 +109,14 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, @staticmethod def get_description(): return inspect.cleandoc("""### Node IDs must match folder id - + The node ids must match the folder entity id you are publishing to. - - Usually these mismatch occurs if you are re-using nodes from another - folder or project. - + + Usually these mismatch occurs if you are re-using nodes from another + folder or project. + #### How to repair? - - The repair action will regenerate new ids for + + The repair action will regenerate new ids for the invalid nodes to match the instance's folder. """) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index 6b44a307d2..ae04a48678 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -5,8 +5,8 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishValidationError ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from maya import cmds @@ -25,8 +25,8 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): "rig", "yetiRig"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 10cbbc9a88..1220282d0c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -27,7 +27,7 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model', 'rig'] label = "No Ghosting" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False _attributes = {'ghosting': 0} diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index f961ec6e4a..ef6f97371f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -4,8 +4,8 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import pairwise -from ayon_core.hosts.maya.api.action import SelectInvalidAction +from ayon_maya.api.lib import pairwise +from ayon_maya.api.action import SelectInvalidAction from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_image_rule.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 41c0fa4807..1692b90993 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -18,7 +18,7 @@ class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['renderlayer'] label = "No Default Cameras Renderable" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index e186d74b89..cb03e68642 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -4,8 +4,8 @@ import inspect import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings +import ayon_maya.api.action +from ayon_maya.api.lib_rendersettings import RenderSettings from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -26,7 +26,7 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, hosts = ['maya'] families = ["renderlayer", "vrayscene"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False R_CAMERA_TOKEN = re.compile(r'%c|', re.IGNORECASE) @@ -77,8 +77,8 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, Your render cameras are misconfigured. You may have no render camera set or have multiple cameras with a render filename prefix that does not include the `` token. - + See the logs for more details about the cameras. - + """ ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index 910e336fc1..92d97776e1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -1,7 +1,7 @@ import ayon_api import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -28,7 +28,7 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, label = "Render Passes / AOVs Are Registered" hosts = ["maya"] families = ["renderlayer"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index 7badfdc027..d5a9ea778c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -12,8 +12,8 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api import lib +from ayon_maya.api.lib_rendersettings import RenderSettings def convert_to_int_or_float(string_value): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index d822dca288..aae3940e02 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -5,8 +5,8 @@ from ayon_core.pipeline import ( ) from maya import cmds from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib import reset_scene_resolution +from ayon_maya.api import lib +from ayon_maya.api.lib import reset_scene_resolution class ValidateResolution(pyblish.api.InstancePlugin, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_resources.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_review.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index f05e2b7311..b8b8728888 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -1,6 +1,6 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -22,7 +22,7 @@ class ValidateRigContents(pyblish.api.InstancePlugin, label = "Rig Contents" hosts = ["maya"] families = ["rig"] - action = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + action = [ayon_maya.api.action.SelectInvalidAction] optional = True accepted_output = ["mesh", "transform"] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index 814ff50177..aed0800160 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -8,8 +8,8 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import undo_chunk +import ayon_maya.api.action +from ayon_maya.api.lib import undo_chunk class ValidateRigControllers(pyblish.api.InstancePlugin, @@ -37,7 +37,7 @@ class ValidateRigControllers(pyblish.api.InstancePlugin, families = ["rig"] optional = True actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] # Default controller values CONTROLLER_DEFAULTS = { diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index ea2de81036..4bc47c5949 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -9,8 +9,8 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api import lib -import ayon_core.hosts.maya.api.action +from ayon_maya.api import lib +import ayon_maya.api.action class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, @@ -39,7 +39,7 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, families = ["rig"] optional = False actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] attributes = [ "rcurve", diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py similarity index 90% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index 78cc3f5938..d45af574ab 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -28,7 +28,7 @@ class ValidateRigJointsHidden(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['rig'] label = "Joints Hidden" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index d94ddc5f2a..e5404aae7e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -2,8 +2,8 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -30,7 +30,7 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, hosts = ['maya'] label = 'Rig Out Set Node Ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] allow_history_only = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index d04006f013..c5fee5ddc6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -4,8 +4,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import get_id, set_id +import ayon_maya.api.action +from ayon_maya.api.lib import get_id, set_id from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -30,7 +30,7 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["rig"] actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_scene_set_workspace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_setdress_root.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index 09c17202c5..ed1ea17966 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -3,7 +3,7 @@ import re import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) @@ -20,7 +20,7 @@ class ValidateShaderName(pyblish.api.InstancePlugin, families = ["look"] hosts = ['maya'] label = 'Validate Shaders Name' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] regex = r'(?P.*)_(.*)_SHD' # The default connections to check diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index c4c4c909d3..5355cd9cfd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, @@ -43,7 +43,7 @@ class ValidateShapeDefaultNames(pyblish.api.InstancePlugin, families = ['model'] optional = True label = "Shape Default Naming" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index 52ce3c5436..e6e2f963e9 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -19,7 +19,7 @@ class ValidateShapeRenderStats(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Shape Default Render Stats' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] defaults = {'castsShadows': 1, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 6c89258085..6d39e26408 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, @@ -25,7 +25,7 @@ class ValidateShapeZero(pyblish.api.InstancePlugin, families = ["model"] label = "Shape Zero (Freeze)" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_single_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_hierarchy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index cc25e769e6..7e63ed2ae3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_core.hosts.maya.api.action import ( +from ayon_maya.api.action import ( SelectInvalidAction, ) from ayon_core.pipeline.publish import ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeleton_top_group_hierarchy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index a548e12f33..7a7b6a9048 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -24,7 +24,7 @@ class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['fbx'] label = "Skincluster Deformer Relationships" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index a276a5b644..1373048cc2 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -1,6 +1,6 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -21,7 +21,7 @@ class ValidateStepSize(pyblish.api.InstancePlugin, families = ['camera', 'pointcache', 'animation'] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False MIN = 0.01 MAX = 1.0 diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index e565866778..846fc86650 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -40,7 +40,7 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, families = ["model"] optional = True label = "Suffix Naming Conventions" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] SUFFIX_NAMING_TABLE = json.dumps({ "mesh": ["_GEO", "_GES", "_GEP", "_OSD"], "nurbsCurve": ["_CRV"], diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index cd96ebb10d..51fa7938ef 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -3,7 +3,7 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -25,7 +25,7 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Transform Zero (Freeze)" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] _identity = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, @@ -86,7 +86,7 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, def get_description(): return inspect.cleandoc("""### Transform can't have any values - The model publish allows no transformations. + The model publish allows no transformations. You must **freeze transformations** to continue. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 0066d70531..74f2292680 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -21,7 +21,7 @@ class ValidateUniqueNames(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Unique transform name" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index 6440c00eae..f6207797a7 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -8,7 +8,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, @@ -19,7 +19,7 @@ class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["staticMesh"] label = "Mesh is Triangulated" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] active = False @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index 88b0ff0e71..eff980843e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -4,7 +4,7 @@ import re import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -58,7 +58,7 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["staticMesh"] label = "Unreal Static Mesh Name" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] regex_mesh = r"(?P.*))" regex_collision = r"(?P.*)" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_up_axis.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 1fdb476dba..4252585324 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -1,7 +1,7 @@ import pyblish.api -from ayon_core.hosts.maya.api.lib import iter_visible_nodes_in_range -import ayon_core.hosts.maya.api.action +from ayon_maya.api.lib import iter_visible_nodes_in_range +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -21,7 +21,7 @@ class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, label = "Alembic Visible Only" hosts = ["maya"] families = ["pointcache", "animation"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index b3978b8483..76c87f3e8b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( KnownPublishError, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_translator_settings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 6732d09202..40315a1e40 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -18,7 +18,7 @@ class ValidateVrayProxyMembers(pyblish.api.InstancePlugin, label = 'VRay Proxy Members' hosts = ['maya'] families = ['vrayproxy'] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 84614fc0be..87887b7d36 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -2,7 +2,7 @@ import inspect import pyblish.api import maya.cmds as cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, PublishValidationError, @@ -25,7 +25,7 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["yetiRig"] actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index 77e189e37b..59a6867c17 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -18,7 +18,7 @@ class ValidateYetiRigInputShapesInInstance(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["yetiRig"] label = "Yeti Rig Input Shapes In Instance" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_settings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py diff --git a/client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py rename to server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py index b07c7e9a70..6cf38e591a 100644 --- a/client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py @@ -4,12 +4,12 @@ from ayon_core.pipeline.workfile.workfile_template_builder import ( PlaceholderLoadMixin, LoadPlaceholderItem ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( get_container_transforms, get_node_parent, get_node_index_under_parent ) -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaPlaceholderPlugin, ) diff --git a/client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py rename to server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py index 62e10ba023..ff54306220 100644 --- a/client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaPlaceholderPlugin ) from ayon_core.lib import NumberDef, TextDef, EnumDef diff --git a/client/ayon_core/hosts/maya/startup/userSetup.py b/server_addon/maya/client/ayon_maya/startup/userSetup.py similarity index 96% rename from client/ayon_core/hosts/maya/startup/userSetup.py rename to server_addon/maya/client/ayon_maya/startup/userSetup.py index 3112e2bf12..600864fd2b 100644 --- a/client/ayon_core/hosts/maya/startup/userSetup.py +++ b/server_addon/maya/client/ayon_maya/startup/userSetup.py @@ -2,7 +2,7 @@ import os from ayon_core.settings import get_project_settings from ayon_core.pipeline import install_host, get_current_project_name -from ayon_core.hosts.maya.api import MayaHost +from ayon_maya.api import MayaHost from maya import cmds diff --git a/client/ayon_core/hosts/maya/tools/__init__.py b/server_addon/maya/client/ayon_maya/tools/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/__init__.py rename to server_addon/maya/client/ayon_maya/tools/__init__.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/LICENSE b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/LICENSE similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/LICENSE rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/LICENSE diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/__init__.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/__init__.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/__init__.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/alembic.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/alembic.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/alembic.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/alembic.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/app.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/app.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py index 44d8dfda21..2937b72934 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/app.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py @@ -8,7 +8,7 @@ from qtpy import QtWidgets, QtCore from ayon_core import style from ayon_core.pipeline import get_current_project_name from ayon_core.tools.utils.lib import qt_app_context -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( assign_look_by_version, get_main_window ) diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py index a20880dffc..c285b857c7 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py @@ -7,7 +7,7 @@ from maya import cmds import ayon_api from ayon_core.pipeline import get_current_project_name -from ayon_core.hosts.maya import api +from ayon_maya import api from . import lib from .alembic import get_alembic_ids_cache diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py index ad43a24385..54b1cff740 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py @@ -10,7 +10,7 @@ from ayon_core.pipeline import ( registered_host, get_current_project_name, ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from .vray_proxies import get_alembic_ids_cache from . import arnold_standin diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py similarity index 98% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py index 78fded12a9..5417db26bc 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( loaders_from_representation, load_container ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib log = logging.getLogger(__name__) diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/models.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/models.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/models.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/models.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/usd.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/usd.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/usd.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/usd.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/views.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/views.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/views.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/views.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py similarity index 98% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py index c1d9f019e4..6b451abb9a 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py @@ -7,7 +7,7 @@ from maya import cmds import ayon_api from ayon_core.pipeline import get_current_project_name -import ayon_core.hosts.maya.api.lib as maya_lib +import ayon_maya.api.lib as maya_lib from . import lib from .alembic import get_alembic_ids_cache diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/widgets.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/widgets.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/widgets.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/widgets.py diff --git a/client/ayon_core/hosts/maya/vendor/python/capture.py b/server_addon/maya/client/ayon_maya/vendor/python/capture.py similarity index 100% rename from client/ayon_core/hosts/maya/vendor/python/capture.py rename to server_addon/maya/client/ayon_maya/vendor/python/capture.py diff --git a/server_addon/maya/package.py b/server_addon/maya/package.py index 4537c23eaa..274f74869b 100644 --- a/server_addon/maya/package.py +++ b/server_addon/maya/package.py @@ -1,3 +1,7 @@ name = "maya" title = "Maya" -version = "0.1.20" +version = "0.2.0" + +ayon_required_addons = { + "core": ">0.3.2", +} From a75cb56dc5f31e16184322becd01bc56aa00c7d8 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Thu, 23 May 2024 16:16:07 +0100 Subject: [PATCH 275/469] Update client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 5a3d3cc0de..e59c296904 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -44,4 +44,5 @@ class SetupHeadlessFarm(pyblish.api.InstancePlugin): instance.data["families"] = ["headless_farm"] # Use the workfile instead of published. - instance.data["use_published_workfile"] = False + attribute_values = instance.data.setdefault("attributeValues", {}) + attribute_values["use_published_workfile"] = False From 459e9a51c04542da277d80c110c86a06a63bae8e Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Thu, 23 May 2024 16:17:33 +0100 Subject: [PATCH 276/469] Update client/ayon_core/hosts/nuke/api/lib.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/hosts/nuke/api/lib.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index 9acd8ecfa9..f1a9418111 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1027,8 +1027,10 @@ def script_name(): def add_button_headless_farm_submission(node): name = "headlessFarmSubmission" label = "Headless Farm Submission" - value = "from ayon_core.hosts.nuke.api.utils import submit_headless_farm;" - value += "submit_headless_farm(nuke.thisNode())" + value = ( + "from ayon_core.hosts.nuke.api.utils import submit_headless_farm;" + "submit_headless_farm(nuke.thisNode())" + ) knob = nuke.PyScript_Knob(name, label, value) knob.clearFlag(nuke.STARTLINE) node.addKnob(knob) From cc600bd930e2dd26f7f8356b89f0c69f6628cae8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 23:20:37 +0800 Subject: [PATCH 277/469] add roughness, roughness, height option into the channel_mapping --- .../substancepainter/server/settings/creator_plugins.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server_addon/substancepainter/server/settings/creator_plugins.py b/server_addon/substancepainter/server/settings/creator_plugins.py index 363ed7fe88..9ba7684d30 100644 --- a/server_addon/substancepainter/server/settings/creator_plugins.py +++ b/server_addon/substancepainter/server/settings/creator_plugins.py @@ -24,6 +24,9 @@ DEFAULT_CREATOR_SETTINGS = { "channel_mapping": [ {"name": "Base Color", "value": "BaseColor"}, {"name": "Metallic", "value": "Metallic"}, + {"name": "Roughness", "value": "Roughness"}, + {"name": "Normal", "value": "Normal"}, + {"name": "Height", "value": "Height"}, {"name": "Specular Edge Color", "value": "SpecularEdgeColor"}, {"name": "Opacity", "value": "Opacity"}, From 84c355e65e6bd2a5b5047706950820acd721a9dd Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Thu, 23 May 2024 18:23:02 +0300 Subject: [PATCH 278/469] update required core version inside houdini package Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/houdini/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/package.py b/server_addon/houdini/package.py index 9e5fe56e34..275d21c1bf 100644 --- a/server_addon/houdini/package.py +++ b/server_addon/houdini/package.py @@ -5,6 +5,6 @@ version = "0.3.0" client_dir = "ayon_houdini" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {} From 3debb92c02f7ed539983f734821bfdda7512e385 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 23 May 2024 17:15:52 +0100 Subject: [PATCH 279/469] Use publish_attributes --- .../nuke/plugins/publish/collect_headless_farm.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index e59c296904..7db2ed117c 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -1,5 +1,9 @@ import pyblish.api +from ayon_core.pipeline.publish import ( + AYONPyblishPluginMixin +) + class CollectHeadlessFarm(pyblish.api.ContextPlugin): """Setup instances for headless farm submission.""" @@ -27,7 +31,7 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): instance.data["families"].append("headless_farm") -class SetupHeadlessFarm(pyblish.api.InstancePlugin): +class SetupHeadlessFarm(pyblish.api.InstancePlugin, AYONPyblishPluginMixin): """Setup instance for headless farm submission.""" order = pyblish.api.CollectorOrder + 0.4999 @@ -44,5 +48,6 @@ class SetupHeadlessFarm(pyblish.api.InstancePlugin): instance.data["families"] = ["headless_farm"] # Use the workfile instead of published. - attribute_values = instance.data.setdefault("attributeValues", {}) - attribute_values["use_published_workfile"] = False + publish_attributes = instance.data["publish_attributes"] + plugin_attributes = publish_attributes["NukeSubmitDeadline"] + plugin_attributes["use_published_workfile"] = False From 4c6eb7a84ddff30e7bb028ac2ae4473202df545e Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 23 May 2024 17:16:39 +0100 Subject: [PATCH 280/469] Revert use_published_workfile --- .../deadline/plugins/publish/submit_nuke_deadline.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py index 6e752a5455..db35c2ae67 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_nuke_deadline.py @@ -115,11 +115,8 @@ class NukeSubmitDeadline(pyblish.api.InstancePlugin, render_path = instance.data['path'] script_path = context.data["currentFile"] - use_published_workfile = instance.data.get( - "use_published_workfile", - instance.data["attributeValues"].get( - "use_published_workfile", self.use_published_workfile - ) + use_published_workfile = instance.data["attributeValues"].get( + "use_published_workfile", self.use_published_workfile ) if use_published_workfile: script_path = self._get_published_workfile_path(context) From 23ee1caa44ea702212a04b08899757a63a004618 Mon Sep 17 00:00:00 2001 From: Toke Jepsen Date: Thu, 23 May 2024 17:22:00 +0100 Subject: [PATCH 281/469] Update client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../hosts/nuke/plugins/publish/collect_headless_farm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 7db2ed117c..82b6b2b3e9 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -9,7 +9,7 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): """Setup instances for headless farm submission.""" # Needs to be after CollectFromCreateContext - order = pyblish.api.CollectorOrder - 0.4 + order = pyblish.api.CollectorOrder - 0.49 label = "Collect Headless Farm" hosts = ["nuke"] From c8bc9ab0ea30e3f7748f00473ff25210cab3ef32 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:54:18 +0200 Subject: [PATCH 282/469] projects model has option to get status items --- .../ayon_core/tools/common_models/projects.py | 94 ++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index 19a38bee21..3911d0c403 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -5,7 +5,7 @@ import ayon_api import six from ayon_core.style import get_default_entity_icon_color -from ayon_core.lib import CacheItem +from ayon_core.lib import CacheItem, NestedCacheItem PROJECTS_MODEL_SENDER = "projects.model" @@ -17,6 +17,49 @@ class AbstractHierarchyController: pass +class StatusItem: + """Item representing status of project. + + Args: + name (str): Status name ("Not ready"). + color (str): Status color in hex ("#434a56"). + short (str): Short status name ("NRD"). + icon (str): Icon name in MaterialIcons ("fiber_new"). + state (Literal["not_started", "in_progress", "done", "blocked"]): + Status state. + + """ + def __init__(self, name, color, short, icon, state): + self.name = name + self.color = color + self.short = short + self.icon = icon + self.state = state + + def to_data(self): + return { + "name": self.name, + "color": self.color, + "short": self.short, + "icon": self.icon, + "state": self.state, + } + + @classmethod + def from_data(cls, data): + return cls(**data) + + @classmethod + def from_project_item(cls, status_data): + return cls( + name=status_data["name"], + color=status_data["color"], + short=status_data["shortName"], + icon=status_data["icon"], + state=status_data["state"], + ) + + class ProjectItem: """Item representing folder entity on a server. @@ -89,6 +132,9 @@ class ProjectsModel(object): self._projects_cache = CacheItem(default_factory=list) self._project_items_by_name = {} self._projects_by_name = {} + self._project_statuses_cache = NestedCacheItem( + levels=1, default_factory=list + ) self._is_refreshing = False self._controller = controller @@ -97,6 +143,7 @@ class ProjectsModel(object): self._projects_cache.reset() self._project_items_by_name = {} self._projects_by_name = {} + self._project_statuses_cache.reset() def refresh(self): self._refresh_projects_cache() @@ -124,6 +171,34 @@ class ProjectsModel(object): self._projects_by_name[project_name] = entity return self._projects_by_name[project_name] + def get_project_status_items(self, project_name, sender): + """Get project status items. + + Args: + project_name (str): Project name. + sender (Union[str, None]): Name of sender who asked for items. + + Returns: + list[StatusItem]: Status items for project. + + """ + statuses_cache = self._project_statuses_cache[project_name] + if not statuses_cache.is_valid: + with self._project_statuses_refresh_event_manager( + sender, project_name + ): + project_entity = None + if project_name: + project_entity = self.get_project_entity(project_name) + statuses = [] + if project_entity: + statuses = [ + StatusItem.from_project_item(status) + for status in project_entity["statuses"] + ] + statuses_cache.update_data(statuses) + return statuses_cache.get_data() + @contextlib.contextmanager def _project_refresh_event_manager(self, sender): self._is_refreshing = True @@ -143,6 +218,23 @@ class ProjectsModel(object): ) self._is_refreshing = False + @contextlib.contextmanager + def _project_statuses_refresh_event_manager(self, sender, project_name): + self._controller.emit_event( + "projects.statuses.refresh.started", + {"sender": sender, "project_name": project_name}, + PROJECTS_MODEL_SENDER + ) + try: + yield + + finally: + self._controller.emit_event( + "projects.statuses.refresh.finished", + {"sender": sender, "project_name": project_name}, + PROJECTS_MODEL_SENDER + ) + def _refresh_projects_cache(self, sender=None): if self._is_refreshing: return None From c575420bb579f73cf1f4a738c85141b9b4203298 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:55:00 +0200 Subject: [PATCH 283/469] project entities are cached values --- .../ayon_core/tools/common_models/projects.py | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index 3911d0c403..d14963a4e9 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -131,10 +131,12 @@ class ProjectsModel(object): def __init__(self, controller): self._projects_cache = CacheItem(default_factory=list) self._project_items_by_name = {} - self._projects_by_name = {} self._project_statuses_cache = NestedCacheItem( levels=1, default_factory=list ) + self._projects_by_name = NestedCacheItem( + levels=1, default_factory=list + ) self._is_refreshing = False self._controller = controller @@ -142,8 +144,8 @@ class ProjectsModel(object): def reset(self): self._projects_cache.reset() self._project_items_by_name = {} - self._projects_by_name = {} self._project_statuses_cache.reset() + self._projects_by_name.reset() def refresh(self): self._refresh_projects_cache() @@ -164,12 +166,23 @@ class ProjectsModel(object): return self._projects_cache.get_data() def get_project_entity(self, project_name): - if project_name not in self._projects_by_name: + """Get project entity. + + Args: + project_name (str): Project name. + + Returns: + Union[dict[str, Any], None]: Project entity or None if project + was not found by name. + + """ + project_cache = self._projects_by_name[project_name] + if not project_cache.is_valid: entity = None if project_name: entity = ayon_api.get_project(project_name) - self._projects_by_name[project_name] = entity - return self._projects_by_name[project_name] + project_cache.update_data(entity) + return project_cache.get_data() def get_project_status_items(self, project_name, sender): """Get project status items. From 66122bfabe5fea58776ff5e2846ab8d3ef3eb27a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:55:28 +0200 Subject: [PATCH 284/469] removed unused attribute --- client/ayon_core/tools/common_models/projects.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index d14963a4e9..fa308de0a9 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -130,7 +130,6 @@ def _get_project_items_from_entitiy(projects): class ProjectsModel(object): def __init__(self, controller): self._projects_cache = CacheItem(default_factory=list) - self._project_items_by_name = {} self._project_statuses_cache = NestedCacheItem( levels=1, default_factory=list ) @@ -143,7 +142,6 @@ class ProjectsModel(object): def reset(self): self._projects_cache.reset() - self._project_items_by_name = {} self._project_statuses_cache.reset() self._projects_by_name.reset() From d572f929c2512c7ceea59fdba1cc480bee78f30a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:55:40 +0200 Subject: [PATCH 285/469] use helper method to create ProjectItem --- .../ayon_core/tools/common_models/projects.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index fa308de0a9..5df7178bcc 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -83,6 +83,23 @@ class ProjectItem: } self.icon = icon + @classmethod + def from_entity(cls, project_entity): + """Creates folder item from entity. + + Args: + project_entity (dict[str, Any]): Project entity. + + Returns: + ProjectItem: Project item. + + """ + return cls( + project_entity["name"], + project_entity["active"], + project_entity["library"], + ) + def to_data(self): """Converts folder item to data. @@ -122,7 +139,7 @@ def _get_project_items_from_entitiy(projects): """ return [ - ProjectItem(project["name"], project["active"], project["library"]) + ProjectItem.from_entity(project) for project in projects ] From 1c282b1bbb80266b3e7241111aefbe102651c695 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:55:51 +0200 Subject: [PATCH 286/469] add docstring to 'refresh' method --- client/ayon_core/tools/common_models/projects.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/client/ayon_core/tools/common_models/projects.py b/client/ayon_core/tools/common_models/projects.py index 5df7178bcc..89dd881a10 100644 --- a/client/ayon_core/tools/common_models/projects.py +++ b/client/ayon_core/tools/common_models/projects.py @@ -163,6 +163,13 @@ class ProjectsModel(object): self._projects_by_name.reset() def refresh(self): + """Refresh project items. + + This method will requery list of ProjectItem returned by + 'get_project_items'. + + To reset all cached items use 'reset' method. + """ self._refresh_projects_cache() def get_project_items(self, sender): From 235cd4b69b2c158aa2424173b2a647d99c9f50b9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:56:16 +0200 Subject: [PATCH 287/469] prepare backend for status value --- client/ayon_core/tools/loader/abstract.py | 25 +++++++++++++++++++ client/ayon_core/tools/loader/control.py | 5 ++++ .../ayon_core/tools/loader/models/products.py | 6 ++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/loader/abstract.py b/client/ayon_core/tools/loader/abstract.py index 7a7d335092..509db4d037 100644 --- a/client/ayon_core/tools/loader/abstract.py +++ b/client/ayon_core/tools/loader/abstract.py @@ -114,6 +114,7 @@ class VersionItem: thumbnail_id (Union[str, None]): Thumbnail id. published_time (Union[str, None]): Published time in format '%Y%m%dT%H%M%SZ'. + status (Union[str, None]): Status name. author (Union[str, None]): Author. frame_range (Union[str, None]): Frame range. duration (Union[int, None]): Duration. @@ -132,6 +133,7 @@ class VersionItem: thumbnail_id, published_time, author, + status, frame_range, duration, handles, @@ -146,6 +148,7 @@ class VersionItem: self.is_hero = is_hero self.published_time = published_time self.author = author + self.status = status self.frame_range = frame_range self.duration = duration self.handles = handles @@ -185,6 +188,7 @@ class VersionItem: "is_hero": self.is_hero, "published_time": self.published_time, "author": self.author, + "status": self.status, "frame_range": self.frame_range, "duration": self.duration, "handles": self.handles, @@ -488,6 +492,27 @@ class FrontendLoaderController(_BaseLoaderController): pass + @abstractmethod + def get_project_status_items(self, project_name, sender=None): + """Items for all projects available on server. + + Triggers event topics "projects.statuses.refresh.started" and + "projects.statuses.refresh.finished" with data: + { + "sender": sender, + "project_name": project_name + } + + Args: + project_name (Union[str, None]): Project name. + sender (Optional[str]): Sender who requested the items. + + Returns: + list[StatusItem]: List of status items. + """ + + pass + @abstractmethod def get_product_items(self, project_name, folder_ids, sender=None): """Product items for folder ids. diff --git a/client/ayon_core/tools/loader/control.py b/client/ayon_core/tools/loader/control.py index 0c9bb369c7..35188369c2 100644 --- a/client/ayon_core/tools/loader/control.py +++ b/client/ayon_core/tools/loader/control.py @@ -180,6 +180,11 @@ class LoaderController(BackendLoaderController, FrontendLoaderController): def get_project_items(self, sender=None): return self._projects_model.get_project_items(sender) + def get_project_status_items(self, project_name, sender=None): + return self._projects_model.get_project_status_items( + project_name, sender + ) + def get_folder_items(self, project_name, sender=None): return self._hierarchy_model.get_folder_items(project_name, sender) diff --git a/client/ayon_core/tools/loader/models/products.py b/client/ayon_core/tools/loader/models/products.py index a3bbc30a09..c9325c4480 100644 --- a/client/ayon_core/tools/loader/models/products.py +++ b/client/ayon_core/tools/loader/models/products.py @@ -58,6 +58,7 @@ def version_item_from_entity(version): thumbnail_id=version["thumbnailId"], published_time=published_time, author=author, + status=version["status"], frame_range=frame_range, duration=duration, handles=handles, @@ -526,8 +527,11 @@ class ProductsModel: products = list(ayon_api.get_products(project_name, **kwargs)) product_ids = {product["id"] for product in products} + # Add 'status' to fields -> fixed in ayon-python-api 1.0.4 + fields = ayon_api.get_default_fields_for_type("version") + fields.add("status") versions = ayon_api.get_versions( - project_name, product_ids=product_ids + project_name, product_ids=product_ids, fields=fields ) return self._create_product_items( From f9efd8f05d5adb726d2d9f3c7dab15de3d18a70c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 23 May 2024 18:56:27 +0200 Subject: [PATCH 288/469] added status column in UI --- .../tools/loader/ui/products_model.py | 96 ++++++++++++------- 1 file changed, 60 insertions(+), 36 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index b465679c3b..76da76dbfb 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -22,18 +22,22 @@ VERSION_HERO_ROLE = QtCore.Qt.UserRole + 11 VERSION_NAME_ROLE = QtCore.Qt.UserRole + 12 VERSION_NAME_EDIT_ROLE = QtCore.Qt.UserRole + 13 VERSION_PUBLISH_TIME_ROLE = QtCore.Qt.UserRole + 14 -VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 15 -VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 16 -VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 17 -VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 18 -VERSION_STEP_ROLE = QtCore.Qt.UserRole + 19 -VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 20 -VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 21 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 22 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 23 -REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 24 -SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 25 -SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 26 +VERSION_STATUS_NAME_ROLE = QtCore.Qt.UserRole + 15 +VERSION_STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 16 +VERSION_STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 17 +VERSION_STATUS_ROLE = QtCore.Qt.UserRole + 18 +VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 19 +VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 20 +VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 21 +VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 22 +VERSION_STEP_ROLE = QtCore.Qt.UserRole + 23 +VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 24 +VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 25 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 27 +REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 28 +SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 +SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 30 class ProductsModel(QtGui.QStandardItemModel): @@ -46,6 +50,7 @@ class ProductsModel(QtGui.QStandardItemModel): "Version", "Time", "Author", + "Status", "Frames", "Duration", "Handles", @@ -69,11 +74,35 @@ class ProductsModel(QtGui.QStandardItemModel): ] ] + product_name_col = column_labels.index("Product name") + product_type_col = column_labels.index("Product type") + folders_label_col = column_labels.index("Folder") version_col = column_labels.index("Version") published_time_col = column_labels.index("Time") - folders_label_col = column_labels.index("Folder") + author_col = column_labels.index("Author") + status_col = column_labels.index("Status") + frame_range_col = column_labels.index("Frames") + duration_col = column_labels.index("Duration") + handles_col = column_labels.index("Handles") + step_col = column_labels.index("Step") in_scene_col = column_labels.index("In scene") sitesync_avail_col = column_labels.index("Availability") + _display_role_mapping = { + product_name_col: QtCore.Qt.DisplayRole, + product_type_col: PRODUCT_TYPE_ROLE, + folders_label_col: FOLDER_LABEL_ROLE, + version_col: VERSION_NAME_ROLE, + published_time_col: VERSION_PUBLISH_TIME_ROLE, + author_col: VERSION_AUTHOR_ROLE, + status_col: VERSION_STATUS_NAME_ROLE, + frame_range_col: VERSION_FRAME_RANGE_ROLE, + duration_col: VERSION_DURATION_ROLE, + handles_col: VERSION_HANDLES_ROLE, + step_col: VERSION_STEP_ROLE, + in_scene_col: PRODUCT_IN_SCENE_ROLE, + sitesync_avail_col: VERSION_AVAILABLE_ROLE, + + } def __init__(self, controller): super(ProductsModel, self).__init__() @@ -96,6 +125,7 @@ class ProductsModel(QtGui.QStandardItemModel): self._last_project_name = None self._last_folder_ids = [] + self._last_project_statuses = {} def get_product_item_indexes(self): return [ @@ -141,6 +171,15 @@ class ProductsModel(QtGui.QStandardItemModel): if not index.isValid(): return None + if role in (VERSION_STATUS_SHORT_ROLE, VERSION_STATUS_COLOR_ROLE): + status_name = self.data(index, VERSION_STATUS_NAME_ROLE) + status_item = self._last_project_statuses.get(status_name) + if status_item is None: + return "" + if role == VERSION_STATUS_SHORT_ROLE: + return status_item.short + return status_item.color + col = index.column() if col == 0: return super(ProductsModel, self).data(index, role) @@ -168,29 +207,8 @@ class ProductsModel(QtGui.QStandardItemModel): if role == QtCore.Qt.DisplayRole: if not index.data(PRODUCT_ID_ROLE): return None - if col == self.version_col: - role = VERSION_NAME_ROLE - elif col == 1: - role = PRODUCT_TYPE_ROLE - elif col == 2: - role = FOLDER_LABEL_ROLE - elif col == 4: - role = VERSION_PUBLISH_TIME_ROLE - elif col == 5: - role = VERSION_AUTHOR_ROLE - elif col == 6: - role = VERSION_FRAME_RANGE_ROLE - elif col == 7: - role = VERSION_DURATION_ROLE - elif col == 8: - role = VERSION_HANDLES_ROLE - elif col == 9: - role = VERSION_STEP_ROLE - elif col == 10: - role = PRODUCT_IN_SCENE_ROLE - elif col == 11: - role = VERSION_AVAILABLE_ROLE - else: + role = self._display_role_mapping.get(col) + if role is None: return None index = self.index(index.row(), 0, index.parent()) @@ -312,6 +330,7 @@ class ProductsModel(QtGui.QStandardItemModel): version_item.published_time, VERSION_PUBLISH_TIME_ROLE ) model_item.setData(version_item.author, VERSION_AUTHOR_ROLE) + model_item.setData(version_item.status, VERSION_STATUS_NAME_ROLE) model_item.setData(version_item.frame_range, VERSION_FRAME_RANGE_ROLE) model_item.setData(version_item.duration, VERSION_DURATION_ROLE) model_item.setData(version_item.handles, VERSION_HANDLES_ROLE) @@ -393,6 +412,11 @@ class ProductsModel(QtGui.QStandardItemModel): self._last_project_name = project_name self._last_folder_ids = folder_ids + status_items = self._controller.get_project_status_items(project_name) + self._last_project_statuses = { + status_item.name: status_item + for status_item in status_items + } active_site_icon_def = self._controller.get_active_site_icon_def( project_name From 3dfe36702904dd9575d1314410a4c1aaca055bd5 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Thu, 23 May 2024 22:40:33 +0100 Subject: [PATCH 289/469] Change to Render On Farm --- client/ayon_core/hosts/nuke/api/lib.py | 14 ++--- client/ayon_core/hosts/nuke/api/utils.py | 56 ++++++------------- .../nuke/plugins/create/create_write_image.py | 5 +- .../plugins/create/create_write_prerender.py | 6 +- .../plugins/create/create_write_render.py | 5 +- .../plugins/publish/collect_headless_farm.py | 29 +++++----- .../plugins/publish/extract_headless_farm.py | 8 +-- .../publish/increment_script_version.py | 2 +- server_addon/nuke/package.py | 2 +- .../nuke/server/settings/create_plugins.py | 4 +- 10 files changed, 58 insertions(+), 73 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/client/ayon_core/hosts/nuke/api/lib.py index f1a9418111..500a0f9601 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/client/ayon_core/hosts/nuke/api/lib.py @@ -1024,12 +1024,12 @@ def script_name(): return nuke.root().knob("name").value() -def add_button_headless_farm_submission(node): - name = "headlessFarmSubmission" - label = "Headless Farm Submission" +def add_button_render_on_farm(node): + name = "renderOnFarm" + label = "Render On Farm" value = ( - "from ayon_core.hosts.nuke.api.utils import submit_headless_farm;" - "submit_headless_farm(nuke.thisNode())" + "from ayon_core.hosts.nuke.api.utils import submit_render_on_farm;" + "submit_render_on_farm(nuke.thisNode())" ) knob = nuke.PyScript_Knob(name, label, value) knob.clearFlag(nuke.STARTLINE) @@ -1294,8 +1294,8 @@ def create_write_node( GN.addKnob(link) # Adding render farm submission button. - if data.get("headless_farm_submission", False): - add_button_headless_farm_submission(GN) + if data.get("render_on_farm", False): + add_button_render_on_farm(GN) # adding write to read button add_button_write_to_read(GN) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 08e2630cbd..1c9b0b8996 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -1,6 +1,5 @@ import os import re -import traceback import nuke @@ -151,48 +150,19 @@ def is_headless(): return QtWidgets.QApplication.instance() is None -def create_error_report(context): - """Create an error report based on the given pyblish context. - - This function iterates through the results in the context and formats any - errors into a comprehensive error report. - - Args: - context (dict): Pyblish context. - - Returns: - tuple: A tuple containing a boolean indicating success and a string - representing the error message. - """ - - error_message = "" - success = True - for result in context.data["results"]: - if result["success"]: - continue - - success = False - - err = result["error"] - error_message += "\n" - error_message += err.formatted_traceback - - return success, error_message - - -def submit_headless_farm(node): +def submit_render_on_farm(node): # Ensure code is executed in root context. if nuke.root() == nuke.thisNode(): - _submit_headless_farm(node) + _submit_render_on_farm(node) else: # If not in root context, move to the root context and then execute the # code. with nuke.root(): - _submit_headless_farm(node) + _submit_render_on_farm(node) -def _submit_headless_farm(node): - """Headless farm submission +def _submit_render_on_farm(node): + """Render on farm submission This function prepares the context for farm submission, validates it, extracts relevant data, copies the current workfile to a timestamped copy, @@ -217,15 +187,25 @@ def _submit_headless_farm(node): # Used in pyblish plugin to determine which instance to publish. context.data["node_name"] = node.name() # Used in pyblish plugins to determine whether to run or not. - context.data["headless_farm"] = True + context.data["render_on_farm"] = True context = pyblish.util.publish(context) - success, error_report = create_error_report(context) + error_message = "" + success = True + for result in context.data["results"]: + if result["success"]: + continue + + success = False + + err = result["error"] + error_message += "\n" + error_message += err.formatted_traceback if not success: show_message_dialog( - "Collection Errors", error_report, level="critical" + "Publish Errors", error_message, level="critical" ) return diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py index 046b99f6b0..fc2538f23d 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py @@ -66,14 +66,15 @@ class CreateWriteImage(napi.NukeWriteCreator): def create_instance_node(self, product_name, instance_data): settings = self.project_settings["nuke"]["create"]["CreateWriteImage"] - settings = settings["instance_attributes"] # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, "fpath_template": self.temp_rendering_path_template, - "headless_farm_submission": "headless_farm_submission" in settings + "render_on_farm": ( + "render_on_farm" in settings["instance_attributes"] + ) } write_data.update(instance_data) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py index df906c9c25..47796d159c 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py @@ -47,14 +47,16 @@ class CreateWritePrerender(napi.NukeWriteCreator): def create_instance_node(self, product_name, instance_data): settings = self.project_settings["nuke"]["create"] - settings = settings["CreateWritePrerender"]["instance_attributes"] + settings = settings["CreateWritePrerender"] # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, "fpath_template": self.temp_rendering_path_template, - "headless_farm_submission": "headless_farm_submission" in settings + "render_on_farm": ( + "render_on_farm" in settings["instance_attributes"] + ) } write_data.update(instance_data) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py index 5340fbdecc..4cb5ccdfa2 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py +++ b/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py @@ -41,15 +41,14 @@ class CreateWriteRender(napi.NukeWriteCreator): def create_instance_node(self, product_name, instance_data): settings = self.project_settings["nuke"]["create"]["CreateWriteRender"] - instance_attributes = settings["instance_attributes"] # add fpath_template write_data = { "creator": self.__class__.__name__, "productName": product_name, "fpath_template": self.temp_rendering_path_template, - "headless_farm_submission": ( - "headless_farm_submission" in instance_attributes + "render_on_farm": ( + "render_on_farm" in settings["instance_attributes"] ) } diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py index 82b6b2b3e9..3f49a2bf01 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py @@ -5,16 +5,16 @@ from ayon_core.pipeline.publish import ( ) -class CollectHeadlessFarm(pyblish.api.ContextPlugin): - """Setup instances for headless farm submission.""" +class CollectRenderOnFarm(pyblish.api.ContextPlugin): + """Setup instances for render on farm submission.""" # Needs to be after CollectFromCreateContext order = pyblish.api.CollectorOrder - 0.49 - label = "Collect Headless Farm" + label = "Collect Render On Farm" hosts = ["nuke"] def process(self, context): - if not context.data.get("headless_farm", False): + if not context.data.get("render_on_farm", False): return for instance in context: @@ -28,24 +28,27 @@ class CollectHeadlessFarm(pyblish.api.ContextPlugin): instance.data["active"] = False continue - instance.data["families"].append("headless_farm") + instance.data["families"].append("render_on_farm") + + # Enable for farm publishing. + instance.data["farm"] = True + + # Skip workfile version incremental save. + instance.context.data["increment_script_version"] = False -class SetupHeadlessFarm(pyblish.api.InstancePlugin, AYONPyblishPluginMixin): - """Setup instance for headless farm submission.""" +class SetupRenderOnFarm(pyblish.api.InstancePlugin, AYONPyblishPluginMixin): + """Setup instance for render on farm submission.""" order = pyblish.api.CollectorOrder + 0.4999 - label = "Setup Headless Farm" + label = "Setup Render On Farm" hosts = ["nuke"] - families = ["headless_farm"] + families = ["render_on_farm"] def process(self, instance): - # Enable for farm publishing. - instance.data["farm"] = True - # Clear the families as we only want the main family, ei. no review # etc. - instance.data["families"] = ["headless_farm"] + instance.data["families"] = ["render_on_farm"] # Use the workfile instead of published. publish_attributes = instance.data["publish_attributes"] diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py index 003e51aa1a..4ba55f8c46 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py @@ -7,16 +7,16 @@ import pyblish.api from ayon_core.pipeline import registered_host -class ExtractHeadlessFarm(pyblish.api.InstancePlugin): +class ExtractRenderOnFarm(pyblish.api.InstancePlugin): """Copy the workfile to a timestamped copy.""" order = pyblish.api.ExtractorOrder + 0.499 - label = "Extract Headless Farm" + label = "Extract Render On Farm" hosts = ["nuke"] - families = ["headless_farm"] + families = ["render_on_farm"] def process(self, instance): - if not instance.context.data.get("headless_farm", False): + if not instance.context.data.get("render_on_farm", False): return host = registered_host() diff --git a/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py b/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py index f20748b034..70fd04a985 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py +++ b/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py @@ -13,7 +13,7 @@ class IncrementScriptVersion(pyblish.api.ContextPlugin): hosts = ['nuke'] def process(self, context): - if context.data.get("headless_farm", False): + if not context.data.get("increment_script_version", True): return assert all(result["success"] for result in context.data["results"]), ( diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index bc166bd14e..d8decef208 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,3 @@ name = "nuke" title = "Nuke" -version = "0.1.13" +version = "0.1.14" diff --git a/server_addon/nuke/server/settings/create_plugins.py b/server_addon/nuke/server/settings/create_plugins.py index 897a467118..e4a0f9c938 100644 --- a/server_addon/nuke/server/settings/create_plugins.py +++ b/server_addon/nuke/server/settings/create_plugins.py @@ -14,8 +14,8 @@ def instance_attributes_enum(): {"value": "farm_rendering", "label": "Farm rendering"}, {"value": "use_range_limit", "label": "Use range limit"}, { - "value": "headless_farm_submission", - "label": "Headless Farm Submission" + "value": "render_on_farm", + "label": "Render On Farm" } ] From cc5e18149788538c4db76f09aa0fe64dfdf2efa2 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:12:36 +0200 Subject: [PATCH 290/469] remove redundand roles --- .../tools/loader/ui/products_model.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index 76da76dbfb..dedd68abfe 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -25,19 +25,18 @@ VERSION_PUBLISH_TIME_ROLE = QtCore.Qt.UserRole + 14 VERSION_STATUS_NAME_ROLE = QtCore.Qt.UserRole + 15 VERSION_STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 16 VERSION_STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 17 -VERSION_STATUS_ROLE = QtCore.Qt.UserRole + 18 -VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 19 -VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 20 -VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 21 -VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 22 -VERSION_STEP_ROLE = QtCore.Qt.UserRole + 23 -VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 24 -VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 25 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 27 -REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 28 -SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 -SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 30 +VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 18 +VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 19 +VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 20 +VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 21 +VERSION_STEP_ROLE = QtCore.Qt.UserRole + 22 +VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 23 +VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 24 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 25 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 +REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 27 +SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 28 +SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 class ProductsModel(QtGui.QStandardItemModel): From 4a70b7d26eb551b5a08f5e4c577bf5f783571e9f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:13:23 +0200 Subject: [PATCH 291/469] better way how to set delegates --- .../tools/loader/ui/products_widget.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_widget.py b/client/ayon_core/tools/loader/ui/products_widget.py index d9f027153e..9c6a1dbb85 100644 --- a/client/ayon_core/tools/loader/ui/products_widget.py +++ b/client/ayon_core/tools/loader/ui/products_widget.py @@ -128,20 +128,17 @@ class ProductsWidget(QtWidgets.QWidget): products_view.setColumnWidth(idx, width) version_delegate = VersionDelegate() - products_view.setItemDelegateForColumn( - products_model.version_col, version_delegate) - time_delegate = PrettyTimeDelegate() - products_view.setItemDelegateForColumn( - products_model.published_time_col, time_delegate) - in_scene_delegate = LoadedInSceneDelegate() - products_view.setItemDelegateForColumn( - products_model.in_scene_col, in_scene_delegate) - sitesync_delegate = SiteSyncDelegate() - products_view.setItemDelegateForColumn( - products_model.sitesync_avail_col, sitesync_delegate) + + for col, delegate in ( + (products_model.version_col, version_delegate), + (products_model.published_time_col, time_delegate), + (products_model.in_scene_col, in_scene_delegate), + (products_model.sitesync_avail_col, sitesync_delegate), + ): + products_view.setItemDelegateForColumn(col, delegate) main_layout = QtWidgets.QHBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) From 50c26e3b71068be6695c6eb472ef3a5cbee26031 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:13:43 +0200 Subject: [PATCH 292/469] added delegate for status --- .../tools/loader/ui/products_delegates.py | 46 +++++++++++++++++++ .../tools/loader/ui/products_widget.py | 7 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 12ed1165ae..6bcb78ec66 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -6,6 +6,9 @@ from ayon_core.tools.utils.lib import format_version from .products_model import ( PRODUCT_ID_ROLE, VERSION_NAME_EDIT_ROLE, + VERSION_STATUS_NAME_ROLE, + VERSION_STATUS_SHORT_ROLE, + VERSION_STATUS_COLOR_ROLE, VERSION_ID_ROLE, PRODUCT_IN_SCENE_ROLE, ACTIVE_SITE_ICON_ROLE, @@ -194,6 +197,49 @@ class LoadedInSceneDelegate(QtWidgets.QStyledItemDelegate): option.palette.setBrush(QtGui.QPalette.Text, color) +class StatusDelegate(QtWidgets.QStyledItemDelegate): + """Delegate showing status name and short name.""" + + def paint(self, painter, option, index): + if option.widget: + style = option.widget.style() + else: + style = QtWidgets.QApplication.style() + + style.drawControl( + style.CE_ItemViewItem, option, painter, option.widget + ) + + painter.save() + + text_rect = style.subElementRect(style.SE_ItemViewItemText, option) + text_margin = style.proxy().pixelMetric( + style.PM_FocusFrameHMargin, option, option.widget + ) + 1 + padded_text_rect = text_rect.adjusted( + text_margin, 0, - text_margin, 0 + ) + + fm = QtGui.QFontMetrics(option.font) + text = index.data(VERSION_STATUS_NAME_ROLE) + if padded_text_rect.width() < fm.width(text): + text = index.data(VERSION_STATUS_SHORT_ROLE) + + status_color = index.data(VERSION_STATUS_COLOR_ROLE) + fg_color = QtGui.QColor(status_color) + pen = painter.pen() + pen.setColor(fg_color) + painter.setPen(pen) + + painter.drawText( + padded_text_rect, + option.displayAlignment, + text + ) + + painter.restore() + + class SiteSyncDelegate(QtWidgets.QStyledItemDelegate): """Paints icons and downloaded representation ration for both sites.""" diff --git a/client/ayon_core/tools/loader/ui/products_widget.py b/client/ayon_core/tools/loader/ui/products_widget.py index 9c6a1dbb85..3a30d83d52 100644 --- a/client/ayon_core/tools/loader/ui/products_widget.py +++ b/client/ayon_core/tools/loader/ui/products_widget.py @@ -22,7 +22,8 @@ from .products_model import ( from .products_delegates import ( VersionDelegate, LoadedInSceneDelegate, - SiteSyncDelegate + StatusDelegate, + SiteSyncDelegate, ) from .actions_utils import show_actions_menu @@ -89,6 +90,7 @@ class ProductsWidget(QtWidgets.QWidget): 90, # Product type 130, # Folder label 60, # Version + 100, # Status 125, # Time 75, # Author 75, # Frames @@ -129,12 +131,14 @@ class ProductsWidget(QtWidgets.QWidget): version_delegate = VersionDelegate() time_delegate = PrettyTimeDelegate() + status_delegate = StatusDelegate() in_scene_delegate = LoadedInSceneDelegate() sitesync_delegate = SiteSyncDelegate() for col, delegate in ( (products_model.version_col, version_delegate), (products_model.published_time_col, time_delegate), + (products_model.status_col, status_delegate), (products_model.in_scene_col, in_scene_delegate), (products_model.sitesync_avail_col, sitesync_delegate), ): @@ -172,6 +176,7 @@ class ProductsWidget(QtWidgets.QWidget): self._version_delegate = version_delegate self._time_delegate = time_delegate + self._status_delegate = status_delegate self._in_scene_delegate = in_scene_delegate self._sitesync_delegate = sitesync_delegate From 3c032fc764fe5a20cec2f18e4e2ad18c4dcb1542 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:13:54 +0200 Subject: [PATCH 293/469] move status column after version --- client/ayon_core/tools/loader/ui/products_model.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index dedd68abfe..f309473d10 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -47,9 +47,9 @@ class ProductsModel(QtGui.QStandardItemModel): "Product type", "Folder", "Version", + "Status", "Time", "Author", - "Status", "Frames", "Duration", "Handles", @@ -77,9 +77,9 @@ class ProductsModel(QtGui.QStandardItemModel): product_type_col = column_labels.index("Product type") folders_label_col = column_labels.index("Folder") version_col = column_labels.index("Version") + status_col = column_labels.index("Status") published_time_col = column_labels.index("Time") author_col = column_labels.index("Author") - status_col = column_labels.index("Status") frame_range_col = column_labels.index("Frames") duration_col = column_labels.index("Duration") handles_col = column_labels.index("Handles") @@ -91,9 +91,9 @@ class ProductsModel(QtGui.QStandardItemModel): product_type_col: PRODUCT_TYPE_ROLE, folders_label_col: FOLDER_LABEL_ROLE, version_col: VERSION_NAME_ROLE, + status_col: VERSION_STATUS_NAME_ROLE, published_time_col: VERSION_PUBLISH_TIME_ROLE, author_col: VERSION_AUTHOR_ROLE, - status_col: VERSION_STATUS_NAME_ROLE, frame_range_col: VERSION_FRAME_RANGE_ROLE, duration_col: VERSION_DURATION_ROLE, handles_col: VERSION_HANDLES_ROLE, From 7fd8ca81e4b7c8ef38051c00971f3b8f2c2fc29a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:29:09 +0200 Subject: [PATCH 294/469] move traypublisher next to server codebase --- .../traypublisher/client/ayon_traypublisher}/__init__.py | 0 .../traypublisher/client/ayon_traypublisher}/addon.py | 0 .../traypublisher/client/ayon_traypublisher}/api/__init__.py | 0 .../traypublisher/client/ayon_traypublisher}/api/editorial.py | 0 .../traypublisher/client/ayon_traypublisher}/api/pipeline.py | 0 .../traypublisher/client/ayon_traypublisher}/api/plugin.py | 0 .../traypublisher/client/ayon_traypublisher}/batch_parsing.py | 0 .../traypublisher/client/ayon_traypublisher}/csv_publish.py | 0 .../ayon_traypublisher}/plugins/create/create_colorspace_look.py | 0 .../ayon_traypublisher}/plugins/create/create_csv_ingest.py | 0 .../client/ayon_traypublisher}/plugins/create/create_editorial.py | 0 .../plugins/create/create_editorial_package.py | 0 .../ayon_traypublisher}/plugins/create/create_from_settings.py | 0 .../ayon_traypublisher}/plugins/create/create_movie_batch.py | 0 .../client/ayon_traypublisher}/plugins/create/create_online.py | 0 .../ayon_traypublisher}/plugins/publish/collect_app_name.py | 0 .../ayon_traypublisher}/plugins/publish/collect_clip_instances.py | 0 .../plugins/publish/collect_colorspace_look.py | 0 .../plugins/publish/collect_csv_ingest_instance_data.py | 0 .../plugins/publish/collect_editorial_instances.py | 0 .../plugins/publish/collect_editorial_package.py | 0 .../plugins/publish/collect_editorial_reviewable.py | 0 .../plugins/publish/collect_explicit_colorspace.py | 0 .../plugins/publish/collect_frame_data_from_folder_entity.py | 0 .../ayon_traypublisher}/plugins/publish/collect_movie_batch.py | 0 .../ayon_traypublisher}/plugins/publish/collect_online_file.py | 0 .../ayon_traypublisher}/plugins/publish/collect_review_frames.py | 0 .../plugins/publish/collect_sequence_frame_data.py | 0 .../ayon_traypublisher}/plugins/publish/collect_shot_instances.py | 0 .../plugins/publish/collect_simple_instances.py | 0 .../client/ayon_traypublisher}/plugins/publish/collect_source.py | 0 .../plugins/publish/extract_colorspace_look.py | 0 .../ayon_traypublisher}/plugins/publish/extract_csv_file.py | 0 .../ayon_traypublisher}/plugins/publish/extract_editorial_pckg.py | 0 .../plugins/publish/help/validate_existing_version.xml | 0 .../plugins/publish/help/validate_frame_ranges.xml | 0 .../ayon_traypublisher}/plugins/publish/validate_colorspace.py | 0 .../plugins/publish/validate_colorspace_look.py | 0 .../plugins/publish/validate_editorial_package.py | 0 .../plugins/publish/validate_existing_version.py | 0 .../ayon_traypublisher}/plugins/publish/validate_filepaths.py | 0 .../ayon_traypublisher}/plugins/publish/validate_frame_ranges.py | 0 .../ayon_traypublisher}/plugins/publish/validate_online_file.py | 0 43 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/__init__.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/addon.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/api/__init__.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/api/editorial.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/api/pipeline.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/api/plugin.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/batch_parsing.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/csv_publish.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_colorspace_look.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_csv_ingest.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_editorial.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_editorial_package.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_from_settings.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_movie_batch.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/create/create_online.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_app_name.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_clip_instances.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_colorspace_look.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_csv_ingest_instance_data.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_editorial_instances.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_editorial_package.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_editorial_reviewable.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_explicit_colorspace.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_frame_data_from_folder_entity.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_movie_batch.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_online_file.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_review_frames.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_sequence_frame_data.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_shot_instances.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_simple_instances.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/collect_source.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/extract_colorspace_look.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/extract_csv_file.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/extract_editorial_pckg.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/help/validate_existing_version.xml (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/help/validate_frame_ranges.xml (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_colorspace.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_colorspace_look.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_editorial_package.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_existing_version.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_filepaths.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_frame_ranges.py (100%) rename {client/ayon_core/hosts/traypublisher => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/validate_online_file.py (100%) diff --git a/client/ayon_core/hosts/traypublisher/__init__.py b/server_addon/traypublisher/client/ayon_traypublisher/__init__.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/__init__.py rename to server_addon/traypublisher/client/ayon_traypublisher/__init__.py diff --git a/client/ayon_core/hosts/traypublisher/addon.py b/server_addon/traypublisher/client/ayon_traypublisher/addon.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/addon.py rename to server_addon/traypublisher/client/ayon_traypublisher/addon.py diff --git a/client/ayon_core/hosts/traypublisher/api/__init__.py b/server_addon/traypublisher/client/ayon_traypublisher/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/api/__init__.py rename to server_addon/traypublisher/client/ayon_traypublisher/api/__init__.py diff --git a/client/ayon_core/hosts/traypublisher/api/editorial.py b/server_addon/traypublisher/client/ayon_traypublisher/api/editorial.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/api/editorial.py rename to server_addon/traypublisher/client/ayon_traypublisher/api/editorial.py diff --git a/client/ayon_core/hosts/traypublisher/api/pipeline.py b/server_addon/traypublisher/client/ayon_traypublisher/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/api/pipeline.py rename to server_addon/traypublisher/client/ayon_traypublisher/api/pipeline.py diff --git a/client/ayon_core/hosts/traypublisher/api/plugin.py b/server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/api/plugin.py rename to server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py diff --git a/client/ayon_core/hosts/traypublisher/batch_parsing.py b/server_addon/traypublisher/client/ayon_traypublisher/batch_parsing.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/batch_parsing.py rename to server_addon/traypublisher/client/ayon_traypublisher/batch_parsing.py diff --git a/client/ayon_core/hosts/traypublisher/csv_publish.py b/server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/csv_publish.py rename to server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_colorspace_look.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_csv_ingest.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_csv_ingest.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_editorial.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_editorial_package.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_from_settings.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_from_settings.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_movie_batch.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_movie_batch.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/create/create_online.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/create/create_online.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_app_name.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_app_name.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_app_name.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_app_name.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_clip_instances.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_clip_instances.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_clip_instances.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_clip_instances.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_colorspace_look.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_colorspace_look.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_colorspace_look.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_csv_ingest_instance_data.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_csv_ingest_instance_data.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_csv_ingest_instance_data.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_csv_ingest_instance_data.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_instances.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_instances.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_instances.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_instances.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_package.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_reviewable.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_reviewable.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_editorial_reviewable.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_reviewable.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_explicit_colorspace.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_explicit_colorspace.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_explicit_colorspace.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_frame_data_from_folder_entity.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_frame_data_from_folder_entity.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_frame_data_from_folder_entity.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_frame_data_from_folder_entity.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_movie_batch.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_movie_batch.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_movie_batch.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_movie_batch.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_online_file.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_online_file.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_online_file.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_online_file.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_review_frames.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_review_frames.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_review_frames.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_review_frames.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_sequence_frame_data.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_sequence_frame_data.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_sequence_frame_data.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_sequence_frame_data.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_shot_instances.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_shot_instances.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_shot_instances.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_shot_instances.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_simple_instances.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_simple_instances.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_simple_instances.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_simple_instances.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/collect_source.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_source.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/collect_source.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_source.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_colorspace_look.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/extract_colorspace_look.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_colorspace_look.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_csv_file.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_csv_file.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/extract_csv_file.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_csv_file.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/extract_editorial_pckg.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/help/validate_existing_version.xml b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/help/validate_existing_version.xml similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/help/validate_existing_version.xml rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/help/validate_existing_version.xml diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/help/validate_frame_ranges.xml b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/help/validate_frame_ranges.xml similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/help/validate_frame_ranges.xml rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/help/validate_frame_ranges.xml diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_colorspace.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_colorspace.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_colorspace.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_colorspace.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_colorspace_look.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_colorspace_look.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_colorspace_look.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_editorial_package.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_existing_version.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_existing_version.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_existing_version.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_existing_version.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_filepaths.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_filepaths.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_filepaths.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_filepaths.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_frame_ranges.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_frame_ranges.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_frame_ranges.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_frame_ranges.py diff --git a/client/ayon_core/hosts/traypublisher/plugins/publish/validate_online_file.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_online_file.py similarity index 100% rename from client/ayon_core/hosts/traypublisher/plugins/publish/validate_online_file.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_online_file.py From a75af77907f2e53860fe2eb6cf3db3e9ff34f015 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:36:26 +0200 Subject: [PATCH 295/469] fix imports --- .../traypublisher/client/ayon_traypublisher/csv_publish.py | 2 +- .../plugins/create/create_colorspace_look.py | 2 +- .../ayon_traypublisher/plugins/create/create_csv_ingest.py | 4 +--- .../ayon_traypublisher/plugins/create/create_editorial.py | 4 ++-- .../plugins/create/create_editorial_package.py | 2 +- .../ayon_traypublisher/plugins/create/create_from_settings.py | 2 +- .../ayon_traypublisher/plugins/create/create_movie_batch.py | 4 ++-- .../client/ayon_traypublisher/plugins/create/create_online.py | 2 +- 8 files changed, 10 insertions(+), 12 deletions(-) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py b/server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py index 2762172936..b7906c5706 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/csv_publish.py @@ -6,7 +6,7 @@ from ayon_core.lib.attribute_definitions import FileDefItem from ayon_core.pipeline import install_host from ayon_core.pipeline.create import CreateContext -from ayon_core.hosts.traypublisher.api import TrayPublisherHost +from ayon_traypublisher.api import TrayPublisherHost def csvpublish( diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py index da05afe86b..1cf98e8dab 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py @@ -15,7 +15,7 @@ from ayon_core.pipeline import ( CreatorError ) from ayon_core.pipeline import colorspace -from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator +from ayon_traypublisher.api.plugin import TrayPublishCreator class CreateColorspaceLook(TrayPublishCreator): diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py index 8143e8b45b..5a5deeada8 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_csv_ingest.py @@ -13,9 +13,7 @@ from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, IMAGE_EXTENSIONS ) from ayon_core.pipeline.create import CreatorError -from ayon_core.hosts.traypublisher.api.plugin import ( - TrayPublishCreator -) +from ayon_traypublisher.api.plugin import TrayPublishCreator class IngestCSV(TrayPublishCreator): diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py index 4057aee9a6..a2f6f211f5 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial.py @@ -4,11 +4,11 @@ from copy import deepcopy import ayon_api import opentimelineio as otio -from ayon_core.hosts.traypublisher.api.plugin import ( +from ayon_traypublisher.api.plugin import ( TrayPublishCreator, HiddenTrayPublishCreator ) -from ayon_core.hosts.traypublisher.api.editorial import ( +from ayon_traypublisher.api.editorial import ( ShotMetadataSolver ) from ayon_core.pipeline import CreatedInstance diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py index 82b109be28..5f0a84be4a 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py @@ -9,7 +9,7 @@ from ayon_core.lib.attribute_definitions import ( BoolDef, TextDef, ) -from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator +from ayon_traypublisher.api.plugin import TrayPublishCreator class EditorialPackageCreator(TrayPublishCreator): diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py index fe7ba4c4a4..13cf92ab10 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_from_settings.py @@ -6,7 +6,7 @@ log = Logger.get_logger(__name__) def initialize(): - from ayon_core.hosts.traypublisher.api.plugin import SettingsCreator + from ayon_traypublisher.api.plugin import SettingsCreator project_name = os.environ["AYON_PROJECT_NAME"] project_settings = get_project_settings(project_name) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py index 546408b4d6..77b9b0df0a 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_movie_batch.py @@ -17,8 +17,8 @@ from ayon_core.pipeline.create import ( TaskNotSetError, ) -from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator -from ayon_core.hosts.traypublisher.batch_parsing import ( +from ayon_traypublisher.api.plugin import TrayPublishCreator +from ayon_traypublisher.batch_parsing import ( get_folder_entity_from_filename ) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py index f48037701e..a3d34d3d3a 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py @@ -14,7 +14,7 @@ from ayon_core.pipeline import ( CreatedInstance, CreatorError ) -from ayon_core.hosts.traypublisher.api.plugin import TrayPublishCreator +from ayon_traypublisher.api.plugin import TrayPublishCreator class OnlineCreator(TrayPublishCreator): From bf5d99d90421d5fe83bf102e6a4b60aad6423bcd Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:36:39 +0200 Subject: [PATCH 296/469] use ayon naming --- server_addon/traypublisher/client/ayon_traypublisher/addon.py | 4 ++-- .../traypublisher/client/ayon_traypublisher/api/plugin.py | 2 +- .../plugins/create/create_colorspace_look.py | 2 +- .../client/ayon_traypublisher/plugins/create/create_online.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/addon.py b/server_addon/traypublisher/client/ayon_traypublisher/addon.py index 3dd275f223..3e72681e1d 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/addon.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/addon.py @@ -29,8 +29,8 @@ class TrayPublishAddon(AYONAddon, IHostAddon, ITrayAction): def on_action_trigger(self): self.run_traypublisher() - def connect_with_addons(self, enabled_modules): - """Collect publish paths from other modules.""" + def connect_with_addons(self, enabled_addons): + """Collect publish paths from other addons.""" publish_paths = self.manager.collect_plugin_paths()["publish"] self.publish_paths.extend(publish_paths) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py b/server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py index 257d01eb50..973eb65b11 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/api/plugin.py @@ -22,7 +22,7 @@ from .pipeline import ( ) REVIEW_EXTENSIONS = set(IMAGE_EXTENSIONS) | set(VIDEO_EXTENSIONS) -SHARED_DATA_KEY = "openpype.traypublisher.instances" +SHARED_DATA_KEY = "ayon.traypublisher.instances" class HiddenTrayPublishCreator(HiddenCreator): diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py index 1cf98e8dab..901bd758ba 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_colorspace_look.py @@ -21,7 +21,7 @@ from ayon_traypublisher.api.plugin import TrayPublishCreator class CreateColorspaceLook(TrayPublishCreator): """Creates colorspace look files.""" - identifier = "io.openpype.creators.traypublisher.colorspace_look" + identifier = "io.ayon.creators.traypublisher.colorspace_look" label = "Colorspace Look" product_type = "ociolook" description = "Publishes color space look file." diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py index a3d34d3d3a..135a11c0c6 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_online.py @@ -20,7 +20,7 @@ from ayon_traypublisher.api.plugin import TrayPublishCreator class OnlineCreator(TrayPublishCreator): """Creates instance from file and retains its original name.""" - identifier = "io.openpype.creators.traypublisher.online" + identifier = "io.ayon.creators.traypublisher.online" label = "Online" product_type = "online" description = "Publish file retaining its original file name" From e043f1930cba54f257b5bd7660c828ef46911ece Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:37:48 +0200 Subject: [PATCH 297/469] move tool to traypublisher addon --- server_addon/traypublisher/client/ayon_traypublisher/addon.py | 4 ++-- .../traypublisher/client/ayon_traypublisher/ui}/__init__.py | 0 .../traypublisher/client/ayon_traypublisher/ui}/window.py | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename {client/ayon_core/tools/traypublisher => server_addon/traypublisher/client/ayon_traypublisher/ui}/__init__.py (100%) rename {client/ayon_core/tools/traypublisher => server_addon/traypublisher/client/ayon_traypublisher/ui}/window.py (100%) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/addon.py b/server_addon/traypublisher/client/ayon_traypublisher/addon.py index 3e72681e1d..5432cb1a92 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/addon.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/addon.py @@ -55,9 +55,9 @@ def cli_main(): def launch(): """Launch TrayPublish tool UI.""" - from ayon_core.tools import traypublisher + from ayon_traypublisher import ui - traypublisher.main() + ui.main() @cli_main.command() diff --git a/client/ayon_core/tools/traypublisher/__init__.py b/server_addon/traypublisher/client/ayon_traypublisher/ui/__init__.py similarity index 100% rename from client/ayon_core/tools/traypublisher/__init__.py rename to server_addon/traypublisher/client/ayon_traypublisher/ui/__init__.py diff --git a/client/ayon_core/tools/traypublisher/window.py b/server_addon/traypublisher/client/ayon_traypublisher/ui/window.py similarity index 100% rename from client/ayon_core/tools/traypublisher/window.py rename to server_addon/traypublisher/client/ayon_traypublisher/ui/window.py From a4fa52cb422958d500f2b28c50bec1372e30d8bb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:39:17 +0200 Subject: [PATCH 298/469] define milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d49358b0d2..dba25510be 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -52,6 +52,7 @@ IGNORED_MODULES_IN_AYON = set() MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), + "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), } From 5375cabc2b75f9ac045186025e4a8d950fb864b7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:39:25 +0200 Subject: [PATCH 299/469] updated package.py --- server_addon/traypublisher/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/traypublisher/package.py b/server_addon/traypublisher/package.py index c138a2296d..ea04835b45 100644 --- a/server_addon/traypublisher/package.py +++ b/server_addon/traypublisher/package.py @@ -1,3 +1,10 @@ name = "traypublisher" title = "TrayPublisher" -version = "0.1.5" +version = "0.2.0" + +client_dir = "ayon_traypublisher" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 0a1989badc7c3f32fac41a2a1745ab7ea8ebec76 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 10:44:11 +0200 Subject: [PATCH 300/469] move extract trim video audio to traypublisher addon --- .../plugins/publish/extract_trim_video_audio.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core => server_addon/traypublisher/client/ayon_traypublisher}/plugins/publish/extract_trim_video_audio.py (100%) diff --git a/client/ayon_core/plugins/publish/extract_trim_video_audio.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_trim_video_audio.py similarity index 100% rename from client/ayon_core/plugins/publish/extract_trim_video_audio.py rename to server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_trim_video_audio.py From 6d03f7bd87b1e1e76fa3b158f0baf01c945de54f Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 24 May 2024 20:05:17 +0800 Subject: [PATCH 301/469] support to validate the texture maps filtering when no texture map after filtering to export the image instance --- .../plugins/publish/validate_ouput_maps.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 720771994c..b69308abd4 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -25,16 +25,22 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): def process(self, instance): config = instance.data["exportConfig"] - + creator_attrs = instance.data["creator_attributes"] # Substance Painter API does not allow to query the actual output maps # it will generate without actually exporting the files. So we try to # generate the smallest size / fastest export as possible config = copy.deepcopy(config) + if creator_attrs.get("exportChannel", []): + for export_preset in config.get("exportPresets", {}): + if not export_preset.get("maps"): + raise PublishValidationError( + "No Texture Map Exported with texture set:{}.".format( + instance.name) + ) parameters = config["exportParameters"][0]["parameters"] parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) parameters["dithering"] = False # no dithering (faster) - result = substance_painter.export.export_project_textures(config) if result.status != substance_painter.export.ExportStatus.Success: raise PublishValidationError( From add37d28c2513499011c9f90659415d702786889 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 14:10:43 +0200 Subject: [PATCH 302/469] fix import --- .../traypublisher/client/ayon_traypublisher/ui/window.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/ui/window.py b/server_addon/traypublisher/client/ayon_traypublisher/ui/window.py index 4700e20531..288dac8529 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/ui/window.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/ui/window.py @@ -13,7 +13,6 @@ import qtawesome from ayon_core.lib import AYONSettingsRegistry, is_running_from_build from ayon_core.pipeline import install_host -from ayon_core.hosts.traypublisher.api import TrayPublisherHost from ayon_core.tools.publisher.control_qt import QtPublisherController from ayon_core.tools.publisher.window import PublisherWindow from ayon_core.tools.common_models import ProjectsModel @@ -24,6 +23,7 @@ from ayon_core.tools.utils import ( ProjectSortFilterProxy, PROJECT_NAME_ROLE, ) +from ayon_traypublisher.api import TrayPublisherHost class TrayPublisherRegistry(AYONSettingsRegistry): From da4da46c9cd5600f56ded8bf5a3985b488796e83 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 24 May 2024 15:28:02 +0200 Subject: [PATCH 303/469] Blacklisting plugins for workfile version validation and incrementing Refactored render submission process to handle plugins differently, bypassing version validation and incrementing by removing specific plugins from the list. --- client/ayon_core/hosts/nuke/api/utils.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/client/ayon_core/hosts/nuke/api/utils.py index 1c9b0b8996..646bb0ece1 100644 --- a/client/ayon_core/hosts/nuke/api/utils.py +++ b/client/ayon_core/hosts/nuke/api/utils.py @@ -189,7 +189,17 @@ def _submit_render_on_farm(node): # Used in pyblish plugins to determine whether to run or not. context.data["render_on_farm"] = True - context = pyblish.util.publish(context) + # Since we need to bypass version validation and incrementing, we need to + # remove the plugins from the list that are responsible for these tasks. + plugins = pyblish.api.discover() + blacklist = ["IncrementScriptVersion", "ValidateVersion"] + plugins = [ + plugin + for plugin in plugins + if plugin.__name__ not in blacklist + ] + + context = pyblish.util.publish(context, plugins=plugins) error_message = "" success = True From a47c329273bff64b0761e1cb6b2aaae1ead8ad6c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 24 May 2024 16:35:40 +0300 Subject: [PATCH 304/469] fix imports order --- .../houdini/client/ayon_houdini/api/plugin.py | 3 ++- .../client/ayon_houdini/plugins/load/load_camera.py | 4 ++-- .../ayon_houdini/plugins/load/load_filepath.py | 2 +- .../client/ayon_houdini/plugins/load/load_image.py | 3 +-- .../ayon_houdini/plugins/load/load_redshift_proxy.py | 7 ++++--- .../plugins/publish/collect_active_state.py | 3 ++- .../plugins/publish/collect_arnold_rop.py | 4 +++- .../plugins/publish/collect_asset_handles.py | 1 - .../plugins/publish/collect_cache_farm.py | 8 +++++--- .../ayon_houdini/plugins/publish/collect_inputs.py | 2 +- .../plugins/publish/collect_instances_usd_layered.py | 2 +- .../plugins/publish/collect_output_node.py | 2 +- .../plugins/publish/collect_remote_publish.py | 2 +- .../plugins/publish/collect_usd_bootstrap.py | 2 +- .../plugins/publish/collect_usd_layers.py | 4 +--- .../plugins/publish/collect_workscene_fps.py | 4 ++-- .../plugins/publish/extract_active_view_thumbnail.py | 2 +- .../ayon_houdini/plugins/publish/extract_alembic.py | 3 +-- .../ayon_houdini/plugins/publish/extract_ass.py | 3 +-- .../ayon_houdini/plugins/publish/extract_bgeo.py | 6 ++---- .../plugins/publish/extract_composite.py | 3 +-- .../ayon_houdini/plugins/publish/extract_fbx.py | 3 +-- .../ayon_houdini/plugins/publish/extract_hda.py | 2 +- .../plugins/publish/extract_mantra_ifd.py | 3 +-- .../ayon_houdini/plugins/publish/extract_opengl.py | 3 +-- .../plugins/publish/extract_redshift_proxy.py | 3 +-- .../ayon_houdini/plugins/publish/extract_render.py | 5 +++-- .../ayon_houdini/plugins/publish/extract_usd.py | 3 +-- .../plugins/publish/extract_vdb_cache.py | 3 +-- .../plugins/publish/increment_current_file.py | 9 ++++++--- .../ayon_houdini/plugins/publish/save_scene.py | 3 ++- .../publish/validate_abc_primitive_to_detail.py | 7 ++++--- .../plugins/publish/validate_alembic_face_sets.py | 3 ++- .../plugins/publish/validate_alembic_input_node.py | 7 ++++--- .../plugins/publish/validate_animation_settings.py | 9 +++++---- .../ayon_houdini/plugins/publish/validate_bypass.py | 6 ++++-- .../plugins/publish/validate_camera_rop.py | 3 ++- .../plugins/publish/validate_cop_output_node.py | 4 +++- .../plugins/publish/validate_file_extension.py | 6 +++--- .../plugins/publish/validate_frame_range.py | 5 ++++- .../plugins/publish/validate_frame_token.py | 3 ++- .../publish/validate_houdini_license_category.py | 8 +++++--- .../plugins/publish/validate_instance_in_context.py | 6 +++--- .../plugins/publish/validate_mkpaths_toggled.py | 4 +++- .../plugins/publish/validate_no_errors.py | 6 ++++-- .../publish/validate_primitive_hierarchy_paths.py | 4 ++-- .../plugins/publish/validate_remote_publish.py | 6 +++--- .../publish/validate_remote_publish_enabled.py | 7 ++++--- .../plugins/publish/validate_review_colorspace.py | 7 ++++--- .../plugins/publish/validate_scene_review.py | 8 +++++--- .../plugins/publish/validate_sop_output_node.py | 4 ++-- .../plugins/publish/validate_subset_name.py | 5 +++-- .../publish/validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_usd_layer_path_backslashes.py | 7 ++++--- .../plugins/publish/validate_usd_model_and_shade.py | 12 ++++++------ .../plugins/publish/validate_usd_output_node.py | 4 +++- .../publish/validate_usd_render_product_names.py | 4 +++- .../plugins/publish/validate_usd_setdress.py | 5 +++-- .../publish/validate_usd_shade_model_exists.py | 4 ++-- .../plugins/publish/validate_usd_shade_workspace.py | 5 +++-- .../plugins/publish/validate_vdb_output_node.py | 4 ++-- .../plugins/publish/validate_workfile_paths.py | 6 ++++-- 62 files changed, 155 insertions(+), 125 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index a5557455bc..05a948984b 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -7,6 +7,7 @@ from abc import ( import six import hou +import pyblish.api from ayon_core.pipeline import ( CreatorError, LegacyCreator, @@ -17,8 +18,8 @@ from ayon_core.pipeline import ( load ) from ayon_core.lib import BoolDef + from .lib import imprint, read, lsattr, add_self_publish_button -import pyblish.api SETTINGS_CATEGORY = "houdini" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py index a9e50fe0a4..b597519813 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_camera.py @@ -1,4 +1,6 @@ +import hou from ayon_core.pipeline import get_representation_path + from ayon_houdini.api import ( pipeline, plugin @@ -8,8 +10,6 @@ from ayon_houdini.api.lib import ( get_camera_from_container ) -import hou - ARCHIVE_EXPRESSION = ('__import__("_alembic_hom_extensions")' '.alembicGetCameraDict') diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py index a5d2f661bf..2ce9bd7ffb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_filepath.py @@ -1,11 +1,11 @@ import os import re +import hou from ayon_houdini.api import ( pipeline, plugin ) -import hou class FilePathLoader(plugin.HoudiniLoader): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py index 8fc1dc4b98..9d4cd2fb18 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_image.py @@ -1,5 +1,6 @@ import os import re +import hou from ayon_core.pipeline import ( get_representation_path, @@ -11,8 +12,6 @@ from ayon_houdini.api import ( lib ) -import hou - def get_image_avalon_container(): """The COP2 files must be in a COP2 network. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py index 583af6151d..514dbe109f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/load/load_redshift_proxy.py @@ -1,13 +1,14 @@ import os import re +import hou + from ayon_core.pipeline import get_representation_path +from ayon_core.pipeline.load import LoadError + from ayon_houdini.api import ( pipeline, plugin ) -from ayon_core.pipeline.load import LoadError - -import hou class RedshiftProxyLoader(plugin.HoudiniLoader): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py index f0c8964af5..73c11368b4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py @@ -1,6 +1,7 @@ +import hou + import pyblish.api from ayon_houdini.api import plugin -import hou class CollectInstanceActiveState(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py index c88f5d878f..0682ce8b9b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py @@ -6,7 +6,9 @@ import pyblish.api from ayon_houdini.api import colorspace, plugin from ayon_houdini.api.lib import ( - evalParmNoFrame, get_color_management_preferences) + get_color_management_preferences, + evalParmNoFrame +) class CollectArnoldROPRenderProducts(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py index b3a13ea290..4bb3228c54 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- """Collector plugin for frames data on ROP instances.""" -import hou # noqa import pyblish.api from ayon_core.lib import BoolDef from ayon_core.pipeline import AYONPyblishPluginMixin diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py index 8925800545..9c41e68362 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py @@ -1,8 +1,10 @@ import os -import pyblish.api import hou -from ayon_houdini.api import lib -from ayon_houdini.api import plugin +import pyblish.api +from ayon_houdini.api import ( + lib, + plugin +) class CollectDataforCache(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py index eb7d196d7f..6a815f8d08 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py @@ -1,8 +1,8 @@ from collections import deque import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import registered_host +from ayon_houdini.api import plugin def get_container_members(container): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py index dc344c15fb..ca94c50372 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py @@ -1,8 +1,8 @@ import hou import pyblish.api +from ayon_core.pipeline import usdlib from ayon_houdini.api import lib, plugin import ayon_houdini.api.usd as hou_usdlib -from ayon_core.pipeline import usdlib class CollectInstancesUsdLayered(plugin.HoudiniContextPlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py index 29522724a6..a1f0e261d0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline.publish import KnownPublishError +from ayon_houdini.api import plugin class CollectOutputSOPPath(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py index b23c8f588a..b1b77aceb9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py @@ -1,6 +1,6 @@ +import hou import pyblish.api -import hou from ayon_core.pipeline.publish import RepairAction from ayon_houdini.api import lib, plugin diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py index e6da8f665e..e180cc1899 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py @@ -1,8 +1,8 @@ import pyblish.api import ayon_api -from ayon_houdini.api import plugin from ayon_core.pipeline import usdlib, KnownPublishError +from ayon_houdini.api import plugin class CollectUsdBootstrap(plugin.HoudiniInstancePlugin): """Collect special Asset/Shot bootstrap instances if those are needed. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py index 38ca0e5764..f8ed0b0931 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py @@ -1,11 +1,9 @@ import os - +import hou import pyblish.api from ayon_houdini.api import plugin import ayon_houdini.api.usd as usdlib -import hou - class CollectUsdLayers(plugin.HoudiniInstancePlugin): """Collect the USD Layers that have configured save paths.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py index 91ad0836bd..7274523f66 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py @@ -1,6 +1,6 @@ -from ayon_houdini.api import plugin -import pyblish.api import hou +import pyblish.api +from ayon_houdini.api import plugin class CollectWorksceneFPS(plugin.HoudiniContextPlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index d126911f79..36f20b6e48 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -1,5 +1,5 @@ -import pyblish.api import tempfile +import pyblish.api from ayon_houdini.api import lib, plugin from ayon_houdini.api.pipeline import IS_HEADLESS diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py index 0e658ec963..702c0f9687 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py @@ -1,12 +1,11 @@ import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractAlembic(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py index a2e574483d..bceafde75f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py @@ -1,12 +1,11 @@ import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractAss(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py index f3a3af6556..221b073bf0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py @@ -1,12 +1,10 @@ import os +import hou import pyblish.api -from ayon_houdini.api.lib import render_rop from ayon_houdini.api import lib, plugin -import hou - class ExtractBGEO(plugin.HoudiniInstancePlugin): @@ -31,7 +29,7 @@ class ExtractBGEO(plugin.HoudiniInstancePlugin): file_name, staging_dir)) # write files - render_rop(ropnode) + lib.render_rop(ropnode) output = instance.data["frames"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py index b7061c6bcb..4059367914 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py @@ -1,12 +1,11 @@ import os +import hou import pyblish.api from ayon_core.pipeline import publish from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop, splitext -import hou - class ExtractComposite(plugin.HoudiniInstancePlugin, publish.ColormanagedPyblishPluginMixin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py index 638c3c82d2..9f5cbc5fc2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py @@ -2,12 +2,11 @@ """Fbx Extractor for houdini. """ import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractFBX(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py index 3931edbb9e..8f83d26930 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import os from pprint import pformat +import hou import pyblish.api from ayon_houdini.api import plugin -import hou class ExtractHDA(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py index 40dcc3e426..29e1a1a93b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py @@ -1,11 +1,10 @@ import os +import hou import pyblish.api from ayon_houdini.api import plugin -import hou - class ExtractMantraIFD(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py index c667ca3ca2..c08f9875c5 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py @@ -1,4 +1,5 @@ import os +import hou import pyblish.api @@ -6,8 +7,6 @@ from ayon_core.pipeline import publish from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractOpenGL(plugin.HoudiniInstancePlugin, publish.ColormanagedPyblishPluginMixin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py index b445fdadb3..b425ed52ac 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py @@ -1,12 +1,11 @@ import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractRedshiftProxy(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 6c5c0dbe00..91ad77c144 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -1,9 +1,10 @@ +import os +import hou + import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou -import os class ExtractRender(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py index 74e89614a0..321bdcb12e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py @@ -1,12 +1,11 @@ - import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou class ExtractUSD(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py index 148992001c..7275229422 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py @@ -1,12 +1,11 @@ import os +import hou import pyblish.api from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -import hou - class ExtractVDBCache(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py index f858c11830..57acf5b3af 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py @@ -1,10 +1,13 @@ import pyblish.api -from ayon_houdini.api import plugin from ayon_core.lib import version_up from ayon_core.pipeline import registered_host -from ayon_core.pipeline.publish import get_errored_plugins_from_context -from ayon_core.pipeline.publish import KnownPublishError +from ayon_core.pipeline.publish import ( + get_errored_plugins_from_context, + KnownPublishError +) + +from ayon_houdini.api import plugin class IncrementCurrentFile(plugin.HoudiniContextPlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py index 43e9b95068..f675952bfb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py @@ -1,8 +1,9 @@ import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import registered_host +from ayon_houdini.api import plugin + class SaveCurrentScene(plugin.HoudiniContextPlugin): """Save current scene""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py index a6b6530b78..f9b0496c6f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_houdini.api import plugin - from collections import defaultdict + +import pyblish.api from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateAbcPrimitiveToDetail(plugin.HoudiniInstancePlugin): """Validate Alembic ROP Primitive to Detail attribute is consistent. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py index fa456ea395..13365ecfd6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- +import hou import pyblish.api from ayon_houdini.api import plugin -import hou + class ValidateAlembicROPFaceSets(plugin.HoudiniInstancePlugin): """Validate Face Sets are disabled for extraction to pointcache. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py index 967b82d573..38ead0f9f0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_houdini.api import plugin -from ayon_core.pipeline import PublishValidationError import hou +import pyblish.api +from ayon_core.pipeline import PublishValidationError + +from ayon_houdini.api import plugin class ValidateAlembicInputNode(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py index e0c87f4962..1cc9e24dc9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_animation_settings.py @@ -1,9 +1,10 @@ -import pyblish.api - -from ayon_core.pipeline.publish import PublishValidationError -from ayon_houdini.api import lib, plugin import hou +import pyblish.api +from ayon_core.pipeline.publish import PublishValidationError + +from ayon_houdini.api import lib, plugin + class ValidateAnimationSettings(plugin.HoudiniInstancePlugin): """Validate if the unexpanded string contains the frame ('$F') token diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py index 0be7a15cbc..4a044bc9ad 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- +import hou + import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -import hou +from ayon_houdini.api import plugin + class ValidateBypassed(plugin.HoudiniInstancePlugin): """Validate all primitives build hierarchy from attribute when enabled. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py index daa0f659f1..f9e6b036b8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- """Validator plugin for Houdini Camera ROP settings.""" import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateCameraROP(plugin.HoudiniInstancePlugin): """Validate Camera ROP settings.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py index 9ed326e153..c593a96b9d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import hou + import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateCopOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance COP Output Node. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py index 0b9fa1fe9f..cb8e0952bc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import os -import pyblish.api +import hou -from ayon_houdini.api import lib, plugin +import pyblish.api from ayon_core.pipeline import PublishValidationError -import hou +from ayon_houdini.api import lib, plugin class ValidateFileExtension(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py index 31a0ecd2de..f543497407 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py @@ -1,10 +1,13 @@ # -*- coding: utf-8 -*- +import hou + import pyblish.api from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline.publish import RepairAction + from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api import plugin -import hou + class DisableUseFolderHandlesAction(RepairAction): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py index 135062ff18..46c02ba6f2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_token.py @@ -1,7 +1,8 @@ +import hou + import pyblish.api from ayon_houdini.api import lib, plugin -import hou class ValidateFrameToken(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py index b442dd1bc6..a96fdba452 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_houdini.api import plugin -from ayon_core.pipeline import PublishValidationError import hou +import pyblish.api +from ayon_core.pipeline import PublishValidationError + +from ayon_houdini.api import plugin + class ValidateHoudiniNotApprenticeLicense(plugin.HoudiniInstancePlugin): """Validate the Houdini instance runs a non Apprentice license. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py index 0272765c47..5dbd45f1dc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py @@ -1,8 +1,5 @@ # -*- coding: utf-8 -*- """Validate if instance asset is the same as context asset.""" - -from ayon_houdini.api import plugin -from ayon_houdini.api.action import SelectROPAction from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -10,6 +7,9 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin ) +from ayon_houdini.api import plugin +from ayon_houdini.api.action import SelectROPAction + class ValidateInstanceInContextHoudini(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py index 141b19db6d..b4ba70c1e1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_houdini.api import plugin + from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateIntermediateDirectoriesChecked(plugin.HoudiniInstancePlugin): """Validate Create Intermediate Directories is enabled on ROP node.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py index 4ad5a70930..5f4222b3e8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- -import pyblish.api import hou -from ayon_houdini.api import plugin + +import pyblish.api from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + def cook_in_range(node, start, end): current = hou.intFrame() diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py index 47e1c8b4ac..1e068193fc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import hou + from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline.publish import ( @@ -6,8 +8,6 @@ from ayon_core.pipeline.publish import ( RepairAction, ) -import hou - class AddDefaultPathAction(RepairAction): label = "Add a default path attribute" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py index e254c4cc2f..7332765fe2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py @@ -1,11 +1,11 @@ # -*-coding: utf-8 -*- -import pyblish.api +import hou -from ayon_houdini.api import lib, plugin +import pyblish.api from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline import PublishValidationError -import hou +from ayon_houdini.api import lib, plugin class ValidateRemotePublishOutNode(plugin.HoudiniContextPlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py index f47f1e46e3..1c36ba6ee9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py @@ -1,11 +1,12 @@ # -*- coding: utf-8 -*- -import pyblish.api - import hou -from ayon_houdini.api import plugin + +import pyblish.api from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateRemotePublishEnabled(plugin.HoudiniContextPlugin): """Validate the remote publish node is *not* bypassed.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py index a5d39378d2..96c8d1d73a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py @@ -1,4 +1,7 @@ # -*- coding: utf-8 -*- +import os +import hou + import pyblish.api from ayon_core.pipeline import ( PublishValidationError, @@ -9,12 +12,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, apply_plugin_settings_automatically ) + from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectROPAction -import os -import hou - class ResetViewSpaceAction(RepairAction): label = "Reset OCIO colorspace parm" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py index a1ce0978e7..c923a2d33c 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_houdini.api import plugin -from ayon_core.pipeline import PublishValidationError import hou +import pyblish.api +from ayon_core.pipeline import PublishValidationError + +from ayon_houdini.api import plugin + class ValidateSceneReview(plugin.HoudiniInstancePlugin): """Validator Some Scene Settings before publishing the review diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py index ddd97682bb..511d49aae7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +import hou + import pyblish.api from ayon_core.pipeline import PublishValidationError @@ -8,8 +10,6 @@ from ayon_houdini.api.action import ( SelectROPAction, ) -import hou - class ValidateSopOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance SOP Output Node. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py index ace888f6f6..0f046d8bfc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- """Validator for correct naming of Static Meshes.""" +import hou + from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin @@ -8,12 +10,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, ) + from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction from ayon_core.pipeline.create import get_product_name -import hou - class FixProductNameAction(RepairAction): label = "Fix Product Name" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py index 5cae07d708..d400b513bc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py @@ -1,5 +1,7 @@ # -*- coding: utf-8 -*- """Validator for correct naming of Static Meshes.""" +import hou + from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin @@ -10,8 +12,6 @@ from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.lib import get_output_children -import hou - class ValidateUnrealStaticMeshName(plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py index 4ad977c8cc..a55188d43a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- +import hou + import pyblish.api -from ayon_houdini.api import plugin -import ayon_houdini.api.usd as hou_usdlib from ayon_core.pipeline import PublishValidationError -import hou +from ayon_houdini.api import plugin +import ayon_houdini.api.usd as hou_usdlib class ValidateUSDLayerPathBackslashes(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py index c37f278c7e..7af3427aee 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_houdini.api import plugin -import ayon_houdini.api.usd as hou_usdlib -from ayon_core.pipeline import PublishValidationError - +import hou from pxr import UsdShade, UsdRender, UsdLux -import hou +import pyblish.api +from ayon_core.pipeline import PublishValidationError + +from ayon_houdini.api import plugin +import ayon_houdini.api.usd as hou_usdlib def fullname(o): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py index bede13a3ca..f35a4b56bc 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py @@ -1,8 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_houdini.api import plugin + from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateUSDOutputNode(plugin.HoudiniInstancePlugin): """Validate the instance USD LOPs Output Node. diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py index 5f7d77de86..6b19ba9264 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import os + import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError +from ayon_houdini.api import plugin + class ValidateUSDRenderProductNames(plugin.HoudiniInstancePlugin): """Validate USD Render Product names are correctly set absolute paths.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py index 9cc5ab8b38..f0fbf0f6ba 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_core.pipeline import PublishValidationError + from ayon_houdini.api import plugin import ayon_houdini.api.usd as hou_usdlib -from ayon_core.pipeline import PublishValidationError class ValidateUsdSetDress(plugin.HoudiniInstancePlugin): @@ -21,8 +22,8 @@ class ValidateUsdSetDress(plugin.HoudiniInstancePlugin): def process(self, instance): - from pxr import UsdGeom import hou + from pxr import UsdGeom rop = hou.node(instance.data.get("instance_node")) lop_path = hou_usdlib.get_usd_rop_loppath(rop) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py index e56ed6cf89..48493616d7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py @@ -2,14 +2,14 @@ import re import ayon_api -from ayon_houdini.api import plugin - from ayon_core.pipeline.publish import ( ValidateContentsOrder, KnownPublishError, PublishValidationError, ) +from ayon_houdini.api import plugin + class ValidateUSDShadeModelExists(plugin.HoudiniInstancePlugin): """Validate the Instance has no current cooking errors.""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py index f33fde1ae8..20be856ba4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- +import hou + import pyblish.api -from ayon_houdini.api import plugin from ayon_core.pipeline import PublishValidationError -import hou +from ayon_houdini.api import plugin class ValidateUsdShadeWorkspace(plugin.HoudiniInstancePlugin): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py index c570285cb7..538ac1c281 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import contextlib - -import pyblish.api import hou +import pyblish.api from ayon_core.pipeline import PublishXmlValidationError + from ayon_houdini.api import plugin from ayon_houdini.api.action import SelectInvalidAction diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py index 232ae4782a..efc581b5bd 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- -import pyblish.api import hou -from ayon_houdini.api import plugin + +import pyblish.api from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin ) from ayon_core.pipeline.publish import RepairAction +from ayon_houdini.api import plugin + class ValidateWorkfilePaths( plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin): From fb2e41c9d8be87cc87127fcd3105137655d9d01c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 24 May 2024 21:46:27 +0800 Subject: [PATCH 305/469] support to validate multiple export channel filtering --- .../plugins/publish/validate_ouput_maps.py | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index b69308abd4..9ea3be8c31 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -30,13 +30,27 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): # it will generate without actually exporting the files. So we try to # generate the smallest size / fastest export as possible config = copy.deepcopy(config) - if creator_attrs.get("exportChannel", []): - for export_preset in config.get("exportPresets", {}): - if not export_preset.get("maps"): - raise PublishValidationError( - "No Texture Map Exported with texture set:{}.".format( - instance.name) - ) + export_channel = creator_attrs.get("exportChannel", []) + tmp_export_channel = copy.deepcopy(export_channel) + if export_channel: + for export_preset in config.get("exportPresets", {}): + if not export_preset.get("maps", {}): + raise PublishValidationError( + "No Texture Map Exported with texture set:{}.".format( + instance.name) + ) + map_names = [channel_map["fileName"] for channel_map + in export_preset["maps"]] + for channel in tmp_export_channel: + for map_name in map_names: + if channel in map_name: + tmp_export_channel.remove(channel) + if tmp_export_channel: + raise PublishValidationError( + "No Channel(s) {} found in the texture set:{}".format( + tmp_export_channel, instance.name + )) + parameters = config["exportParameters"][0]["parameters"] parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) From 158e9b75536af222632571d40758e8cdc43851c0 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 24 May 2024 16:19:50 +0200 Subject: [PATCH 306/469] Publish representation with `isIntermediate` flag in data - Adjusted method parameters in ExporterReview class for better readability. - Added colorspace parameter to get_representation_data method. - Included representation data with isIntermediate flag for identifying intermediate files. --- client/ayon_core/hosts/nuke/api/plugin.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/hosts/nuke/api/plugin.py b/client/ayon_core/hosts/nuke/api/plugin.py index ec13104d4d..ffe0cf2a2c 100644 --- a/client/ayon_core/hosts/nuke/api/plugin.py +++ b/client/ayon_core/hosts/nuke/api/plugin.py @@ -572,8 +572,11 @@ class ExporterReview(object): self.fhead = self.fhead.replace("#", "")[:-1] def get_representation_data( - self, tags=None, range=False, - custom_tags=None, colorspace=None + self, + tags=None, + range=False, + custom_tags=None, + colorspace=None, ): """ Add representation data to self.data @@ -584,6 +587,8 @@ class ExporterReview(object): Defaults to False. custom_tags (list[str], optional): user inputted custom tags. Defaults to None. + colorspace (str, optional): colorspace name. + Defaults to None. """ add_tags = tags or [] repre = { @@ -591,7 +596,13 @@ class ExporterReview(object): "ext": self.ext, "files": self.file, "stagingDir": self.staging_dir, - "tags": [self.name.replace("_", "-")] + add_tags + "tags": [self.name.replace("_", "-")] + add_tags, + "data": { + # making sure that once intermediate file is published + # as representation, we will be able to then identify it + # from representation.data.isIntermediate + "isIntermediate": True + }, } if custom_tags: @@ -999,7 +1010,7 @@ class ExporterReviewMov(ExporterReview): tags=tags + add_tags, custom_tags=add_custom_tags, range=True, - colorspace=colorspace + colorspace=colorspace, ) self.log.debug("Representation... `{}`".format(self.data)) From bd3be3695476e41bfec6fc4221d26f7f944f2e90 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 24 May 2024 22:25:32 +0800 Subject: [PATCH 307/469] edit error message --- .../substancepainter/plugins/publish/validate_ouput_maps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 9ea3be8c31..143acee3f5 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -47,7 +47,7 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): tmp_export_channel.remove(channel) if tmp_export_channel: raise PublishValidationError( - "No Channel(s) {} found in the texture set:{}".format( + "No Channel(s){} found in the texture set:{}".format( tmp_export_channel, instance.name )) From 339eea017e4f0699d3480194e906df9ba4a577de Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Fri, 24 May 2024 23:16:32 +0800 Subject: [PATCH 308/469] improve the validation on invalid channel function --- .../plugins/publish/validate_ouput_maps.py | 69 +++++++++++++------ 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 143acee3f5..31201e6c3b 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -25,32 +25,17 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): def process(self, instance): config = instance.data["exportConfig"] - creator_attrs = instance.data["creator_attributes"] + # Substance Painter API does not allow to query the actual output maps # it will generate without actually exporting the files. So we try to # generate the smallest size / fastest export as possible config = copy.deepcopy(config) - export_channel = creator_attrs.get("exportChannel", []) - tmp_export_channel = copy.deepcopy(export_channel) - if export_channel: - for export_preset in config.get("exportPresets", {}): - if not export_preset.get("maps", {}): - raise PublishValidationError( - "No Texture Map Exported with texture set:{}.".format( - instance.name) - ) - map_names = [channel_map["fileName"] for channel_map - in export_preset["maps"]] - for channel in tmp_export_channel: - for map_name in map_names: - if channel in map_name: - tmp_export_channel.remove(channel) - if tmp_export_channel: - raise PublishValidationError( - "No Channel(s){} found in the texture set:{}".format( - tmp_export_channel, instance.name - )) - + invalid_channels = self.get_invalid_channels(instance, config) + if invalid_channels: + raise PublishValidationError( + "No Channel(s){} found in the texture set:{}".format( + invalid_channels, instance.name + )) parameters = config["exportParameters"][0]["parameters"] parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) @@ -128,3 +113,43 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): message=message, title="Missing output maps" ) + + + def get_invalid_channels(self, instance, config): + """Function to get invalid channel(s) from export channel + filtering + + Args: + instance (pyblish.api.Instance): Instance + config (dict): export config + + Raises: + PublishValidationError: raise Publish Validation + Error if any invalid channel(s) found + + Returns: + list: invalid channel(s) + """ + creator_attrs = instance.data["creator_attributes"] + export_channel = creator_attrs.get("exportChannel", []) + tmp_export_channel = copy.deepcopy(export_channel) + invalid_channel = [] + if export_channel: + for export_preset in config.get("exportPresets", {}): + if not export_preset.get("maps", {}): + raise PublishValidationError( + "No Texture Map Exported with texture set:{}.".format( + instance.name) + ) + map_names = [channel_map["fileName"] for channel_map + in export_preset["maps"]] + for channel in tmp_export_channel: + found = False + for map_name in map_names: + if channel in map_name: + found = True + break # Exit the inner loop once a match is found + if not found: + invalid_channel.append(channel) + + return invalid_channel From 86581bdd44ff02cbfe720a65d71a4da4f952beaf Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 17:47:06 +0200 Subject: [PATCH 309/469] add created by information to items --- client/ayon_core/tools/workfiles/abstract.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/workfiles/abstract.py b/client/ayon_core/tools/workfiles/abstract.py index c9eb9004e3..b45c643d97 100644 --- a/client/ayon_core/tools/workfiles/abstract.py +++ b/client/ayon_core/tools/workfiles/abstract.py @@ -13,8 +13,9 @@ class WorkfileInfo: task_id (str): Task id. filepath (str): Filepath. filesize (int): File size. - creation_time (int): Creation time (timestamp). - modification_time (int): Modification time (timestamp). + creation_time (float): Creation time (timestamp). + modification_time (float): Modification time (timestamp). + created_by (Union[str, none]): User who created the file. note (str): Note. """ @@ -26,6 +27,7 @@ class WorkfileInfo: filesize, creation_time, modification_time, + created_by, note, ): self.folder_id = folder_id @@ -34,6 +36,7 @@ class WorkfileInfo: self.filesize = filesize self.creation_time = creation_time self.modification_time = modification_time + self.created_by = created_by self.note = note def to_data(self): @@ -50,6 +53,7 @@ class WorkfileInfo: "filesize": self.filesize, "creation_time": self.creation_time, "modification_time": self.modification_time, + "created_by": self.created_by, "note": self.note, } @@ -212,6 +216,7 @@ class FileItem: dirpath (str): Directory path of file. filename (str): Filename. modified (float): Modified timestamp. + created_by (Optional[str]): Username. representation_id (Optional[str]): Representation id of published workfile. filepath (Optional[str]): Prepared filepath. @@ -223,6 +228,7 @@ class FileItem: dirpath, filename, modified, + created_by=None, representation_id=None, filepath=None, exists=None @@ -230,6 +236,7 @@ class FileItem: self.filename = filename self.dirpath = dirpath self.modified = modified + self.created_by = created_by self.representation_id = representation_id self._filepath = filepath self._exists = exists @@ -269,6 +276,7 @@ class FileItem: "filename": self.filename, "dirpath": self.dirpath, "modified": self.modified, + "created_by": self.created_by, "representation_id": self.representation_id, "filepath": self.filepath, "exists": self.exists, From 70298b878d51a11cf13b1e7f635c67d4ef300af3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 17:50:50 +0200 Subject: [PATCH 310/469] fill created by information --- .../tools/workfiles/models/workfiles.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 5f59b99b22..40b56ed99c 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -188,10 +188,16 @@ class WorkareaModel: if ext not in self._extensions: continue - modified = os.path.getmtime(filepath) - items.append( - FileItem(workdir, filename, modified) + workfile_info = self._controller.get_workfile_info( + folder_id, task_id, filepath ) + modified = os.path.getmtime(filepath) + items.append(FileItem( + workdir, + filename, + modified, + workfile_info.created_by + )) return items def _get_template_key(self, fill_data): @@ -459,8 +465,10 @@ class WorkfileEntitiesModel: self, folder_id, task_id, workfile_info, filepath ): note = "" + created_by = None if workfile_info: note = workfile_info["attrib"].get("description") or "" + created_by = workfile_info.get("createdBy") filestat = os.stat(filepath) return WorkfileInfo( @@ -470,6 +478,7 @@ class WorkfileEntitiesModel: filesize=filestat.st_size, creation_time=filestat.st_ctime, modification_time=filestat.st_mtime, + created_by=created_by, note=note ) @@ -481,7 +490,7 @@ class WorkfileEntitiesModel: for workfile_info in ayon_api.get_workfiles_info( self._controller.get_current_project_name(), task_ids=[task_id], - fields=["id", "path", "attrib"], + fields=["id", "path", "attrib", "createdBy"], ): workfile_identifier = self._get_workfile_info_identifier( folder_id, task_id, workfile_info["path"] @@ -599,7 +608,7 @@ class PublishWorkfilesModel: return self._cached_repre_extensions def _file_item_from_representation( - self, repre_entity, project_anatomy, task_name=None + self, repre_entity, project_anatomy, author, task_name=None ): if task_name is not None: task_info = repre_entity["context"].get("task") @@ -634,6 +643,7 @@ class PublishWorkfilesModel: dirpath, filename, created_at.float_timestamp, + author, repre_entity["id"] ) @@ -643,9 +653,9 @@ class PublishWorkfilesModel: # Get subset docs of folder product_entities = ayon_api.get_products( project_name, - folder_ids=[folder_id], - product_types=["workfile"], - fields=["id", "name"] + folder_ids={folder_id}, + product_types={"workfile"}, + fields={"id", "name"} ) output = [] @@ -657,25 +667,30 @@ class PublishWorkfilesModel: version_entities = ayon_api.get_versions( project_name, product_ids=product_ids, - fields=["id", "productId"] + fields={"id", "author"} ) - version_ids = {version["id"] for version in version_entities} - if not version_ids: + versions_by_id = {version["id"]: version for version in version_entities} + if not versions_by_id: return output # Query representations of filtered versions and add filter for # extension repre_entities = ayon_api.get_representations( project_name, - version_ids=version_ids + version_ids=set(versions_by_id) ) project_anatomy = self._controller.project_anatomy # Filter queried representations by task name if task is set file_items = [] for repre_entity in repre_entities: + version_id = repre_entity["versionId"] + version_entity = versions_by_id[version_id] file_item = self._file_item_from_representation( - repre_entity, project_anatomy, task_name + repre_entity, + project_anatomy, + task_name, + version_entity["author"] ) if file_item is not None: file_items.append(file_item) From ef4e779e06153aa4d2378de4fb049c1b7e8f045d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 17:53:31 +0200 Subject: [PATCH 311/469] fill createdBy and updateBy --- .../tools/workfiles/models/workfiles.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 40b56ed99c..ca7654846b 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -6,6 +6,7 @@ import arrow import ayon_api from ayon_api.operations import OperationsSession +from ayon_core.lib import get_ayon_username from ayon_core.pipeline.template_data import ( get_template_data, get_task_template_data, @@ -23,6 +24,8 @@ from ayon_core.tools.workfiles.abstract import ( WorkfileInfo, ) +_NOT_SET = object() + class CommentMatcher(object): """Use anatomy and work file data to parse comments from filenames. @@ -445,6 +448,7 @@ class WorkfileEntitiesModel: self._controller = controller self._cache = {} self._items = {} + self._current_username = _NOT_SET def _get_workfile_info_identifier( self, folder_id, task_id, rootless_path @@ -563,13 +567,18 @@ class WorkfileEntitiesModel: project_name = self._controller.get_current_project_name() + username = self._get_current_username() workfile_info = { "path": rootless_path, "taskId": task_id, "attrib": { "extension": extension, "description": note - } + }, + # TODO remove 'createdBy' and 'updatedBy' fields when server is + # or above 1.1.3 . + "createdBy": username, + "updatedBy": username, } session = OperationsSession() @@ -577,6 +586,11 @@ class WorkfileEntitiesModel: session.commit() return workfile_info + def _get_current_username(self): + if self._current_username is _NOT_SET: + self._current_username = get_ayon_username() + return self._current_username + class PublishWorkfilesModel: """Model for handling of published workfiles. From d4d07e581f946e643716ed479add3961c29dfdff Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 17:54:38 +0200 Subject: [PATCH 312/469] autofix older workfile info --- .../tools/workfiles/models/workfiles.py | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index ca7654846b..76dd62c9c0 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -538,18 +538,32 @@ class WorkfileEntitiesModel: self._items.pop(identifier, None) return - if note is None: - return - old_note = workfile_info.get("attrib", {}).get("note") new_workfile_info = copy.deepcopy(workfile_info) - attrib = new_workfile_info.setdefault("attrib", {}) - attrib["description"] = note + update_data = {} + if note is not None and old_note != note: + update_data["attrib"] = {"description": note} + attrib = new_workfile_info.setdefault("attrib", {}) + attrib["description"] = note + + username = self._get_current_username() + # Automatically fix 'createdBy' and 'updatedBy' fields + # NOTE both fields were not automatically filled by server + # until 1.1.3 release. + if workfile_info.get("createdBy") is None: + update_data["createdBy"] = username + new_workfile_info["createdBy"] = username + + if workfile_info.get("updatedBy") != username: + update_data["updatedBy"] = username + new_workfile_info["updatedBy"] = username + + if not update_data: + return + self._cache[identifier] = new_workfile_info self._items.pop(identifier, None) - if old_note == note: - return project_name = self._controller.get_current_project_name() @@ -558,7 +572,7 @@ class WorkfileEntitiesModel: project_name, "workfile", workfile_info["id"], - {"attrib": {"description": note}}, + update_data, ) session.commit() From 663e5cb0aa330d93634985335b161f2e8f50ba30 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 18:24:11 +0200 Subject: [PATCH 313/469] fix args order --- client/ayon_core/tools/workfiles/models/workfiles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 76dd62c9c0..6a69a19f9c 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -717,8 +717,8 @@ class PublishWorkfilesModel: file_item = self._file_item_from_representation( repre_entity, project_anatomy, + version_entity["author"], task_name, - version_entity["author"] ) if file_item is not None: file_items.append(file_item) From 5280a72ea8d7eae4244de0dd1b89f1ad974c2a61 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 18:24:19 +0200 Subject: [PATCH 314/469] fix formatting --- client/ayon_core/tools/workfiles/models/workfiles.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 6a69a19f9c..bf30b5dfc2 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -697,7 +697,10 @@ class PublishWorkfilesModel: product_ids=product_ids, fields={"id", "author"} ) - versions_by_id = {version["id"]: version for version in version_entities} + versions_by_id = { + version["id"]: version + for version in version_entities + } if not versions_by_id: return output From 49bbd46727fc7301ca5e6d2e1b5e274df5e081ef Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 24 May 2024 18:24:52 +0200 Subject: [PATCH 315/469] use data in views --- .../widgets/files_widget_published.py | 42 +++++++++++++------ .../widgets/files_widget_workarea.py | 40 ++++++++++++------ 2 files changed, 57 insertions(+), 25 deletions(-) diff --git a/client/ayon_core/tools/workfiles/widgets/files_widget_published.py b/client/ayon_core/tools/workfiles/widgets/files_widget_published.py index bf36d790e9..5f2669bb48 100644 --- a/client/ayon_core/tools/workfiles/widgets/files_widget_published.py +++ b/client/ayon_core/tools/workfiles/widgets/files_widget_published.py @@ -13,7 +13,8 @@ from .utils import BaseOverlayFrame REPRE_ID_ROLE = QtCore.Qt.UserRole + 1 FILEPATH_ROLE = QtCore.Qt.UserRole + 2 -DATE_MODIFIED_ROLE = QtCore.Qt.UserRole + 3 +AUTHOR_ROLE = QtCore.Qt.UserRole + 3 +DATE_MODIFIED_ROLE = QtCore.Qt.UserRole + 4 class PublishedFilesModel(QtGui.QStandardItemModel): @@ -23,13 +24,19 @@ class PublishedFilesModel(QtGui.QStandardItemModel): controller (AbstractWorkfilesFrontend): The control object. """ + columns = [ + "Name", + "Author", + "Date Modified", + ] + date_modified_col = columns.index("Date Modified") + def __init__(self, controller): super(PublishedFilesModel, self).__init__() - self.setColumnCount(2) - - self.setHeaderData(0, QtCore.Qt.Horizontal, "Name") - self.setHeaderData(1, QtCore.Qt.Horizontal, "Date Modified") + self.setColumnCount(len(self.columns)) + for idx, label in enumerate(self.columns): + self.setHeaderData(idx, QtCore.Qt.Horizontal, label) controller.register_event_callback( "selection.task.changed", @@ -207,6 +214,7 @@ class PublishedFilesModel(QtGui.QStandardItemModel): item.setFlags(flags) item.setData(file_item.filepath, FILEPATH_ROLE) + item.setData(file_item.created_by, AUTHOR_ROLE) item.setData(file_item.modified, DATE_MODIFIED_ROLE) self._items_by_id[repre_id] = item @@ -225,22 +233,30 @@ class PublishedFilesModel(QtGui.QStandardItemModel): # Use flags of first column for all columns if index.column() != 0: index = self.index(index.row(), 0, index.parent()) - return super(PublishedFilesModel, self).flags(index) + return super().flags(index) def data(self, index, role=None): if role is None: role = QtCore.Qt.DisplayRole # Handle roles for first column - if index.column() == 1: - if role == QtCore.Qt.DecorationRole: - return None + col = index.column() + if col != 1: + return super().data(index, role) - if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if role == QtCore.Qt.DecorationRole: + return None + + if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if col == 1: + role = AUTHOR_ROLE + elif col == 2: role = DATE_MODIFIED_ROLE - index = self.index(index.row(), 0, index.parent()) + else: + return None + index = self.index(index.row(), 0, index.parent()) - return super(PublishedFilesModel, self).data(index, role) + return super().data(index, role) class SelectContextOverlay(BaseOverlayFrame): @@ -295,7 +311,7 @@ class PublishedFilesWidget(QtWidgets.QWidget): view.setModel(proxy_model) time_delegate = PrettyTimeDelegate() - view.setItemDelegateForColumn(1, time_delegate) + view.setItemDelegateForColumn(model.date_modified_col, time_delegate) # Default to a wider first filename column it is what we mostly care # about and the date modified is relatively small anyway. diff --git a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py index fe6abee951..7b316adf81 100644 --- a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py +++ b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py @@ -10,7 +10,8 @@ from ayon_core.tools.utils.delegates import PrettyTimeDelegate FILENAME_ROLE = QtCore.Qt.UserRole + 1 FILEPATH_ROLE = QtCore.Qt.UserRole + 2 -DATE_MODIFIED_ROLE = QtCore.Qt.UserRole + 3 +AUTHOR_ROLE = QtCore.Qt.UserRole + 3 +DATE_MODIFIED_ROLE = QtCore.Qt.UserRole + 4 class WorkAreaFilesModel(QtGui.QStandardItemModel): @@ -21,14 +22,20 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): """ refreshed = QtCore.Signal() + columns = [ + "Name", + "Author", + "Date Modified", + ] + date_modified_col = columns.index("Date Modified") def __init__(self, controller): super(WorkAreaFilesModel, self).__init__() - self.setColumnCount(2) + self.setColumnCount(len(self.columns)) - self.setHeaderData(0, QtCore.Qt.Horizontal, "Name") - self.setHeaderData(1, QtCore.Qt.Horizontal, "Date Modified") + for idx, label in enumerate(self.columns): + self.setHeaderData(idx, QtCore.Qt.Horizontal, label) controller.register_event_callback( "selection.folder.changed", @@ -206,6 +213,7 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): item.setData(file_item.filename, FILENAME_ROLE) item.setData(file_item.filepath, FILEPATH_ROLE) + item.setData(file_item.created_by, AUTHOR_ROLE) item.setData(file_item.modified, DATE_MODIFIED_ROLE) self._items_by_filename[file_item.filename] = item @@ -224,22 +232,30 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): # Use flags of first column for all columns if index.column() != 0: index = self.index(index.row(), 0, index.parent()) - return super(WorkAreaFilesModel, self).flags(index) + return super().flags(index) def data(self, index, role=None): if role is None: role = QtCore.Qt.DisplayRole # Handle roles for first column - if index.column() == 1: - if role == QtCore.Qt.DecorationRole: - return None + col = index.column() + if col == 0: + return super().data(index, role) - if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if role == QtCore.Qt.DecorationRole: + return None + + if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole): + if col == 1: + role = AUTHOR_ROLE + elif col == 2: role = DATE_MODIFIED_ROLE - index = self.index(index.row(), 0, index.parent()) + else: + return None + index = self.index(index.row(), 0, index.parent()) - return super(WorkAreaFilesModel, self).data(index, role) + return super().data(index, role) def set_published_mode(self, published_mode): if self._published_mode == published_mode: @@ -279,7 +295,7 @@ class WorkAreaFilesWidget(QtWidgets.QWidget): view.setModel(proxy_model) time_delegate = PrettyTimeDelegate() - view.setItemDelegateForColumn(1, time_delegate) + view.setItemDelegateForColumn(model.date_modified_col, time_delegate) # Default to a wider first filename column it is what we mostly care # about and the date modified is relatively small anyway. From 91b52820b32a8b319faedac1edbfe7b5681cd0fb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 11:46:41 +0200 Subject: [PATCH 316/469] prepared generic model 'PluginStateByHostModel' --- server/settings/publish_plugins.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 61e73ce912..9e6fc760b0 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -59,7 +59,7 @@ class CollectFramesFixDefModel(BaseSettingsModel): ) -class ValidateOutdatedContainersProfile(BaseSettingsModel): +class PluginStateByHostModelProfile(BaseSettingsModel): _layout = "expanded" # Filtering host_names: list[str] = SettingsField( @@ -72,15 +72,9 @@ class ValidateOutdatedContainersProfile(BaseSettingsModel): active: bool = SettingsField(True, title="Active") -class ValidateOutdatedContainersModel(BaseSettingsModel): - """Validate if Publishing intent was selected. - - It is possible to disable validation for specific publishing context - with profiles. - """ - +class PluginStateByHostModel(BaseSettingsModel): _isGroup = True - plugin_state_profiles: list[ValidateOutdatedContainersProfile] = SettingsField( + plugin_state_profiles: list[PluginStateByHostModelProfile] = SettingsField( default_factory=list, title="Plugin enable state profiles", ) @@ -797,8 +791,8 @@ class PublishPuginsModel(BaseSettingsModel): default_factory=ValidateBaseModel, title="Validate Version" ) - ValidateOutdatedContainers: ValidateOutdatedContainersModel = SettingsField( - default_factory=ValidateOutdatedContainersModel, + ValidateOutdatedContainers: PluginStateByHostModel = SettingsField( + default_factory=PluginStateByHostModel, title="Validate Containers" ) ValidateIntent: ValidateIntentModel = SettingsField( From 59547099100418c621a37844b2b900cbb603c158 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 11:47:00 +0200 Subject: [PATCH 317/469] validate version is enabled, optional, active based on profiles --- .../plugins/publish/validate_version.py | 33 +++++++++++++++++-- server/settings/publish_plugins.py | 22 ++++++++++--- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index 25a5757330..c2f7d5bf44 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -1,6 +1,10 @@ import pyblish.api + +from ayon_core.lib import filter_profiles from ayon_core.pipeline.publish import ( - PublishValidationError, OptionalPyblishPluginMixin + PublishValidationError, + OptionalPyblishPluginMixin, + get_current_host_name, ) @@ -13,12 +17,35 @@ class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): order = pyblish.api.ValidatorOrder label = "Validate Version" - hosts = ["nuke", "maya", "houdini", "blender", - "photoshop", "aftereffects"] optional = False active = True + @classmethod + def apply_settings(cls, settings): + # Disable if no profile is found for the current host + profiles = ( + settings + ["core"] + ["publish"] + ["ValidateVersion"] + ["plugin_state_profiles"] + ) + profile = filter_profiles( + profiles, {"host_names": get_current_host_name()} + ) + if not profile: + cls.enabled = False + return + + # Apply settings from profile + for attr_name in { + "enabled", + "optional", + "active", + }: + setattr(cls, attr_name, profile[attr_name]) + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 9e6fc760b0..11f615c6f4 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -787,8 +787,8 @@ class PublishPuginsModel(BaseSettingsModel): default_factory=ValidateBaseModel, title="Validate Editorial Asset Name" ) - ValidateVersion: ValidateBaseModel = SettingsField( - default_factory=ValidateBaseModel, + ValidateVersion: PluginStateByHostModel = SettingsField( + default_factory=PluginStateByHostModel, title="Validate Version" ) ValidateOutdatedContainers: PluginStateByHostModel = SettingsField( @@ -876,9 +876,21 @@ DEFAULT_PUBLISH_VALUES = { "active": True }, "ValidateVersion": { - "enabled": True, - "optional": False, - "active": True + "plugin_state_profiles": [ + { + "host_names": [ + "aftereffects", + "blender", + "houdini", + "maya", + "nuke", + "photoshop", + ], + "enabled": True, + "optional": False, + "active": True + } + ] }, "ValidateOutdatedContainers": { "plugin_state_profiles": [ From 57384baf6b50d1de95ca8c90e86ed6fd073730bc Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 12:14:07 +0200 Subject: [PATCH 318/469] added description to plugin --- server/settings/publish_plugins.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index 11f615c6f4..ef531c8345 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -77,6 +77,7 @@ class PluginStateByHostModel(BaseSettingsModel): plugin_state_profiles: list[PluginStateByHostModelProfile] = SettingsField( default_factory=list, title="Plugin enable state profiles", + description="Change plugin state based on host name." ) @@ -789,7 +790,11 @@ class PublishPuginsModel(BaseSettingsModel): ) ValidateVersion: PluginStateByHostModel = SettingsField( default_factory=PluginStateByHostModel, - title="Validate Version" + title="Validate Version", + description=( + "Validate that product version to integrate" + " is newer than latest version in AYON." + ) ) ValidateOutdatedContainers: PluginStateByHostModel = SettingsField( default_factory=PluginStateByHostModel, From ac995dffc1368681871c1ec24edecaabc6f3e023 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 12:17:13 +0200 Subject: [PATCH 319/469] moved conversion functions to settings --- server/__init__.py | 47 ++++--------------------------- server/settings/__init__.py | 3 ++ server/settings/conversion.py | 52 +++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 41 deletions(-) create mode 100644 server/settings/conversion.py diff --git a/server/__init__.py b/server/__init__.py index 79f505ccd5..d60f50f471 100644 --- a/server/__init__.py +++ b/server/__init__.py @@ -2,7 +2,11 @@ from typing import Any from ayon_server.addons import BaseServerAddon -from .settings import CoreSettings, DEFAULT_VALUES +from .settings import ( + CoreSettings, + DEFAULT_VALUES, + convert_settings_overrides, +) class CoreAddon(BaseServerAddon): @@ -17,47 +21,8 @@ class CoreAddon(BaseServerAddon): source_version: str, overrides: dict[str, Any], ) -> dict[str, Any]: - self._convert_imagio_configs_0_3_1(overrides) + convert_settings_overrides(source_version, overrides) # Use super conversion return await super().convert_settings_overrides( source_version, overrides ) - - def _convert_imagio_configs_0_3_1(self, overrides): - """Imageio config settings did change to profiles since 0.3.1. .""" - imageio_overrides = overrides.get("imageio") or {} - if ( - "ocio_config" not in imageio_overrides - or "filepath" not in imageio_overrides["ocio_config"] - ): - return - - ocio_config = imageio_overrides.pop("ocio_config") - - filepath = ocio_config["filepath"] - if not filepath: - return - first_filepath = filepath[0] - ocio_config_profiles = imageio_overrides.setdefault( - "ocio_config_profiles", [] - ) - base_value = { - "type": "builtin_path", - "product_name": "", - "host_names": [], - "task_names": [], - "task_types": [], - "custom_path": "", - "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio" - } - if first_filepath in ( - "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", - "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", - ): - base_value["type"] = "builtin_path" - base_value["builtin_path"] = first_filepath - else: - base_value["type"] = "custom_path" - base_value["custom_path"] = first_filepath - - ocio_config_profiles.append(base_value) diff --git a/server/settings/__init__.py b/server/settings/__init__.py index 527a2bdc0c..4bb21a9644 100644 --- a/server/settings/__init__.py +++ b/server/settings/__init__.py @@ -1,7 +1,10 @@ from .main import CoreSettings, DEFAULT_VALUES +from .conversion import convert_settings_overrides __all__ = ( "CoreSettings", "DEFAULT_VALUES", + + "convert_settings_overrides", ) diff --git a/server/settings/conversion.py b/server/settings/conversion.py new file mode 100644 index 0000000000..74046fe020 --- /dev/null +++ b/server/settings/conversion.py @@ -0,0 +1,52 @@ +import copy +from typing import Any + +from .publish_plugins import DEFAULT_PUBLISH_VALUES + + +def _convert_imageio_configs_0_3_1(overrides): + """Imageio config settings did change to profiles since 0.3.1. .""" + imageio_overrides = overrides.get("imageio") or {} + if ( + "ocio_config" not in imageio_overrides + or "filepath" not in imageio_overrides["ocio_config"] + ): + return + + ocio_config = imageio_overrides.pop("ocio_config") + + filepath = ocio_config["filepath"] + if not filepath: + return + first_filepath = filepath[0] + ocio_config_profiles = imageio_overrides.setdefault( + "ocio_config_profiles", [] + ) + base_value = { + "type": "builtin_path", + "product_name": "", + "host_names": [], + "task_names": [], + "task_types": [], + "custom_path": "", + "builtin_path": "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio" + } + if first_filepath in ( + "{BUILTIN_OCIO_ROOT}/aces_1.2/config.ocio", + "{BUILTIN_OCIO_ROOT}/nuke-default/config.ocio", + ): + base_value["type"] = "builtin_path" + base_value["builtin_path"] = first_filepath + else: + base_value["type"] = "custom_path" + base_value["custom_path"] = first_filepath + + ocio_config_profiles.append(base_value) + + +def convert_settings_overrides( + source_version: str, + overrides: dict[str, Any], +) -> dict[str, Any]: + _convert_imageio_configs_0_3_1(overrides) + return overrides From c6123d257d8608391b3593cdb9934ceb6adbcbd7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 12:18:58 +0200 Subject: [PATCH 320/469] added conversion for ValidateVersion settings --- server/settings/conversion.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/server/settings/conversion.py b/server/settings/conversion.py index 74046fe020..f513738603 100644 --- a/server/settings/conversion.py +++ b/server/settings/conversion.py @@ -44,9 +44,43 @@ def _convert_imageio_configs_0_3_1(overrides): ocio_config_profiles.append(base_value) +def _convert_validate_version_0_3_3(publish_overrides): + """ValidateVersion plugin changed in 0.3.3.""" + if "ValidateVersion" not in publish_overrides: + return + + validate_version = publish_overrides["ValidateVersion"] + # Already new settings + if "plugin_state_profiles" in validate_version: + return + + # Use new default profile as base + profile = copy.deepcopy( + DEFAULT_PUBLISH_VALUES["ValidateVersion"]["plugin_state_profiles"][0] + ) + # Copy values from old overrides to new overrides + for key in { + "enabled", + "optional", + "active", + }: + if key not in validate_version: + continue + profile[key] = validate_version.pop(key) + + validate_version["plugin_state_profiles"] = [profile] + + +def _conver_publish_plugins(overrides): + if "publish" not in overrides: + return + _convert_validate_version_0_3_3(overrides["publish"]) + + def convert_settings_overrides( source_version: str, overrides: dict[str, Any], ) -> dict[str, Any]: _convert_imageio_configs_0_3_1(overrides) + _conver_publish_plugins(overrides) return overrides From 3d6f1a7c27a9e029c81d92a57cccaf305d32d330 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 27 May 2024 14:20:20 +0200 Subject: [PATCH 321/469] nuke host folder migrated into server_addons --- .../nuke/client/ayon_nuke}/__init__.py | 0 .../nuke/client/ayon_nuke}/addon.py | 0 .../nuke/client/ayon_nuke}/api/__init__.py | 0 .../nuke/client/ayon_nuke}/api/actions.py | 0 .../nuke/client/ayon_nuke}/api/command.py | 0 .../nuke/client/ayon_nuke}/api/constants.py | 0 .../nuke/client/ayon_nuke}/api/gizmo_menu.py | 0 .../nuke/client/ayon_nuke}/api/lib.py | 10 +++++----- .../nuke/client/ayon_nuke}/api/pipeline.py | 8 ++++---- .../nuke/client/ayon_nuke}/api/plugin.py | 2 +- .../nuke/client/ayon_nuke}/api/utils.py | 0 .../client/ayon_nuke}/api/workfile_template_builder.py | 0 .../nuke/client/ayon_nuke}/api/workio.py | 0 .../client/ayon_nuke}/hooks/pre_nukeassist_setup.py | 0 .../nuke/client/ayon_nuke}/plugins/__init__.py | 0 .../nuke/client/ayon_nuke}/plugins/create/__init__.py | 0 .../client/ayon_nuke}/plugins/create/convert_legacy.py | 4 ++-- .../ayon_nuke}/plugins/create/create_backdrop.py | 2 +- .../client/ayon_nuke}/plugins/create/create_camera.py | 4 ++-- .../client/ayon_nuke}/plugins/create/create_gizmo.py | 2 +- .../client/ayon_nuke}/plugins/create/create_model.py | 2 +- .../client/ayon_nuke}/plugins/create/create_source.py | 2 +- .../ayon_nuke}/plugins/create/create_write_image.py | 2 +- .../plugins/create/create_write_prerender.py | 2 +- .../ayon_nuke}/plugins/create/create_write_render.py | 2 +- .../ayon_nuke}/plugins/create/workfile_creator.py | 4 ++-- .../ayon_nuke}/plugins/inventory/repair_old_loaders.py | 2 +- .../ayon_nuke}/plugins/inventory/select_containers.py | 2 +- .../nuke/client/ayon_nuke}/plugins/load/actions.py | 2 +- .../client/ayon_nuke}/plugins/load/load_backdrop.py | 6 +++--- .../client/ayon_nuke}/plugins/load/load_camera_abc.py | 4 ++-- .../nuke/client/ayon_nuke}/plugins/load/load_clip.py | 6 +++--- .../client/ayon_nuke}/plugins/load/load_effects.py | 2 +- .../client/ayon_nuke}/plugins/load/load_effects_ip.py | 4 ++-- .../nuke/client/ayon_nuke}/plugins/load/load_gizmo.py | 4 ++-- .../client/ayon_nuke}/plugins/load/load_gizmo_ip.py | 4 ++-- .../nuke/client/ayon_nuke}/plugins/load/load_image.py | 4 ++-- .../client/ayon_nuke}/plugins/load/load_matchmove.py | 0 .../nuke/client/ayon_nuke}/plugins/load/load_model.py | 4 ++-- .../client/ayon_nuke}/plugins/load/load_ociolook.py | 2 +- .../ayon_nuke}/plugins/load/load_script_precomp.py | 4 ++-- .../ayon_nuke}/plugins/publish/collect_backdrop.py | 2 +- .../ayon_nuke}/plugins/publish/collect_context_data.py | 2 +- .../ayon_nuke}/plugins/publish/collect_framerate.py | 0 .../client/ayon_nuke}/plugins/publish/collect_gizmo.py | 0 .../plugins/publish/collect_headless_farm.py | 0 .../client/ayon_nuke}/plugins/publish/collect_model.py | 0 .../plugins/publish/collect_nuke_instance_data.py | 0 .../client/ayon_nuke}/plugins/publish/collect_reads.py | 0 .../ayon_nuke}/plugins/publish/collect_slate_node.py | 0 .../ayon_nuke}/plugins/publish/collect_workfile.py | 0 .../ayon_nuke}/plugins/publish/collect_writes.py | 0 .../ayon_nuke}/plugins/publish/extract_backdrop.py | 2 +- .../ayon_nuke}/plugins/publish/extract_camera.py | 2 +- .../client/ayon_nuke}/plugins/publish/extract_gizmo.py | 4 ++-- .../plugins/publish/extract_headless_farm.py | 0 .../client/ayon_nuke}/plugins/publish/extract_model.py | 2 +- .../ayon_nuke}/plugins/publish/extract_ouput_node.py | 2 +- .../plugins/publish/extract_output_directory.py | 0 .../ayon_nuke}/plugins/publish/extract_render_local.py | 0 .../ayon_nuke}/plugins/publish/extract_review_data.py | 0 .../plugins/publish/extract_review_data_lut.py | 4 ++-- .../plugins/publish/extract_review_intermediates.py | 4 ++-- .../ayon_nuke}/plugins/publish/extract_script_save.py | 0 .../ayon_nuke}/plugins/publish/extract_slate_frame.py | 2 +- .../plugins/publish/help/validate_asset_context.xml | 0 .../plugins/publish/help/validate_backdrop.xml | 0 .../ayon_nuke}/plugins/publish/help/validate_gizmo.xml | 0 .../ayon_nuke}/plugins/publish/help/validate_knobs.xml | 0 .../publish/help/validate_output_resolution.xml | 0 .../plugins/publish/help/validate_proxy_mode.xml | 0 .../plugins/publish/help/validate_rendered_frames.xml | 0 .../publish/help/validate_script_attributes.xml | 0 .../plugins/publish/help/validate_write_nodes.xml | 0 .../plugins/publish/increment_script_version.py | 0 .../ayon_nuke}/plugins/publish/remove_ouput_node.py | 0 .../plugins/publish/validate_asset_context.py | 2 +- .../ayon_nuke}/plugins/publish/validate_backdrop.py | 0 .../plugins/publish/validate_exposed_knobs.py | 2 +- .../ayon_nuke}/plugins/publish/validate_gizmo.py | 0 .../ayon_nuke}/plugins/publish/validate_knobs.py | 0 .../plugins/publish/validate_output_resolution.py | 0 .../ayon_nuke}/plugins/publish/validate_proxy_mode.py | 0 .../plugins/publish/validate_rendered_frames.py | 0 .../plugins/publish/validate_script_attributes.py | 2 +- .../ayon_nuke}/plugins/publish/validate_write_nodes.py | 2 +- .../plugins/workfile_build/create_placeholder.py | 4 ++-- .../plugins/workfile_build/load_placeholder.py | 4 ++-- .../nuke/client/ayon_nuke}/startup/__init__.py | 0 .../nuke/client/ayon_nuke}/startup/clear_rendered.py | 0 .../client/ayon_nuke}/startup/custom_write_node.py | 2 +- .../ayon_nuke}/startup/frame_setting_for_read_nodes.py | 0 .../nuke/client/ayon_nuke}/startup/menu.py | 2 +- .../nuke/client/ayon_nuke}/startup/write_to_read.py | 0 .../ayon_nuke}/vendor/google/protobuf/__init__.py | 0 .../ayon_nuke}/vendor/google/protobuf/any_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/api_pb2.py | 0 .../vendor/google/protobuf/compiler/__init__.py | 0 .../vendor/google/protobuf/compiler/plugin_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/descriptor.py | 0 .../vendor/google/protobuf/descriptor_database.py | 0 .../vendor/google/protobuf/descriptor_pb2.py | 0 .../vendor/google/protobuf/descriptor_pool.py | 0 .../ayon_nuke}/vendor/google/protobuf/duration_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/empty_pb2.py | 0 .../vendor/google/protobuf/field_mask_pb2.py | 0 .../vendor/google/protobuf/internal/__init__.py | 0 .../vendor/google/protobuf/internal/_parameterized.py | 0 .../google/protobuf/internal/api_implementation.py | 0 .../vendor/google/protobuf/internal/builder.py | 0 .../vendor/google/protobuf/internal/containers.py | 0 .../vendor/google/protobuf/internal/decoder.py | 0 .../vendor/google/protobuf/internal/encoder.py | 0 .../google/protobuf/internal/enum_type_wrapper.py | 0 .../vendor/google/protobuf/internal/extension_dict.py | 0 .../google/protobuf/internal/message_listener.py | 0 .../protobuf/internal/message_set_extensions_pb2.py | 0 .../protobuf/internal/missing_enum_values_pb2.py | 0 .../protobuf/internal/more_extensions_dynamic_pb2.py | 0 .../google/protobuf/internal/more_extensions_pb2.py | 0 .../google/protobuf/internal/more_messages_pb2.py | 0 .../vendor/google/protobuf/internal/no_package_pb2.py | 0 .../vendor/google/protobuf/internal/python_message.py | 0 .../vendor/google/protobuf/internal/type_checkers.py | 0 .../google/protobuf/internal/well_known_types.py | 0 .../vendor/google/protobuf/internal/wire_format.py | 0 .../ayon_nuke}/vendor/google/protobuf/json_format.py | 0 .../ayon_nuke}/vendor/google/protobuf/message.py | 0 .../vendor/google/protobuf/message_factory.py | 0 .../ayon_nuke}/vendor/google/protobuf/proto_builder.py | 0 .../vendor/google/protobuf/pyext/__init__.py | 0 .../vendor/google/protobuf/pyext/cpp_message.py | 0 .../vendor/google/protobuf/pyext/python_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/reflection.py | 0 .../ayon_nuke}/vendor/google/protobuf/service.py | 0 .../vendor/google/protobuf/service_reflection.py | 0 .../vendor/google/protobuf/source_context_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/struct_pb2.py | 0 .../vendor/google/protobuf/symbol_database.py | 0 .../ayon_nuke}/vendor/google/protobuf/text_encoding.py | 0 .../ayon_nuke}/vendor/google/protobuf/text_format.py | 0 .../ayon_nuke}/vendor/google/protobuf/timestamp_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/type_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/util/__init__.py | 0 .../vendor/google/protobuf/util/json_format_pb2.py | 0 .../google/protobuf/util/json_format_proto3_pb2.py | 0 .../ayon_nuke}/vendor/google/protobuf/wrappers_pb2.py | 0 147 files changed, 71 insertions(+), 71 deletions(-) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/addon.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/actions.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/command.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/constants.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/gizmo_menu.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/lib.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/pipeline.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/plugin.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/utils.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/workfile_template_builder.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/api/workio.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/hooks/pre_nukeassist_setup.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/convert_legacy.py (93%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_backdrop.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_camera.py (95%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_gizmo.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_model.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_source.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_write_image.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_write_prerender.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/create_write_render.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/create/workfile_creator.py (96%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/inventory/repair_old_loaders.py (94%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/inventory/select_containers.py (88%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/actions.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_backdrop.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_camera_abc.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_clip.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_effects.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_effects_ip.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_gizmo.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_gizmo_ip.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_image.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_matchmove.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_model.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_ociolook.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/load/load_script_precomp.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_backdrop.py (97%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_context_data.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_framerate.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_gizmo.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_headless_farm.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_model.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_nuke_instance_data.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_reads.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_slate_node.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/collect_writes.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_backdrop.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_camera.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_gizmo.py (96%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_headless_farm.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_model.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_ouput_node.py (95%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_output_directory.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_render_local.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_review_data.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_review_data_lut.py (95%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_review_intermediates.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_script_save.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/extract_slate_frame.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_asset_context.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_backdrop.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_gizmo.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_knobs.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_output_resolution.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_proxy_mode.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_rendered_frames.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_script_attributes.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/help/validate_write_nodes.xml (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/increment_script_version.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/remove_ouput_node.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_asset_context.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_backdrop.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_exposed_knobs.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_gizmo.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_knobs.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_output_resolution.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_proxy_mode.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_rendered_frames.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_script_attributes.py (98%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/publish/validate_write_nodes.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/workfile_build/create_placeholder.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/plugins/workfile_build/load_placeholder.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/clear_rendered.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/custom_write_node.py (99%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/frame_setting_for_read_nodes.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/menu.py (64%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/startup/write_to_read.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/any_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/api_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/compiler/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/compiler/plugin_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/descriptor.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/descriptor_database.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/descriptor_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/descriptor_pool.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/duration_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/empty_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/field_mask_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/_parameterized.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/api_implementation.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/builder.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/containers.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/decoder.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/encoder.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/enum_type_wrapper.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/extension_dict.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/message_listener.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/message_set_extensions_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/missing_enum_values_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/more_extensions_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/more_messages_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/no_package_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/python_message.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/type_checkers.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/well_known_types.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/internal/wire_format.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/json_format.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/message.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/message_factory.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/proto_builder.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/pyext/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/pyext/cpp_message.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/pyext/python_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/reflection.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/service.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/service_reflection.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/source_context_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/struct_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/symbol_database.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/text_encoding.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/text_format.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/timestamp_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/type_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/util/__init__.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/util/json_format_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/util/json_format_proto3_pb2.py (100%) rename {client/ayon_core/hosts/nuke => server_addon/nuke/client/ayon_nuke}/vendor/google/protobuf/wrappers_pb2.py (100%) diff --git a/client/ayon_core/hosts/nuke/__init__.py b/server_addon/nuke/client/ayon_nuke/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/__init__.py rename to server_addon/nuke/client/ayon_nuke/__init__.py diff --git a/client/ayon_core/hosts/nuke/addon.py b/server_addon/nuke/client/ayon_nuke/addon.py similarity index 100% rename from client/ayon_core/hosts/nuke/addon.py rename to server_addon/nuke/client/ayon_nuke/addon.py diff --git a/client/ayon_core/hosts/nuke/api/__init__.py b/server_addon/nuke/client/ayon_nuke/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/__init__.py rename to server_addon/nuke/client/ayon_nuke/api/__init__.py diff --git a/client/ayon_core/hosts/nuke/api/actions.py b/server_addon/nuke/client/ayon_nuke/api/actions.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/actions.py rename to server_addon/nuke/client/ayon_nuke/api/actions.py diff --git a/client/ayon_core/hosts/nuke/api/command.py b/server_addon/nuke/client/ayon_nuke/api/command.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/command.py rename to server_addon/nuke/client/ayon_nuke/api/command.py diff --git a/client/ayon_core/hosts/nuke/api/constants.py b/server_addon/nuke/client/ayon_nuke/api/constants.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/constants.py rename to server_addon/nuke/client/ayon_nuke/api/constants.py diff --git a/client/ayon_core/hosts/nuke/api/gizmo_menu.py b/server_addon/nuke/client/ayon_nuke/api/gizmo_menu.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/gizmo_menu.py rename to server_addon/nuke/client/ayon_nuke/api/gizmo_menu.py diff --git a/client/ayon_core/hosts/nuke/api/lib.py b/server_addon/nuke/client/ayon_nuke/api/lib.py similarity index 99% rename from client/ayon_core/hosts/nuke/api/lib.py rename to server_addon/nuke/client/ayon_nuke/api/lib.py index 500a0f9601..09dab4687a 100644 --- a/client/ayon_core/hosts/nuke/api/lib.py +++ b/server_addon/nuke/client/ayon_nuke/api/lib.py @@ -354,7 +354,7 @@ def imprint(node, data, tab=None): Examples: ``` import nuke - from ayon_core.hosts.nuke.api import lib + from ayon_nuke.api import lib node = nuke.createNode("NoOp") data = { @@ -419,7 +419,7 @@ def add_publish_knob(node): return node -@deprecated("ayon_core.hosts.nuke.api.lib.set_node_data") +@deprecated("ayon_nuke.api.lib.set_node_data") def set_avalon_knob_data(node, data=None, prefix="avalon:"): """[DEPRECATED] Sets data into nodes's avalon knob @@ -485,7 +485,7 @@ def set_avalon_knob_data(node, data=None, prefix="avalon:"): return node -@deprecated("ayon_core.hosts.nuke.api.lib.get_node_data") +@deprecated("ayon_nuke.api.lib.get_node_data") def get_avalon_knob_data(node, prefix="avalon:", create=True): """[DEPRECATED] Gets a data from nodes's avalon knob @@ -1028,7 +1028,7 @@ def add_button_render_on_farm(node): name = "renderOnFarm" label = "Render On Farm" value = ( - "from ayon_core.hosts.nuke.api.utils import submit_render_on_farm;" + "from ayon_nuke.api.utils import submit_render_on_farm;" "submit_render_on_farm(nuke.thisNode())" ) knob = nuke.PyScript_Knob(name, label, value) @@ -2469,7 +2469,7 @@ def _launch_workfile_app(): host_tools.show_workfiles(parent=None, on_top=True) -@deprecated("ayon_core.hosts.nuke.api.lib.start_workfile_template_builder") +@deprecated("ayon_nuke.api.lib.start_workfile_template_builder") def process_workfile_builder(): """ [DEPRECATED] Process workfile builder on nuke start diff --git a/client/ayon_core/hosts/nuke/api/pipeline.py b/server_addon/nuke/client/ayon_nuke/api/pipeline.py similarity index 99% rename from client/ayon_core/hosts/nuke/api/pipeline.py rename to server_addon/nuke/client/ayon_nuke/api/pipeline.py index d35a2e89e0..0425dd20d4 100644 --- a/client/ayon_core/hosts/nuke/api/pipeline.py +++ b/server_addon/nuke/client/ayon_nuke/api/pipeline.py @@ -188,10 +188,10 @@ def reload_config(): """ for module in ( - "ayon_core.hosts.nuke.api.actions", - "ayon_core.hosts.nuke.api.menu", - "ayon_core.hosts.nuke.api.plugin", - "ayon_core.hosts.nuke.api.lib", + "ayon_nuke.api.actions", + "ayon_nuke.api.menu", + "ayon_nuke.api.plugin", + "ayon_nuke.api.lib", ): log.info("Reloading module: {}...".format(module)) diff --git a/client/ayon_core/hosts/nuke/api/plugin.py b/server_addon/nuke/client/ayon_nuke/api/plugin.py similarity index 99% rename from client/ayon_core/hosts/nuke/api/plugin.py rename to server_addon/nuke/client/ayon_nuke/api/plugin.py index ec13104d4d..03b4af3475 100644 --- a/client/ayon_core/hosts/nuke/api/plugin.py +++ b/server_addon/nuke/client/ayon_nuke/api/plugin.py @@ -1038,7 +1038,7 @@ def convert_to_valid_instaces(): } return mapping[product_type] - from ayon_core.hosts.nuke.api import workio + from ayon_nuke.api import workio task_name = get_current_task_name() diff --git a/client/ayon_core/hosts/nuke/api/utils.py b/server_addon/nuke/client/ayon_nuke/api/utils.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/utils.py rename to server_addon/nuke/client/ayon_nuke/api/utils.py diff --git a/client/ayon_core/hosts/nuke/api/workfile_template_builder.py b/server_addon/nuke/client/ayon_nuke/api/workfile_template_builder.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/workfile_template_builder.py rename to server_addon/nuke/client/ayon_nuke/api/workfile_template_builder.py diff --git a/client/ayon_core/hosts/nuke/api/workio.py b/server_addon/nuke/client/ayon_nuke/api/workio.py similarity index 100% rename from client/ayon_core/hosts/nuke/api/workio.py rename to server_addon/nuke/client/ayon_nuke/api/workio.py diff --git a/client/ayon_core/hosts/nuke/hooks/pre_nukeassist_setup.py b/server_addon/nuke/client/ayon_nuke/hooks/pre_nukeassist_setup.py similarity index 100% rename from client/ayon_core/hosts/nuke/hooks/pre_nukeassist_setup.py rename to server_addon/nuke/client/ayon_nuke/hooks/pre_nukeassist_setup.py diff --git a/client/ayon_core/hosts/nuke/plugins/__init__.py b/server_addon/nuke/client/ayon_nuke/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/__init__.py rename to server_addon/nuke/client/ayon_nuke/plugins/__init__.py diff --git a/client/ayon_core/hosts/nuke/plugins/create/__init__.py b/server_addon/nuke/client/ayon_nuke/plugins/create/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/create/__init__.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/__init__.py diff --git a/client/ayon_core/hosts/nuke/plugins/create/convert_legacy.py b/server_addon/nuke/client/ayon_nuke/plugins/create/convert_legacy.py similarity index 93% rename from client/ayon_core/hosts/nuke/plugins/create/convert_legacy.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/convert_legacy.py index 8fb8abfbbf..65e719d15b 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/convert_legacy.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/convert_legacy.py @@ -1,12 +1,12 @@ from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID from ayon_core.pipeline.create.creator_plugins import ProductConvertorPlugin -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( INSTANCE_DATA_KNOB, get_node_data, get_avalon_knob_data, NODE_TAB_NAME, ) -from ayon_core.hosts.nuke.api.plugin import convert_to_valid_instaces +from ayon_nuke.api.plugin import convert_to_valid_instaces import nuke diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/create/create_backdrop.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py index cefd9501ec..6d50b066d7 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py @@ -1,6 +1,6 @@ from nukescripts import autoBackdrop -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( NukeCreator, maintained_selection, select_nodes diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_camera.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py similarity index 95% rename from client/ayon_core/hosts/nuke/plugins/create/create_camera.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py index 764de84dcf..acf7448232 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_camera.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py @@ -1,10 +1,10 @@ import nuke -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( NukeCreator, NukeCreatorError, maintained_selection ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( create_camera_node_by_version ) diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/create/create_gizmo.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py index ccc6aa13bd..cc1c4edf82 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py @@ -1,5 +1,5 @@ import nuke -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( NukeCreator, NukeCreatorError, maintained_selection diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_model.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/create/create_model.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py index 507b7a1b57..6c1bf612b9 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py @@ -1,5 +1,5 @@ import nuke -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( NukeCreator, NukeCreatorError, maintained_selection diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_source.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/create/create_source.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py index ac6b8f694b..b2a21f032d 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_source.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py @@ -1,7 +1,7 @@ import nuke import six import sys -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( INSTANCE_DATA_KNOB, NukeCreator, NukeCreatorError, diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/create/create_write_image.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py index fc2538f23d..43f9d4c207 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_image.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py @@ -12,7 +12,7 @@ from ayon_core.lib import ( EnumDef ) from ayon_core.hosts.nuke import api as napi -from ayon_core.hosts.nuke.api.plugin import exposed_write_knobs +from ayon_nuke.api.plugin import exposed_write_knobs class CreateWriteImage(napi.NukeWriteCreator): diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py index 47796d159c..91b0022c86 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_prerender.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py @@ -9,7 +9,7 @@ from ayon_core.lib import ( BoolDef ) from ayon_core.hosts.nuke import api as napi -from ayon_core.hosts.nuke.api.plugin import exposed_write_knobs +from ayon_nuke.api.plugin import exposed_write_knobs class CreateWritePrerender(napi.NukeWriteCreator): diff --git a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/create/create_write_render.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py index 4cb5ccdfa2..85a09d65b7 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/create_write_render.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py @@ -9,7 +9,7 @@ from ayon_core.lib import ( BoolDef ) from ayon_core.hosts.nuke import api as napi -from ayon_core.hosts.nuke.api.plugin import exposed_write_knobs +from ayon_nuke.api.plugin import exposed_write_knobs class CreateWriteRender(napi.NukeWriteCreator): diff --git a/client/ayon_core/hosts/nuke/plugins/create/workfile_creator.py b/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py similarity index 96% rename from client/ayon_core/hosts/nuke/plugins/create/workfile_creator.py rename to server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py index b9d83a2b48..c49ca1f502 100644 --- a/client/ayon_core/hosts/nuke/plugins/create/workfile_creator.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py @@ -1,11 +1,11 @@ import ayon_api -import ayon_core.hosts.nuke.api as api +import ayon_nuke.api as api from ayon_core.pipeline import ( AutoCreator, CreatedInstance, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( INSTANCE_DATA_KNOB, set_node_data ) diff --git a/client/ayon_core/hosts/nuke/plugins/inventory/repair_old_loaders.py b/server_addon/nuke/client/ayon_nuke/plugins/inventory/repair_old_loaders.py similarity index 94% rename from client/ayon_core/hosts/nuke/plugins/inventory/repair_old_loaders.py rename to server_addon/nuke/client/ayon_nuke/plugins/inventory/repair_old_loaders.py index 7bb5c8ef20..11d65d4b8c 100644 --- a/client/ayon_core/hosts/nuke/plugins/inventory/repair_old_loaders.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/inventory/repair_old_loaders.py @@ -1,6 +1,6 @@ from ayon_core.lib import Logger from ayon_core.pipeline import InventoryAction -from ayon_core.hosts.nuke.api.lib import set_avalon_knob_data +from ayon_nuke.api.lib import set_avalon_knob_data class RepairOldLoaders(InventoryAction): diff --git a/client/ayon_core/hosts/nuke/plugins/inventory/select_containers.py b/server_addon/nuke/client/ayon_nuke/plugins/inventory/select_containers.py similarity index 88% rename from client/ayon_core/hosts/nuke/plugins/inventory/select_containers.py rename to server_addon/nuke/client/ayon_nuke/plugins/inventory/select_containers.py index 2fa9c06984..f67c8c16e9 100644 --- a/client/ayon_core/hosts/nuke/plugins/inventory/select_containers.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/inventory/select_containers.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import InventoryAction -from ayon_core.hosts.nuke.api.command import viewer_update_and_undo_stop +from ayon_nuke.api.command import viewer_update_and_undo_stop class SelectContainers(InventoryAction): diff --git a/client/ayon_core/hosts/nuke/plugins/load/actions.py b/server_addon/nuke/client/ayon_nuke/plugins/load/actions.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/actions.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/actions.py index 53cb03087b..a4e2b156a3 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/actions.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/actions.py @@ -4,7 +4,7 @@ from ayon_core.lib import Logger from ayon_core.pipeline import load -from ayon_core.hosts.nuke.api import lib +from ayon_nuke.api import lib log = Logger.get_logger(__name__) diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py index 50af8a4eb9..f21920cdd2 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py @@ -6,7 +6,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( find_free_space_to_paste_nodes, maintained_selection, reset_selection, @@ -14,8 +14,8 @@ from ayon_core.hosts.nuke.api.lib import ( get_avalon_knob_data, set_avalon_knob_data ) -from ayon_core.hosts.nuke.api.command import viewer_update_and_undo_stop -from ayon_core.hosts.nuke.api import containerise, update_container +from ayon_nuke.api.command import viewer_update_and_undo_stop +from ayon_nuke.api import containerise, update_container class LoadBackdropNodes(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py index 3c7d4f3bb2..a1e0eb0ecc 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_camera_abc.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py @@ -5,12 +5,12 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( maintained_selection ) diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/load/load_clip.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py index 7fa90da86f..cc2e7359b9 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py @@ -12,11 +12,11 @@ from ayon_core.pipeline.colorspace import ( get_imageio_file_rules_colorspace_from_filepath, get_current_context_imageio_config_preset, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( get_imageio_input_colorspace, maintained_selection ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop, @@ -26,7 +26,7 @@ from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, IMAGE_EXTENSIONS ) -from ayon_core.hosts.nuke.api import plugin +from ayon_nuke.api import plugin class LoadClip(plugin.NukeLoader): diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_effects.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/load/load_effects.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py index be7420fcf0..ea397a6ae3 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_effects.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py index 9bb430b37b..3ced3fb4f0 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_effects_ip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py @@ -8,8 +8,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api import lib -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import lib +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py index 57d00795ae..b3822e9de2 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py @@ -5,13 +5,13 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( maintained_selection, get_avalon_knob_data, set_avalon_knob_data, swap_node_with_dependency, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py index ed2b1ec458..2fb3201108 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_gizmo_ip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py @@ -6,14 +6,14 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( maintained_selection, create_backdrop, get_avalon_knob_data, set_avalon_knob_data, swap_node_with_dependency, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_image.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/load_image.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py index b5fccd8a0d..b98668d983 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_image.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py @@ -7,10 +7,10 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( get_imageio_input_colorspace ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_matchmove.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/load/load_matchmove.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_model.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/load/load_model.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py index 40862cd1e0..2d509775f5 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py @@ -5,8 +5,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import maintained_selection -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api.lib import maintained_selection +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_ociolook.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/load/load_ociolook.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py index c369030b65..9210e83d6a 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_ociolook.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py @@ -10,7 +10,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( containerise, viewer_update_and_undo_stop, update_container, diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py rename to server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py index d6699be164..e68ae2651b 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_script_precomp.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py @@ -5,8 +5,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.nuke.api.lib import get_avalon_knob_data -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api.lib import get_avalon_knob_data +from ayon_nuke.api import ( containerise, update_container, viewer_update_and_undo_stop diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py similarity index 97% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_backdrop.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py index fc17de95b4..89136fa52b 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py @@ -1,6 +1,6 @@ from pprint import pformat import pyblish.api -from ayon_core.hosts.nuke.api import lib as pnlib +from ayon_nuke.api import lib as pnlib import nuke diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_context_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_context_data.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py index 0a032e5a2d..0a5f1563d6 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/collect_context_data.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py @@ -2,7 +2,7 @@ import os import nuke import pyblish.api from ayon_core.lib import get_version_from_path -import ayon_core.hosts.nuke.api as napi +import ayon_nuke.api as napi from ayon_core.pipeline import KnownPublishError diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_framerate.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_framerate.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_gizmo.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_headless_farm.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_model.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_model.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_nuke_instance_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_nuke_instance_data.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_reads.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_reads.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_slate_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_slate_node.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_workfile.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_workfile.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/collect_writes.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_backdrop.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py index e53ce9015a..ec9e664a7c 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py @@ -5,7 +5,7 @@ import nuke import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( maintained_selection, reset_selection, select_nodes diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_camera.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_camera.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py index a1a5acb63b..dfb4b04f9a 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_camera.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py @@ -6,7 +6,7 @@ import nuke import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api.lib import maintained_selection +from ayon_nuke.api.lib import maintained_selection class ExtractCamera(publish.Extractor): diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py similarity index 96% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_gizmo.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py index 2a2e2255fd..3a8d418ff3 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py @@ -4,8 +4,8 @@ import nuke import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api import utils as pnutils -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api import utils as pnutils +from ayon_nuke.api.lib import ( maintained_selection, reset_selection, select_nodes diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_headless_farm.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_model.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_model.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py index 36896fe595..fce47714a4 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py @@ -4,7 +4,7 @@ import nuke import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( maintained_selection, select_nodes ) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_ouput_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py similarity index 95% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_ouput_node.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py index b8e038a4f5..c0e5c4334e 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_ouput_node.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py @@ -1,6 +1,6 @@ import nuke import pyblish.api -from ayon_core.hosts.nuke.api.lib import maintained_selection +from ayon_nuke.api.lib import maintained_selection class CreateOutputNode(pyblish.api.ContextPlugin): diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_output_directory.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_output_directory.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_render_local.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_render_local.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_review_data.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_data_lut.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py similarity index 95% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_review_data_lut.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py index 0674a2dd55..808ba9d8a7 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_data_lut.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py @@ -2,8 +2,8 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api import plugin -from ayon_core.hosts.nuke.api.lib import maintained_selection +from ayon_nuke.api import plugin +from ayon_nuke.api.lib import maintained_selection class ExtractReviewDataLut(publish.Extractor): diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py index 82c7b6e4c5..99e02536a4 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_review_intermediates.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py @@ -4,8 +4,8 @@ from pprint import pformat import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api import plugin -from ayon_core.hosts.nuke.api.lib import maintained_selection +from ayon_nuke.api import plugin +from ayon_nuke.api.lib import maintained_selection class ExtractReviewIntermediates(publish.Extractor): diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_script_save.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_script_save.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/extract_slate_frame.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/publish/extract_slate_frame.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py index 627888ac92..ff01779208 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/extract_slate_frame.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py @@ -7,7 +7,7 @@ import pyblish.api import six from ayon_core.pipeline import publish -from ayon_core.hosts.nuke.api import ( +from ayon_nuke.api import ( maintained_selection, duplicate_node, get_view_process_node diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_asset_context.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_asset_context.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_asset_context.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_asset_context.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_backdrop.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_backdrop.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_backdrop.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_backdrop.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_gizmo.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_gizmo.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_gizmo.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_gizmo.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_knobs.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_knobs.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_knobs.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_knobs.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_output_resolution.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_output_resolution.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_output_resolution.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_output_resolution.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_proxy_mode.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_proxy_mode.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_proxy_mode.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_proxy_mode.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_rendered_frames.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_rendered_frames.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_rendered_frames.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_rendered_frames.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_script_attributes.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_script_attributes.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_script_attributes.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_script_attributes.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/help/validate_write_nodes.xml b/server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_write_nodes.xml similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/help/validate_write_nodes.xml rename to server_addon/nuke/client/ayon_nuke/plugins/publish/help/validate_write_nodes.xml diff --git a/client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/increment_script_version.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/remove_ouput_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/remove_ouput_node.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_asset_context.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_asset_context.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py index 93a30aa438..f747732cbf 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/validate_asset_context.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py @@ -10,7 +10,7 @@ from ayon_core.pipeline.publish import ( PublishXmlValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.nuke.api import SelectInstanceNodeAction +from ayon_nuke.api import SelectInstanceNodeAction class ValidateCorrectAssetContext( diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_backdrop.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_exposed_knobs.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_exposed_knobs.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py index 217fe6fb85..7ff13bca30 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/validate_exposed_knobs.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py @@ -1,7 +1,7 @@ import pyblish.api from ayon_core.pipeline.publish import get_errored_instances_from_context -from ayon_core.hosts.nuke.api.lib import link_knobs +from ayon_nuke.api.lib import link_knobs from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_gizmo.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_knobs.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_knobs.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_output_resolution.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_output_resolution.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_proxy_mode.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_proxy_mode.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_rendered_frames.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py similarity index 100% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_rendered_frames.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_script_attributes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py similarity index 98% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_script_attributes.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py index 2bd2034079..15a586580e 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/validate_script_attributes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( OptionalPyblishPluginMixin ) from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( WorkfileSettings ) diff --git a/client/ayon_core/hosts/nuke/plugins/publish/validate_write_nodes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/publish/validate_write_nodes.py rename to server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py index 0244c1d504..6a76bf06d1 100644 --- a/client/ayon_core/hosts/nuke/plugins/publish/validate_write_nodes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py @@ -2,7 +2,7 @@ from collections import defaultdict import pyblish.api from ayon_core.pipeline.publish import get_errored_instances_from_context -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( get_write_node_template_attr, set_node_knobs_from_settings, color_gui_to_int diff --git a/client/ayon_core/hosts/nuke/plugins/workfile_build/create_placeholder.py b/server_addon/nuke/client/ayon_nuke/plugins/workfile_build/create_placeholder.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/workfile_build/create_placeholder.py rename to server_addon/nuke/client/ayon_nuke/plugins/workfile_build/create_placeholder.py index a5490021e4..4d43d59bad 100644 --- a/client/ayon_core/hosts/nuke/plugins/workfile_build/create_placeholder.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/workfile_build/create_placeholder.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.workfile.workfile_template_builder import ( CreatePlaceholderItem, PlaceholderCreateMixin, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( find_free_space_to_paste_nodes, get_extreme_positions, get_group_io_nodes, @@ -18,7 +18,7 @@ from ayon_core.hosts.nuke.api.lib import ( duplicate_node, node_tempfile, ) -from ayon_core.hosts.nuke.api.workfile_template_builder import ( +from ayon_nuke.api.workfile_template_builder import ( NukePlaceholderPlugin ) diff --git a/client/ayon_core/hosts/nuke/plugins/workfile_build/load_placeholder.py b/server_addon/nuke/client/ayon_nuke/plugins/workfile_build/load_placeholder.py similarity index 99% rename from client/ayon_core/hosts/nuke/plugins/workfile_build/load_placeholder.py rename to server_addon/nuke/client/ayon_nuke/plugins/workfile_build/load_placeholder.py index 258f48c9d3..68bc10e41b 100644 --- a/client/ayon_core/hosts/nuke/plugins/workfile_build/load_placeholder.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/workfile_build/load_placeholder.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.workfile.workfile_template_builder import ( LoadPlaceholderItem, PlaceholderLoadMixin, ) -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( find_free_space_to_paste_nodes, get_extreme_positions, get_group_io_nodes, @@ -18,7 +18,7 @@ from ayon_core.hosts.nuke.api.lib import ( duplicate_node, node_tempfile, ) -from ayon_core.hosts.nuke.api.workfile_template_builder import ( +from ayon_nuke.api.workfile_template_builder import ( NukePlaceholderPlugin ) diff --git a/client/ayon_core/hosts/nuke/startup/__init__.py b/server_addon/nuke/client/ayon_nuke/startup/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/startup/__init__.py rename to server_addon/nuke/client/ayon_nuke/startup/__init__.py diff --git a/client/ayon_core/hosts/nuke/startup/clear_rendered.py b/server_addon/nuke/client/ayon_nuke/startup/clear_rendered.py similarity index 100% rename from client/ayon_core/hosts/nuke/startup/clear_rendered.py rename to server_addon/nuke/client/ayon_nuke/startup/clear_rendered.py diff --git a/client/ayon_core/hosts/nuke/startup/custom_write_node.py b/server_addon/nuke/client/ayon_nuke/startup/custom_write_node.py similarity index 99% rename from client/ayon_core/hosts/nuke/startup/custom_write_node.py rename to server_addon/nuke/client/ayon_nuke/startup/custom_write_node.py index f119e69919..5b0f240a49 100644 --- a/client/ayon_core/hosts/nuke/startup/custom_write_node.py +++ b/server_addon/nuke/client/ayon_nuke/startup/custom_write_node.py @@ -3,7 +3,7 @@ import os import nuke import nukescripts from ayon_core.pipeline import Anatomy, get_current_project_name -from ayon_core.hosts.nuke.api.lib import ( +from ayon_nuke.api.lib import ( set_node_knobs_from_settings, get_nuke_imageio_settings ) diff --git a/client/ayon_core/hosts/nuke/startup/frame_setting_for_read_nodes.py b/server_addon/nuke/client/ayon_nuke/startup/frame_setting_for_read_nodes.py similarity index 100% rename from client/ayon_core/hosts/nuke/startup/frame_setting_for_read_nodes.py rename to server_addon/nuke/client/ayon_nuke/startup/frame_setting_for_read_nodes.py diff --git a/client/ayon_core/hosts/nuke/startup/menu.py b/server_addon/nuke/client/ayon_nuke/startup/menu.py similarity index 64% rename from client/ayon_core/hosts/nuke/startup/menu.py rename to server_addon/nuke/client/ayon_nuke/startup/menu.py index 2559e2142a..c3dd8cda8f 100644 --- a/client/ayon_core/hosts/nuke/startup/menu.py +++ b/server_addon/nuke/client/ayon_nuke/startup/menu.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import install_host -from ayon_core.hosts.nuke.api import NukeHost +from ayon_nuke.api import NukeHost host = NukeHost() install_host(host) diff --git a/client/ayon_core/hosts/nuke/startup/write_to_read.py b/server_addon/nuke/client/ayon_nuke/startup/write_to_read.py similarity index 100% rename from client/ayon_core/hosts/nuke/startup/write_to_read.py rename to server_addon/nuke/client/ayon_nuke/startup/write_to_read.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/__init__.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/__init__.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/__init__.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/any_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/any_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/any_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/any_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/api_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/api_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/api_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/api_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/compiler/__init__.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/compiler/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/compiler/__init__.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/compiler/__init__.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/compiler/plugin_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/compiler/plugin_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/compiler/plugin_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/compiler/plugin_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_database.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_database.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_database.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_database.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_pool.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_pool.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/descriptor_pool.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/descriptor_pool.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/duration_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/duration_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/duration_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/duration_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/empty_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/empty_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/empty_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/empty_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/field_mask_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/field_mask_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/field_mask_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/field_mask_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/__init__.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/__init__.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/__init__.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/_parameterized.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/_parameterized.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/_parameterized.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/_parameterized.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/api_implementation.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/api_implementation.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/api_implementation.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/api_implementation.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/builder.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/builder.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/builder.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/builder.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/containers.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/containers.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/containers.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/containers.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/decoder.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/decoder.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/decoder.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/decoder.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/encoder.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/encoder.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/encoder.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/encoder.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/enum_type_wrapper.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/enum_type_wrapper.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/enum_type_wrapper.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/enum_type_wrapper.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/extension_dict.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/extension_dict.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/extension_dict.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/extension_dict.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/message_listener.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/message_listener.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/message_listener.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/message_listener.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/message_set_extensions_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/message_set_extensions_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/message_set_extensions_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/message_set_extensions_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/missing_enum_values_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/missing_enum_values_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/missing_enum_values_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/missing_enum_values_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_extensions_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_extensions_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_extensions_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_extensions_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_messages_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_messages_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/more_messages_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/more_messages_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/no_package_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/no_package_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/no_package_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/no_package_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/python_message.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/python_message.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/python_message.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/python_message.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/type_checkers.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/type_checkers.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/type_checkers.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/type_checkers.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/well_known_types.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/well_known_types.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/well_known_types.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/well_known_types.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/wire_format.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/wire_format.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/internal/wire_format.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/internal/wire_format.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/json_format.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/json_format.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/json_format.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/json_format.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/message.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/message.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/message.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/message.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/message_factory.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/message_factory.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/message_factory.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/message_factory.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/proto_builder.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/proto_builder.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/proto_builder.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/proto_builder.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/__init__.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/__init__.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/__init__.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/cpp_message.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/cpp_message.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/cpp_message.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/cpp_message.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/python_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/python_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/pyext/python_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/pyext/python_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/reflection.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/reflection.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/reflection.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/reflection.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/service.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/service.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/service.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/service.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/service_reflection.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/service_reflection.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/service_reflection.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/service_reflection.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/source_context_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/source_context_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/source_context_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/source_context_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/struct_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/struct_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/struct_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/struct_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/symbol_database.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/symbol_database.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/symbol_database.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/symbol_database.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/text_encoding.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/text_encoding.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/text_encoding.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/text_encoding.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/text_format.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/text_format.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/text_format.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/text_format.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/timestamp_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/timestamp_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/timestamp_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/timestamp_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/type_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/type_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/type_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/type_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/util/__init__.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/__init__.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/util/__init__.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/__init__.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/util/json_format_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/json_format_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/util/json_format_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/json_format_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/util/json_format_proto3_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/json_format_proto3_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/util/json_format_proto3_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/util/json_format_proto3_pb2.py diff --git a/client/ayon_core/hosts/nuke/vendor/google/protobuf/wrappers_pb2.py b/server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/wrappers_pb2.py similarity index 100% rename from client/ayon_core/hosts/nuke/vendor/google/protobuf/wrappers_pb2.py rename to server_addon/nuke/client/ayon_nuke/vendor/google/protobuf/wrappers_pb2.py From 6e0491af06fdb1ac28f9b7162979bd15ce6f32dd Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 27 May 2024 20:45:55 +0800 Subject: [PATCH 322/469] add options to read the deepexr file --- .../hosts/nuke/plugins/load/load_clip.py | 33 ++++++++++++++----- server_addon/nuke/package.py | 2 +- .../nuke/server/settings/loader_plugins.py | 7 ++-- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py index 7fa90da86f..23d8c4ae85 100644 --- a/client/ayon_core/hosts/nuke/plugins/load/load_clip.py +++ b/client/ayon_core/hosts/nuke/plugins/load/load_clip.py @@ -61,7 +61,8 @@ class LoadClip(plugin.NukeLoader): # option gui options_defaults = { "start_at_workfile": True, - "add_retime": True + "add_retime": True, + "deep_exr": False } node_name_template = "{class_name}_{ext}" @@ -78,6 +79,11 @@ class LoadClip(plugin.NukeLoader): "add_retime", help="Load with retime", default=cls.options_defaults["add_retime"] + ), + qargparse.Boolean( + "deep_exr", + help="Read with deep exr", + default=cls.options_defaults["deep_exr"] ) ] @@ -113,6 +119,9 @@ class LoadClip(plugin.NukeLoader): add_retime = options.get( "add_retime", self.options_defaults["add_retime"]) + deep_exr = options.get( + "deep_exr", self.options_defaults["deep_exr"]) + repre_id = repre_entity["id"] self.log.debug( @@ -153,13 +162,21 @@ class LoadClip(plugin.NukeLoader): return read_name = self._get_node_name(context) - - # Create the Loader with the filename path set - read_node = nuke.createNode( - "Read", - "name {}".format(read_name), - inpanel=False - ) + read_node = None + if deep_exr: + # Create the Loader with the filename path set + read_node = nuke.createNode( + "DeepRead", + "name {}".format(read_name), + inpanel=False + ) + else: + # Create the Loader with the filename path set + read_node = nuke.createNode( + "Read", + "name {}".format(read_name), + inpanel=False + ) # get colorspace colorspace = ( diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index d8decef208..e6f3a0bd44 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,3 @@ name = "nuke" title = "Nuke" -version = "0.1.14" +version = "0.1.15" diff --git a/server_addon/nuke/server/settings/loader_plugins.py b/server_addon/nuke/server/settings/loader_plugins.py index 531ea8d986..22cb469e8d 100644 --- a/server_addon/nuke/server/settings/loader_plugins.py +++ b/server_addon/nuke/server/settings/loader_plugins.py @@ -22,7 +22,9 @@ class LoadClipOptionsModel(BaseSettingsModel): add_retime: bool = SettingsField( title="Add retime" ) - + deep_exr: bool = SettingsField( + title="Deep Exr Read Node" + ) class LoadClipModel(BaseSettingsModel): enabled: bool = SettingsField( @@ -65,7 +67,8 @@ DEFAULT_LOADER_PLUGINS_SETTINGS = { "node_name_template": "{class_name}_{ext}", "options_defaults": { "start_at_workfile": True, - "add_retime": True + "add_retime": True, + "deep_exr": False } } } From f18f50ad9cd383cf6c0236bbbd69e28cebf47e9a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 27 May 2024 14:49:02 +0200 Subject: [PATCH 323/469] Add settings category "nuke" to various plugins for consistency. - Added a common settings category "nuke" to multiple plugin files. --- .../client/ayon_nuke/plugins/create/create_backdrop.py | 2 ++ .../client/ayon_nuke/plugins/create/create_camera.py | 2 ++ .../nuke/client/ayon_nuke/plugins/create/create_gizmo.py | 2 ++ .../nuke/client/ayon_nuke/plugins/create/create_model.py | 2 ++ .../client/ayon_nuke/plugins/create/create_source.py | 2 ++ .../ayon_nuke/plugins/create/create_write_image.py | 3 +++ .../ayon_nuke/plugins/create/create_write_prerender.py | 3 +++ .../ayon_nuke/plugins/create/create_write_render.py | 3 +++ .../client/ayon_nuke/plugins/create/workfile_creator.py | 3 +++ .../nuke/client/ayon_nuke/plugins/load/load_backdrop.py | 2 ++ .../client/ayon_nuke/plugins/load/load_camera_abc.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_clip.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_effects.py | 3 ++- .../client/ayon_nuke/plugins/load/load_effects_ip.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_gizmo.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_image.py | 6 +++--- .../nuke/client/ayon_nuke/plugins/load/load_matchmove.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_model.py | 2 ++ .../nuke/client/ayon_nuke/plugins/load/load_ociolook.py | 2 ++ .../client/ayon_nuke/plugins/load/load_script_precomp.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_backdrop.py | 2 ++ .../ayon_nuke/plugins/publish/collect_context_data.py | 2 ++ .../ayon_nuke/plugins/publish/collect_framerate.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_gizmo.py | 2 ++ .../ayon_nuke/plugins/publish/collect_headless_farm.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_model.py | 2 ++ .../plugins/publish/collect_nuke_instance_data.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_reads.py | 2 ++ .../ayon_nuke/plugins/publish/collect_slate_node.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_workfile.py | 2 ++ .../client/ayon_nuke/plugins/publish/collect_writes.py | 2 ++ .../client/ayon_nuke/plugins/publish/extract_backdrop.py | 2 ++ .../client/ayon_nuke/plugins/publish/extract_camera.py | 2 ++ .../client/ayon_nuke/plugins/publish/extract_gizmo.py | 2 ++ .../ayon_nuke/plugins/publish/extract_headless_farm.py | 2 ++ .../client/ayon_nuke/plugins/publish/extract_model.py | 2 ++ .../ayon_nuke/plugins/publish/extract_ouput_node.py | 4 +++- .../plugins/publish/extract_output_directory.py | 2 +- .../ayon_nuke/plugins/publish/extract_render_local.py | 2 ++ .../ayon_nuke/plugins/publish/extract_review_data.py | 2 ++ .../ayon_nuke/plugins/publish/extract_review_data_lut.py | 2 ++ .../plugins/publish/extract_review_intermediates.py | 2 ++ .../ayon_nuke/plugins/publish/extract_script_save.py | 4 +++- .../ayon_nuke/plugins/publish/extract_slate_frame.py | 2 ++ .../plugins/publish/increment_script_version.py | 5 +++-- .../ayon_nuke/plugins/publish/remove_ouput_node.py | 4 +++- .../ayon_nuke/plugins/publish/validate_asset_context.py | 2 ++ .../ayon_nuke/plugins/publish/validate_backdrop.py | 2 ++ .../ayon_nuke/plugins/publish/validate_exposed_knobs.py | 3 +++ .../client/ayon_nuke/plugins/publish/validate_gizmo.py | 2 ++ .../client/ayon_nuke/plugins/publish/validate_knobs.py | 2 ++ .../plugins/publish/validate_output_resolution.py | 2 ++ .../ayon_nuke/plugins/publish/validate_proxy_mode.py | 2 ++ .../plugins/publish/validate_rendered_frames.py | 2 ++ .../plugins/publish/validate_script_attributes.py | 2 ++ .../ayon_nuke/plugins/publish/validate_write_nodes.py | 2 ++ server_addon/nuke/package.py | 9 ++++++++- 58 files changed, 131 insertions(+), 11 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py index 6d50b066d7..f97b9efeb6 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_backdrop.py @@ -10,6 +10,8 @@ from ayon_nuke.api import ( class CreateBackdrop(NukeCreator): """Add Publishable Backdrop""" + settings_category = "nuke" + identifier = "create_backdrop" label = "Nukenodes (backdrop)" product_type = "nukenodes" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py index acf7448232..69e5b9c676 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_camera.py @@ -12,6 +12,8 @@ from ayon_nuke.api.lib import ( class CreateCamera(NukeCreator): """Add Publishable Camera""" + settings_category = "nuke" + identifier = "create_camera" label = "Camera (3d)" product_type = "camera" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py index cc1c4edf82..6be7cd58db 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_gizmo.py @@ -9,6 +9,8 @@ from ayon_nuke.api import ( class CreateGizmo(NukeCreator): """Add Publishable Group as gizmo""" + settings_category = "nuke" + identifier = "create_gizmo" label = "Gizmo (group)" product_type = "gizmo" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py index 6c1bf612b9..b7d7b740c2 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_model.py @@ -9,6 +9,8 @@ from ayon_nuke.api import ( class CreateModel(NukeCreator): """Add Publishable Camera""" + settings_category = "nuke" + identifier = "create_model" label = "Model (3d)" product_type = "model" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py index b2a21f032d..1579cebb1d 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_source.py @@ -15,6 +15,8 @@ from ayon_core.pipeline import ( class CreateSource(NukeCreator): """Add Publishable Read with source""" + settings_category = "nuke" + identifier = "create_source" label = "Source (read)" product_type = "source" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py index 43f9d4c207..11f574732a 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py @@ -16,6 +16,9 @@ from ayon_nuke.api.plugin import exposed_write_knobs class CreateWriteImage(napi.NukeWriteCreator): + + settings_category = "nuke" + identifier = "create_write_image" label = "Image (write)" product_type = "image" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py index 91b0022c86..c18217c4c5 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py @@ -13,6 +13,9 @@ from ayon_nuke.api.plugin import exposed_write_knobs class CreateWritePrerender(napi.NukeWriteCreator): + + settings_category = "nuke" + identifier = "create_write_prerender" label = "Prerender (write)" product_type = "prerender" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py index 85a09d65b7..8ff9b2b15e 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py @@ -13,6 +13,9 @@ from ayon_nuke.api.plugin import exposed_write_knobs class CreateWriteRender(napi.NukeWriteCreator): + + settings_category = "nuke" + identifier = "create_write_render" label = "Render (write)" product_type = "render" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py b/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py index c49ca1f502..463d898224 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/workfile_creator.py @@ -13,6 +13,9 @@ import nuke class WorkfileCreator(AutoCreator): + + settings_category = "nuke" + identifier = "workfile" product_type = "workfile" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py index f21920cdd2..054a56d041 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_backdrop.py @@ -25,6 +25,8 @@ class LoadBackdropNodes(load.LoaderPlugin): representations = {"*"} extensions = {"nk"} + settings_category = "nuke" + label = "Import Nuke Nodes" order = 0 icon = "eye" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py index a1e0eb0ecc..3930cf52fa 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_camera_abc.py @@ -24,6 +24,8 @@ class AlembicCameraLoader(load.LoaderPlugin): representations = {"*"} extensions = {"abc"} + settings_category = "nuke" + label = "Load Alembic Camera" icon = "camera" color = "orange" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py index cc2e7359b9..8be1c7d109 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_clip.py @@ -48,6 +48,8 @@ class LoadClip(plugin.NukeLoader): ext.lstrip(".") for ext in IMAGE_EXTENSIONS.union(VIDEO_EXTENSIONS) ) + settings_category = "nuke" + label = "Load Clip" order = -20 icon = "file-video-o" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py index ea397a6ae3..e923a02424 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects.py @@ -22,13 +22,14 @@ class LoadEffects(load.LoaderPlugin): representations = {"*"} extensions = {"json"} + settings_category = "nuke" + label = "Load Effects - nodes" order = 0 icon = "cc" color = "white" ignore_attr = ["useLifetime"] - def load(self, context, name, namespace, data): """ Loading function to get the soft effects to particular read node diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py index 3ced3fb4f0..ce7e7debeb 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_effects_ip.py @@ -23,6 +23,8 @@ class LoadEffectsInputProcess(load.LoaderPlugin): representations = {"*"} extensions = {"json"} + settings_category = "nuke" + label = "Load Effects - Input Process" order = 0 icon = "eye" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py index b3822e9de2..1c91af0c1c 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo.py @@ -25,6 +25,8 @@ class LoadGizmo(load.LoaderPlugin): representations = {"*"} extensions = {"nk"} + settings_category = "nuke" + label = "Load Gizmo" order = 0 icon = "dropbox" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py index 2fb3201108..36e878fdf1 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_gizmo_ip.py @@ -27,6 +27,8 @@ class LoadGizmoInputProcess(load.LoaderPlugin): representations = {"*"} extensions = {"nk"} + settings_category = "nuke" + label = "Load Gizmo - Input Process" order = 0 icon = "eye" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py index b98668d983..0c43f5a5ca 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_image.py @@ -33,9 +33,9 @@ class LoadImage(load.LoaderPlugin): "image", } representations = {"*"} - extensions = set( - ext.lstrip(".") for ext in IMAGE_EXTENSIONS - ) + extensions = set(ext.lstrip(".") for ext in IMAGE_EXTENSIONS) + + settings_category = "nuke" label = "Load Image" order = -10 diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py index beebd0458f..c1b5a24504 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_matchmove.py @@ -11,6 +11,8 @@ class MatchmoveLoader(load.LoaderPlugin): representations = {"*"} extensions = {"py"} + settings_category = "nuke" + defaults = ["Camera", "Object"] label = "Run matchmove script" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py index 2d509775f5..551147be96 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_model.py @@ -22,6 +22,8 @@ class AlembicModelLoader(load.LoaderPlugin): representations = {"*"} extensions = {"abc"} + settings_category = "nuke" + label = "Load Alembic" icon = "cube" color = "orange" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py index 9210e83d6a..bdff8d7e28 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_ociolook.py @@ -24,6 +24,8 @@ class LoadOcioLookNodes(load.LoaderPlugin): representations = {"*"} extensions = {"json"} + settings_category = "nuke" + label = "Load OcioLook [nodes]" order = 0 icon = "cc" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py b/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py index e68ae2651b..cf543dabfd 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/load/load_script_precomp.py @@ -20,6 +20,8 @@ class LinkAsGroup(load.LoaderPlugin): representations = {"*"} extensions = {"nk"} + settings_category = "nuke" + label = "Load Precomp" order = 0 icon = "file" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py index 89136fa52b..1471159380 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_backdrop.py @@ -13,6 +13,8 @@ class CollectBackdrops(pyblish.api.InstancePlugin): hosts = ["nuke"] families = ["nukenodes"] + settings_category = "nuke" + def process(self, instance): self.log.debug(pformat(instance.data)) diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py index 0a5f1563d6..33c8e63e82 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_context_data.py @@ -13,6 +13,8 @@ class CollectContextData(pyblish.api.ContextPlugin): label = "Collect context data" hosts = ['nuke'] + settings_category = "nuke" + def process(self, context): # sourcery skip: avoid-builtin-shadow root_node = nuke.root() diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py index 88a449e745..cd77eab0f1 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_framerate.py @@ -13,5 +13,7 @@ class CollectFramerate(pyblish.api.ContextPlugin): "nukeassist" ] + settings_category = "nuke" + def process(self, context): context.data["fps"] = nuke.root()["fps"].getValue() diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py index fda1c7ac31..ece9823b37 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_gizmo.py @@ -11,6 +11,8 @@ class CollectGizmo(pyblish.api.InstancePlugin): hosts = ["nuke"] families = ["gizmo"] + settings_category = "nuke" + def process(self, instance): gizmo_node = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py index 3f49a2bf01..c00b9a8f5d 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_headless_farm.py @@ -13,6 +13,8 @@ class CollectRenderOnFarm(pyblish.api.ContextPlugin): label = "Collect Render On Farm" hosts = ["nuke"] + settings_category = "nuke" + def process(self, context): if not context.data.get("render_on_farm", False): return diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py index 1a2bc9c019..f4266bbbcb 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_model.py @@ -11,6 +11,8 @@ class CollectModel(pyblish.api.InstancePlugin): hosts = ["nuke"] families = ["model"] + settings_category = "nuke" + def process(self, instance): geo_node = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py index 951072ff3f..d1392a8460 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_nuke_instance_data.py @@ -11,6 +11,8 @@ class CollectInstanceData(pyblish.api.InstancePlugin): label = "Collect Nuke Instance Data" hosts = ["nuke", "nukeassist"] + settings_category = "nuke" + # presets sync_workfile_version_on_families = [] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py index af17933eb1..439374e825 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_reads.py @@ -12,6 +12,8 @@ class CollectNukeReads(pyblish.api.InstancePlugin): hosts = ["nuke", "nukeassist"] families = ["source"] + settings_category = "nuke" + def process(self, instance): self.log.debug("checking instance: {}".format(instance)) diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py index ac30bd6051..bb3b0083ab 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_slate_node.py @@ -10,6 +10,8 @@ class CollectSlate(pyblish.api.InstancePlugin): hosts = ["nuke"] families = ["render"] + settings_category = "nuke" + def process(self, instance): node = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py index 0f03572f8b..e4bd5ed129 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_workfile.py @@ -11,6 +11,8 @@ class CollectWorkfile(pyblish.api.InstancePlugin): hosts = ['nuke'] families = ["workfile"] + settings_category = "nuke" + def process(self, instance): # sourcery skip: avoid-builtin-shadow script_data = instance.context.data["scriptData"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py index 27525bcad1..c90f335d07 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py @@ -14,6 +14,8 @@ class CollectNukeWrites(pyblish.api.InstancePlugin, hosts = ["nuke", "nukeassist"] families = ["render", "prerender", "image"] + settings_category = "nuke" + # cache _write_nodes = {} _frame_ranges = {} diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py index ec9e664a7c..8c42920979 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_backdrop.py @@ -25,6 +25,8 @@ class ExtractBackdropNode(publish.Extractor): hosts = ["nuke"] families = ["nukenodes"] + settings_category = "nuke" + def process(self, instance): tmp_nodes = [] child_nodes = instance.data["transientData"]["childNodes"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py index dfb4b04f9a..83914087e3 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_camera.py @@ -17,6 +17,8 @@ class ExtractCamera(publish.Extractor): families = ["camera"] hosts = ["nuke"] + settings_category = "nuke" + # presets write_geo_knobs = [ ("file_type", "abc"), diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py index 3a8d418ff3..05e3164163 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_gizmo.py @@ -23,6 +23,8 @@ class ExtractGizmo(publish.Extractor): hosts = ["nuke"] families = ["gizmo"] + settings_category = "nuke" + def process(self, instance): tmp_nodes = [] orig_grpn = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py index 4ba55f8c46..4721fe4462 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_headless_farm.py @@ -15,6 +15,8 @@ class ExtractRenderOnFarm(pyblish.api.InstancePlugin): hosts = ["nuke"] families = ["render_on_farm"] + settings_category = "nuke" + def process(self, instance): if not instance.context.data.get("render_on_farm", False): return diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py index fce47714a4..58b9d4179b 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_model.py @@ -18,6 +18,8 @@ class ExtractModel(publish.Extractor): families = ["model"] hosts = ["nuke"] + settings_category = "nuke" + # presets write_geo_knobs = [ ("file_type", "abc"), diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py index c0e5c4334e..52072cddc5 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_ouput_node.py @@ -11,7 +11,9 @@ class CreateOutputNode(pyblish.api.ContextPlugin): label = 'Output Node Create' order = pyblish.api.ExtractorOrder + 0.4 families = ["workfile"] - hosts = ['nuke'] + hosts = ["nuke"] + + settings_category = "nuke" def process(self, context): # capture selection state diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py index d999d200de..45156ca9ae 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_output_directory.py @@ -10,7 +10,7 @@ class ExtractOutputDirectory(pyblish.api.InstancePlugin): label = "Output Directory" optional = True - # targets = ["process"] + settings_category = "nuke" def process(self, instance): diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py index c8be2a5564..55a2beea81 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py @@ -25,6 +25,8 @@ class NukeRenderLocal(publish.Extractor, hosts = ["nuke"] families = ["render.local", "prerender.local", "image.local"] + settings_category = "nuke" + def process(self, instance): child_nodes = ( instance.data.get("transientData", {}).get("childNodes") diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py index 258a019319..856616898b 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data.py @@ -16,6 +16,8 @@ class ExtractReviewData(publish.Extractor): families = ["review"] hosts = ["nuke"] + settings_category = "nuke" + def process(self, instance): fpath = instance.data["path"] ext = os.path.splitext(fpath)[-1][1:] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py index 808ba9d8a7..d3377807ea 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_data_lut.py @@ -19,6 +19,8 @@ class ExtractReviewDataLut(publish.Extractor): families = ["review"] hosts = ["nuke"] + settings_category = "nuke" + def process(self, instance): self.log.debug("Creating staging dir...") if "representations" in instance.data: diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py index 99e02536a4..c12d14adf4 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_review_intermediates.py @@ -22,6 +22,8 @@ class ExtractReviewIntermediates(publish.Extractor): families = ["review"] hosts = ["nuke"] + settings_category = "nuke" + # presets viewer_lut_raw = None outputs = {} diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py index d325684a7c..ea584b6529 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_script_save.py @@ -6,7 +6,9 @@ class ExtractScriptSave(pyblish.api.InstancePlugin): """Save current Nuke workfile script""" label = 'Script Save' order = pyblish.api.ExtractorOrder - 0.1 - hosts = ['nuke'] + hosts = ["nuke"] + + settings_category = "nuke" def process(self, instance): diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py index ff01779208..47750ea637 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_slate_frame.py @@ -27,6 +27,8 @@ class ExtractSlateFrame(publish.Extractor): families = ["slate"] hosts = ["nuke"] + settings_category = "nuke" + # Settings values key_value_mapping = { "f_submission_note": { diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py index 70fd04a985..36659aa2d2 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/increment_script_version.py @@ -1,4 +1,3 @@ - import nuke import pyblish.api @@ -10,7 +9,9 @@ class IncrementScriptVersion(pyblish.api.ContextPlugin): label = "Increment Script Version" optional = True families = ["workfile"] - hosts = ['nuke'] + hosts = ["nuke"] + + settings_category = "nuke" def process(self, context): if not context.data.get("increment_script_version", True): diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py index fb77e8638c..4c17cb5f56 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/remove_ouput_node.py @@ -9,7 +9,9 @@ class RemoveOutputNode(pyblish.api.ContextPlugin): label = 'Output Node Remove' order = pyblish.api.IntegratorOrder + 0.4 families = ["workfile"] - hosts = ['nuke'] + hosts = ["nuke"] + + settings_category = "nuke" def process(self, context): try: diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py index f747732cbf..903648fd1b 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_asset_context.py @@ -34,6 +34,8 @@ class ValidateCorrectAssetContext( ] optional = True + settings_category = "nuke" + @classmethod def apply_settings(cls, project_settings): """Apply deprecated settings from project settings. diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py index 22344c661e..133dc6ec93 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py @@ -65,6 +65,8 @@ class ValidateBackdrop( hosts = ["nuke"] actions = [SelectCenterInNodeGraph] + settings_category = "nuke" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py index 7ff13bca30..d1b7c146fb 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_exposed_knobs.py @@ -52,6 +52,9 @@ class ValidateExposedKnobs( label = "Validate Exposed Knobs" actions = [RepairExposedKnobs] hosts = ["nuke"] + + settings_category = "nuke" + product_types_mapping = { "render": "CreateWriteRender", "prerender": "CreateWritePrerender", diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py index 2cdcb90d70..3804efc9ae 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py @@ -43,6 +43,8 @@ class ValidateGizmo(pyblish.api.InstancePlugin): hosts = ["nuke"] actions = [OpenFailedGroupNode] + settings_category = "nuke" + def process(self, instance): grpn = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py index 8bcde9609d..ea03bd94b2 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_knobs.py @@ -32,6 +32,8 @@ class ValidateKnobs(pyblish.api.ContextPlugin): actions = [RepairContextAction] optional = True + settings_category = "nuke" + knobs = "{}" def process(self, context): diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py index e8a00d2294..c7a6f7d47c 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py @@ -27,6 +27,8 @@ class ValidateOutputResolution( hosts = ["nuke"] actions = [RepairAction] + settings_category = "nuke" + missing_msg = "Missing Reformat node in render group node" resolution_msg = "Reformat is set to wrong format" diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py index 26e54295c9..1eb858b17e 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_proxy_mode.py @@ -25,6 +25,8 @@ class ValidateProxyMode(pyblish.api.ContextPlugin): hosts = ["nuke"] actions = [FixProxyMode] + settings_category = "nuke" + def process(self, context): rootNode = nuke.root() diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py index 76ac7e97ad..20b7f6a6ac 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_rendered_frames.py @@ -54,6 +54,8 @@ class ValidateRenderedFrames(pyblish.api.InstancePlugin): hosts = ["nuke", "nukestudio"] actions = [RepairCollectionActionToLocal, RepairCollectionActionToFarm] + settings_category = "nuke" + def process(self, instance): node = instance.data["transientData"]["node"] diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py index 15a586580e..617d8d835b 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_script_attributes.py @@ -23,6 +23,8 @@ class ValidateScriptAttributes( optional = True actions = [RepairAction] + settings_category = "nuke" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py index 6a76bf06d1..d642a4314c 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_write_nodes.py @@ -59,6 +59,8 @@ class ValidateNukeWriteNode( actions = [RepairNukeWriteNodeAction] hosts = ["nuke"] + settings_category = "nuke" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/nuke/package.py b/server_addon/nuke/package.py index d8decef208..af36e61cef 100644 --- a/server_addon/nuke/package.py +++ b/server_addon/nuke/package.py @@ -1,3 +1,10 @@ name = "nuke" title = "Nuke" -version = "0.1.14" +version = "0.2.0" + +client_dir = "ayon_nuke" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 18b7e6ec9e0e8b21a3926e15f8575e04aae004d0 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 27 May 2024 15:08:54 +0200 Subject: [PATCH 324/469] Add new version info for "nuke" addon. - Update the MOVED_ADDON_MILESTONE_VERSIONS dictionary to include the "nuke" addon with version 0.2.0. --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index dba25510be..64627ef32e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -54,6 +54,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "clockify": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), + "nuke": VersionInfo(0, 2, 0), } # Inherit from `object` for Python 2 hosts From ca29fe77c7ec1939b863cbdb5f916f381ecfbbf5 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 27 May 2024 15:13:25 +0200 Subject: [PATCH 325/469] add line --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 64627ef32e..939fab68b8 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -57,6 +57,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "nuke": VersionInfo(0, 2, 0), } + # Inherit from `object` for Python 2 hosts class _ModuleClass(object): """Fake module class for storing AYON addons. From 007d4a453d2a69d143cf574db837a3f32ae930fb Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 27 May 2024 15:24:14 +0200 Subject: [PATCH 326/469] import statements to use the correct module path for Nuke host API. --- server_addon/nuke/client/ayon_nuke/api/pipeline.py | 2 +- .../nuke/client/ayon_nuke/plugins/create/create_write_image.py | 2 +- .../client/ayon_nuke/plugins/create/create_write_prerender.py | 2 +- .../nuke/client/ayon_nuke/plugins/create/create_write_render.py | 2 +- .../nuke/client/ayon_nuke/plugins/publish/collect_writes.py | 2 +- .../client/ayon_nuke/plugins/publish/extract_render_local.py | 2 +- .../nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py | 2 +- .../nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py | 2 +- .../ayon_nuke/plugins/publish/validate_output_resolution.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/api/pipeline.py b/server_addon/nuke/client/ayon_nuke/api/pipeline.py index 0425dd20d4..ad8e17b1f6 100644 --- a/server_addon/nuke/client/ayon_nuke/api/pipeline.py +++ b/server_addon/nuke/client/ayon_nuke/api/pipeline.py @@ -28,7 +28,7 @@ from ayon_core.pipeline import ( ) from ayon_core.pipeline.workfile import BuildWorkfile from ayon_core.tools.utils import host_tools -from ayon_core.hosts.nuke import NUKE_ROOT_DIR +from ayon_nuke import NUKE_ROOT_DIR from ayon_core.tools.workfile_template_build import open_template_ui from .lib import ( diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py index 11f574732a..2268817e76 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_image.py @@ -11,7 +11,7 @@ from ayon_core.lib import ( UISeparatorDef, EnumDef ) -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_nuke.api.plugin import exposed_write_knobs diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py index c18217c4c5..014e91e81c 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_prerender.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( from ayon_core.lib import ( BoolDef ) -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_nuke.api.plugin import exposed_write_knobs diff --git a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py index 8ff9b2b15e..bed081c882 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/create/create_write_render.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( from ayon_core.lib import ( BoolDef ) -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_nuke.api.plugin import exposed_write_knobs diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py index c90f335d07..816f493d72 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/collect_writes.py @@ -1,7 +1,7 @@ import os import nuke import pyblish.api -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_core.pipeline import publish diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py index 55a2beea81..c865684e7a 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/extract_render_local.py @@ -4,7 +4,7 @@ import shutil import pyblish.api import clique import nuke -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_core.pipeline import publish from ayon_core.lib import collect_frames diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py index 133dc6ec93..f7b94e0c82 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_backdrop.py @@ -1,6 +1,6 @@ import nuke import pyblish -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_core.pipeline.publish import ( ValidateContentsOrder, diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py index 3804efc9ae..55249ae931 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_gizmo.py @@ -1,6 +1,6 @@ import pyblish from ayon_core.pipeline import PublishXmlValidationError -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi import nuke diff --git a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py index c7a6f7d47c..440cb8b758 100644 --- a/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py +++ b/server_addon/nuke/client/ayon_nuke/plugins/publish/validate_output_resolution.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.nuke import api as napi +from ayon_nuke import api as napi from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline import ( PublishXmlValidationError, From 45fc7f02d1e170f38249541d6dba77b519980884 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 15:38:06 +0200 Subject: [PATCH 327/469] fix support for PySide6 in loader --- client/ayon_core/tools/loader/ui/products_delegates.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 6bcb78ec66..51424034aa 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -107,7 +107,10 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): style = QtWidgets.QApplication.style() style.drawControl( - style.CE_ItemViewItem, option, painter, option.widget + QtWidgets.QCommonStyle.CE_ItemViewItem, + option, + painter, + option.widget ) painter.save() @@ -207,7 +210,10 @@ class StatusDelegate(QtWidgets.QStyledItemDelegate): style = QtWidgets.QApplication.style() style.drawControl( - style.CE_ItemViewItem, option, painter, option.widget + QtWidgets.QCommonStyle.CE_ItemViewItem, + option, + painter, + option.widget ) painter.save() From afe0887d96e686937d3e1dca4acdaf7163eb11bf Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 27 May 2024 15:45:53 +0200 Subject: [PATCH 328/469] fix more constants --- .../tools/loader/ui/products_delegates.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 51424034aa..1ac19b53eb 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -122,9 +122,14 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): pen.setColor(fg_color) painter.setPen(pen) - text_rect = style.subElementRect(style.SE_ItemViewItemText, option) + text_rect = style.subElementRect( + QtWidgets.QCommonStyle.SE_ItemViewItemText, + option + ) text_margin = style.proxy().pixelMetric( - style.PM_FocusFrameHMargin, option, option.widget + QtWidgets.QCommonStyle.PM_FocusFrameHMargin, + option, + option.widget ) + 1 painter.drawText( @@ -218,9 +223,14 @@ class StatusDelegate(QtWidgets.QStyledItemDelegate): painter.save() - text_rect = style.subElementRect(style.SE_ItemViewItemText, option) + text_rect = style.subElementRect( + QtWidgets.QCommonStyle.SE_ItemViewItemText, + option + ) text_margin = style.proxy().pixelMetric( - style.PM_FocusFrameHMargin, option, option.widget + QtWidgets.QCommonStyle.PM_FocusFrameHMargin, + option, + option.widget ) + 1 padded_text_rect = text_rect.adjusted( text_margin, 0, - text_margin, 0 From 3b2901772ed464ae0ae84e658c2ae0d07126c8c0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 27 May 2024 22:10:57 +0800 Subject: [PATCH 329/469] remove unused version.py in the client folder --- .../substancepainter/client/ayon_substancepainter/version.py | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 server_addon/substancepainter/client/ayon_substancepainter/version.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py deleted file mode 100644 index b4293649fe..0000000000 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" -__version__ = "0.2.0" From 59d84ad2c58f2ae8d41bd0601d94c125b019a373 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 28 May 2024 12:54:25 +0200 Subject: [PATCH 330/469] Update product type from "editorial_pckg" to "editorial_pkg" throughout the codebase. Fix typos and align identifiers, labels, and descriptions accordingly. --- .../plugins/load/load_editorial_package.py | 2 +- .../plugins/create/create_editorial_package.py | 12 ++++++------ .../publish/collect_editorial_package.py | 14 +++++++------- .../plugins/publish/extract_editorial_pckg.py | 18 +++++++++--------- .../publish/validate_editorial_package.py | 14 +++++++------- server_addon/traypublisher/package.py | 2 +- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py index 9b723b0130..438f277775 100644 --- a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py +++ b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py @@ -15,7 +15,7 @@ class LoadEditorialPackage(load.LoaderPlugin): and timeline structure. """ - product_types = {"editorial_pckg"} + product_types = {"editorial_pkg"} representations = {"*"} extensions = {"otio"} diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py index 5f0a84be4a..bc003c0601 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/create/create_editorial_package.py @@ -16,13 +16,13 @@ class EditorialPackageCreator(TrayPublishCreator): """Creates instance for OTIO file from published folder. Folder contains OTIO file and exported .mov files. Process should publish - whole folder as single `editorial_pckg` product type and (possibly) convert + whole folder as single `editorial_pkg` product type and (possibly) convert .mov files into different format and copy them into `publish` `resources` subfolder. """ - identifier = "editorial_pckg" + identifier = "editorial_pkg" label = "Editorial package" - product_type = "editorial_pckg" + product_type = "editorial_pkg" description = "Publish folder with OTIO file and resources" # Position batch creator after simple creators @@ -89,8 +89,8 @@ class EditorialPackageCreator(TrayPublishCreator): def get_detail_description(self): return """# Publish folder with OTIO file and video clips - Folder contains OTIO file and exported .mov files. Process should - publish whole folder as single `editorial_pckg` product type and - (possibly) convert .mov files into different format and copy them into + Folder contains OTIO file and exported .mov files. Process should + publish whole folder as single `editorial_pkg` product type and + (possibly) convert .mov files into different format and copy them into `publish` `resources` subfolder. """ diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py index cb1277546c..fb7d5cd5a1 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/collect_editorial_package.py @@ -1,10 +1,10 @@ -"""Produces instance.data["editorial_pckg"] data used during integration. +"""Produces instance.data["editorial_pkg"] data used during integration. Requires: instance.data["creator_attributes"]["path"] - from creator Provides: - instance -> editorial_pckg (dict): + instance -> editorial_pkg (dict): folder_path (str) otio_path (str) - from dragged folder resource_paths (list) @@ -24,7 +24,7 @@ class CollectEditorialPackage(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder - 0.1 hosts = ["traypublisher"] - families = ["editorial_pckg"] + families = ["editorial_pkg"] def process(self, instance): folder_path = instance.data["creator_attributes"]["folder_path"] @@ -34,14 +34,14 @@ class CollectEditorialPackage(pyblish.api.InstancePlugin): )) return - instance.data["editorial_pckg"] = {} - instance.data["editorial_pckg"]["folder_path"] = folder_path + instance.data["editorial_pkg"] = {} + instance.data["editorial_pkg"]["folder_path"] = folder_path otio_path, resource_paths = ( self._get_otio_and_resource_paths(folder_path)) - instance.data["editorial_pckg"]["otio_path"] = otio_path - instance.data["editorial_pckg"]["resource_paths"] = resource_paths + instance.data["editorial_pkg"]["otio_path"] = otio_path + instance.data["editorial_pkg"]["resource_paths"] = resource_paths def _get_otio_and_resource_paths(self, folder_path): otio_path = None diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py index 6dd4e84704..3e391b5f6e 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/extract_editorial_pckg.py @@ -20,27 +20,27 @@ class ExtractEditorialPckgConversion(publish.Extractor): label = "Extract Editorial Package" order = pyblish.api.ExtractorOrder - 0.45 hosts = ["traypublisher"] - families = ["editorial_pckg"] + families = ["editorial_pkg"] def process(self, instance): - editorial_pckg_data = instance.data.get("editorial_pckg") + editorial_pkg_data = instance.data.get("editorial_pkg") - otio_path = editorial_pckg_data["otio_path"] + otio_path = editorial_pkg_data["otio_path"] otio_basename = os.path.basename(otio_path) staging_dir = self.staging_dir(instance) - editorial_pckg_repre = { - 'name': "editorial_pckg", + editorial_pkg_repre = { + 'name': "editorial_pkg", 'ext': "otio", 'files': otio_basename, "stagingDir": staging_dir, } otio_staging_path = os.path.join(staging_dir, otio_basename) - instance.data["representations"].append(editorial_pckg_repre) + instance.data["representations"].append(editorial_pkg_repre) publish_resource_folder = self._get_publish_resource_folder(instance) - resource_paths = editorial_pckg_data["resource_paths"] + resource_paths = editorial_pkg_data["resource_paths"] transfers = self._get_transfers(resource_paths, publish_resource_folder) @@ -61,13 +61,13 @@ class ExtractEditorialPckgConversion(publish.Extractor): source_to_rootless = self._get_resource_path_mapping(instance, transfers) - otio_data = editorial_pckg_data["otio_data"] + otio_data = editorial_pkg_data["otio_data"] otio_data = self._replace_target_urls(otio_data, source_to_rootless) opentimelineio.adapters.write_to_file(otio_data, otio_staging_path) self.log.info("Added Editorial Package representation: {}".format( - editorial_pckg_repre)) + editorial_pkg_repre)) def _get_publish_resource_folder(self, instance): """Calculates publish folder and create it.""" diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py index c63c4a6a73..42755e1396 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py @@ -17,21 +17,21 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder - 0.49 hosts = ["traypublisher"] - families = ["editorial_pckg"] + families = ["editorial_pkg"] def process(self, instance): - editorial_pckg_data = instance.data.get("editorial_pckg") - if not editorial_pckg_data: + editorial_pkg_data = instance.data.get("editorial_pkg") + if not editorial_pkg_data: raise PublishValidationError("Editorial package not collected") - folder_path = editorial_pckg_data["folder_path"] + folder_path = editorial_pkg_data["folder_path"] - otio_path = editorial_pckg_data["otio_path"] + otio_path = editorial_pkg_data["otio_path"] if not otio_path: raise PublishValidationError( f"Folder {folder_path} missing otio file") - resource_paths = editorial_pckg_data["resource_paths"] + resource_paths = editorial_pkg_data["resource_paths"] resource_file_names = {os.path.basename(path) for path in resource_paths} @@ -50,7 +50,7 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): f"Otio file contains missing files `{missing_files}`.\n\n" f"Please add them to `{folder_path}` and republish.") - instance.data["editorial_pckg"]["otio_data"] = otio_data + instance.data["editorial_pkg"]["otio_data"] = otio_data def _get_all_target_urls(self, otio_data): target_urls = [] diff --git a/server_addon/traypublisher/package.py b/server_addon/traypublisher/package.py index ea04835b45..c9b94c2b72 100644 --- a/server_addon/traypublisher/package.py +++ b/server_addon/traypublisher/package.py @@ -1,6 +1,6 @@ name = "traypublisher" title = "TrayPublisher" -version = "0.2.0" +version = "0.2.1" client_dir = "ayon_traypublisher" From c32700c40c49410636d81d771b3323cf93b1ce68 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 28 May 2024 13:32:56 +0200 Subject: [PATCH 331/469] fix sorting of versions in loader comboboxes --- client/ayon_core/tools/loader/abstract.py | 28 +++++++++++++++---- .../tools/loader/ui/products_model.py | 4 ++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/tools/loader/abstract.py b/client/ayon_core/tools/loader/abstract.py index 509db4d037..a1c1e6a062 100644 --- a/client/ayon_core/tools/loader/abstract.py +++ b/client/ayon_core/tools/loader/abstract.py @@ -172,12 +172,30 @@ class VersionItem: def __gt__(self, other): if not isinstance(other, VersionItem): return False - if ( - other.version == self.version - and self.is_hero - ): + # Make sure hero versions are positive + version = abs(self.version) + other_version = abs(other.version) + # Hero version is greater than non-hero + if version == other_version: + return self.is_hero + return version > other_version + + def __lt__(self, other): + if not isinstance(other, VersionItem): return True - return other.version < self.version + # Make sure hero versions are positive + version = abs(self.version) + other_version = abs(other.version) + # Non-hero version is lesser than hero + if version == other_version: + return not self.is_hero + return version < other_version + + def __ge__(self, other): + return self.__eq__(other) or self.__gt__(other) + + def __le__(self, other): + return self.__eq__(other) or self.__lt__(other) def to_data(self): return { diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index f309473d10..fc7375d8c1 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -198,7 +198,9 @@ class ProductsModel(QtGui.QStandardItemModel): product_item = self._product_items_by_id.get(product_id) if product_item is None: return None - return list(product_item.version_items.values()) + product_items = list(product_item.version_items.values()) + product_items.sort(reverse=True) + return product_items if role == QtCore.Qt.EditRole: return None From 95976b7cfdbfeadda4aab128b30fea737638c6ff Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Tue, 28 May 2024 13:33:46 +0200 Subject: [PATCH 332/469] actually return parent on PublishAttributeValues --- client/ayon_core/pipeline/create/context.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/create/context.py b/client/ayon_core/pipeline/create/context.py index 7615ce6aee..45846553a4 100644 --- a/client/ayon_core/pipeline/create/context.py +++ b/client/ayon_core/pipeline/create/context.py @@ -681,7 +681,7 @@ class PublishAttributeValues(AttributeValues): @property def parent(self): - self.publish_attributes.parent + return self.publish_attributes.parent class PublishAttributes: From 7e2647881130b5e976a20e97973581deda9f780e Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 28 May 2024 13:58:37 +0200 Subject: [PATCH 333/469] Add functionality to create versioned bin for editorial package. Creates a new versioned bin using the name of the package and its version. --- .../hosts/resolve/plugins/load/load_editorial_package.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py index 438f277775..33395534fa 100644 --- a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py +++ b/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py @@ -32,6 +32,12 @@ class LoadEditorialPackage(load.LoaderPlugin): project = lib.get_current_project() media_pool = project.GetMediaPool() + + # create versioned bin for editorial package + version_name = context["version"]["name"] + bin_name = f"{name}_{version_name}" + lib.create_bin(bin_name) + import_options = { "timelineName": "Editorial Package Timeline", "importSourceClips": True, From 1ae7a22d1d5abb3659da18f4a6949aebbe66c97f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 28 May 2024 14:07:22 +0200 Subject: [PATCH 334/469] Add exception handling for unsupported schema in OTIO file. Improve error message and version requirement. --- .../plugins/publish/validate_editorial_package.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py index 42755e1396..02793516e2 100644 --- a/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py +++ b/server_addon/traypublisher/client/ayon_traypublisher/plugins/publish/validate_editorial_package.py @@ -1,5 +1,7 @@ import os import opentimelineio +from opentimelineio.exceptions import UnsupportedSchemaError + import pyblish.api from ayon_core.pipeline import PublishValidationError @@ -36,7 +38,16 @@ class ValidateEditorialPackage(pyblish.api.InstancePlugin): resource_file_names = {os.path.basename(path) for path in resource_paths} - otio_data = opentimelineio.adapters.read_from_file(otio_path) + try: + otio_data = opentimelineio.adapters.read_from_file(otio_path) + except UnsupportedSchemaError as e: + raise PublishValidationError( + f"Unsupported schema in otio file '{otio_path}'." + "Version of your OpenTimelineIO library is too old." + "Please update it to the latest version." + f"Current version is '{opentimelineio.__version__}', " + "but required is at least 0.16.0." + ) from e target_urls = self._get_all_target_urls(otio_data) missing_files = set() From 0ebda1d45cd70ad5b67a6ab8d20453d87239aa5f Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 May 2024 20:08:11 +0800 Subject: [PATCH 335/469] code tweaks and clean up --BigRoy's comment --- .../hosts/substancepainter/api/lib.py | 49 +++---------------- .../plugins/create/create_textures.py | 34 +++++++++++-- .../plugins/publish/validate_ouput_maps.py | 8 ++- 3 files changed, 42 insertions(+), 49 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index f026425f24..c89f87ebb9 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -13,43 +13,6 @@ import substance_painter.export from qtpy import QtGui, QtWidgets, QtCore -def get_channel_map_enum(): - """Function to get channel map items value. - For backward compatibility only. Will be removed after - client addon migration - """ - return { - "BaseColor": "Base Color", - "Metallic": "Metallic", - "Roughness": "Roughness", - "SpecularEdgeColor": "Specular Edge Color", - "Emissive": "Emissive", - "Opacity": "Opacity", - "Displacement": "Displacement", - "Glossiness": "Glossiness", - "Anisotropylevel": "Anisotropy Level", - "AO": "Ambient Occulsion", - "Anisotropyangle": "Anisotropy Angle", - "Transmissive": "Transmissive", - "Reflection": "Reflection", - "Diffuse": "Diffuse", - "Ior": "Index of Refraction", - "Specularlevel": "Specular Level", - "BlendingMask": "Blending Mask", - "Translucency": "Translucency", - "Scattering": "Scattering", - "ScatterColor": "Scatter Color", - "SheenOpacity": "Sheen Opacity", - "SheenRoughness": "Sheen Roughness", - "SheenColor": "Sheen Color", - "CoatOpacity": "Coat Opacity", - "CoatColor": "Coat Color", - "CoatRoughness": "Coat Roughness", - "CoatSpecularLevel": "Coat Specular Level", - "CoatNormal": "Coat Normal", - } - - def get_export_presets(): """Return Export Preset resource URLs for all available Export Presets. @@ -731,8 +694,9 @@ def set_layer_stack_opacity(node_ids, channel_types): """Function to set the opacity of the layer stack during context Args: - node_ids (list): A list of substance painter node ids - channel_types (list): A list of channel types + node_ids (list[int]): Substance painter root layer node ids + channel_types (list[str]): Channel type names as defined as + attributes in `substance_painter.textureset.ChannelType` """ # Do nothing if not node_ids or not channel_types: @@ -747,8 +711,11 @@ def set_layer_stack_opacity(node_ids, channel_types): for node_id in node_ids: node = substance_painter.layerstack.get_node_by_uid(int(node_id)) all_selected_nodes.append(node) - excluded_nodes = {node for node in stack_root_layers - if node not in all_selected_nodes} + node_ids = set(node_ids) # lookup + excluded_nodes = [ + node for node in stack_root_layers + if node.uid() not in node_ids + ] original_opacity_values = [] for node in excluded_nodes: diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index 36dd9d6dba..a9b26c62c6 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -15,8 +15,7 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( remove_instance ) from ayon_core.hosts.substancepainter.api.lib import ( - get_export_presets, - get_channel_map_enum + get_export_presets ) import substance_painter @@ -113,7 +112,36 @@ class CreateTextures(Creator): for item in self.channel_mapping } else: - export_channel_enum = get_channel_map_enum() + export_channel_enum = { + "BaseColor": "Base Color", + "Metallic": "Metallic", + "Roughness": "Roughness", + "SpecularEdgeColor": "Specular Edge Color", + "Emissive": "Emissive", + "Opacity": "Opacity", + "Displacement": "Displacement", + "Glossiness": "Glossiness", + "Anisotropylevel": "Anisotropy Level", + "AO": "Ambient Occulsion", + "Anisotropyangle": "Anisotropy Angle", + "Transmissive": "Transmissive", + "Reflection": "Reflection", + "Diffuse": "Diffuse", + "Ior": "Index of Refraction", + "Specularlevel": "Specular Level", + "BlendingMask": "Blending Mask", + "Translucency": "Translucency", + "Scattering": "Scattering", + "ScatterColor": "Scatter Color", + "SheenOpacity": "Sheen Opacity", + "SheenRoughness": "Sheen Roughness", + "SheenColor": "Sheen Color", + "CoatOpacity": "Coat Opacity", + "CoatColor": "Coat Color", + "CoatRoughness": "Coat Roughness", + "CoatSpecularLevel": "Coat Specular Level", + "CoatNormal": "Coat Normal", + } return [ EnumDef("exportChannel", diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 31201e6c3b..777031b1ad 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -114,7 +114,6 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): title="Missing output maps" ) - def get_invalid_channels(self, instance, config): """Function to get invalid channel(s) from export channel filtering @@ -144,12 +143,11 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): map_names = [channel_map["fileName"] for channel_map in export_preset["maps"]] for channel in tmp_export_channel: - found = False + # Check if channel is found in at least one map for map_name in map_names: if channel in map_name: - found = True - break # Exit the inner loop once a match is found - if not found: + break + else: invalid_channel.append(channel) return invalid_channel From 119428bcdb1b6d181957ccd1039f6b167e3bf6b3 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 May 2024 20:18:42 +0800 Subject: [PATCH 336/469] improve publish validation message --- .../plugins/publish/validate_ouput_maps.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 777031b1ad..3a49cd86d0 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -31,11 +31,18 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): # generate the smallest size / fastest export as possible config = copy.deepcopy(config) invalid_channels = self.get_invalid_channels(instance, config) + msg = [] if invalid_channels: + bullet_point_invalid_statement = "\n".join( + "- {}".format(message) for _, message + in invalid_channels + ) + report = ( + "Invalid Channel Maps found.\n\n" + f"{bullet_point_invalid_statement}\n\n" + ) raise PublishValidationError( - "No Channel(s){} found in the texture set:{}".format( - invalid_channels, instance.name - )) + report, title="Invalid Channel Maps") parameters = config["exportParameters"][0]["parameters"] parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) @@ -132,6 +139,7 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): creator_attrs = instance.data["creator_attributes"] export_channel = creator_attrs.get("exportChannel", []) tmp_export_channel = copy.deepcopy(export_channel) + invalid_message = [] invalid_channel = [] if export_channel: for export_preset in config.get("exportPresets", {}): @@ -148,6 +156,9 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): if channel in map_name: break else: + invalid_message.append( + f"Channel map {channel} found " + "in the export_preset") invalid_channel.append(channel) - return invalid_channel + return invalid_channel, invalid_message From 447edbee03bdc139a8e37ee1192ebf03da81fedf Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 May 2024 20:20:23 +0800 Subject: [PATCH 337/469] cosmetic fix --- .../substancepainter/plugins/publish/validate_ouput_maps.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 3a49cd86d0..64445319d9 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -31,7 +31,6 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): # generate the smallest size / fastest export as possible config = copy.deepcopy(config) invalid_channels = self.get_invalid_channels(instance, config) - msg = [] if invalid_channels: bullet_point_invalid_statement = "\n".join( "- {}".format(message) for _, message From 5f950b72184bea5f8c74601e4b9e5d5c6147deb0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 May 2024 20:49:31 +0800 Subject: [PATCH 338/469] improve debug msg --- .../plugins/publish/validate_ouput_maps.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 64445319d9..bf04d118db 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -32,16 +32,10 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): config = copy.deepcopy(config) invalid_channels = self.get_invalid_channels(instance, config) if invalid_channels: - bullet_point_invalid_statement = "\n".join( - "- {}".format(message) for _, message - in invalid_channels - ) - report = ( - "Invalid Channel Maps found.\n\n" - f"{bullet_point_invalid_statement}\n\n" - ) raise PublishValidationError( - report, title="Invalid Channel Maps") + "No Channel(s): {} found in the texture set {}".format( + invalid_channels, instance.name + )) parameters = config["exportParameters"][0]["parameters"] parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) @@ -138,7 +132,6 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): creator_attrs = instance.data["creator_attributes"] export_channel = creator_attrs.get("exportChannel", []) tmp_export_channel = copy.deepcopy(export_channel) - invalid_message = [] invalid_channel = [] if export_channel: for export_preset in config.get("exportPresets", {}): @@ -155,9 +148,6 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): if channel in map_name: break else: - invalid_message.append( - f"Channel map {channel} found " - "in the export_preset") invalid_channel.append(channel) - return invalid_channel, invalid_message + return invalid_channel From a392567e55402296fb2c8aa05dc83245647cdc90 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 28 May 2024 20:50:29 +0800 Subject: [PATCH 339/469] improve debug msg --- .../substancepainter/plugins/publish/validate_ouput_maps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index bf04d118db..36b4aeddd2 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -33,7 +33,7 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): invalid_channels = self.get_invalid_channels(instance, config) if invalid_channels: raise PublishValidationError( - "No Channel(s): {} found in the texture set {}".format( + "Invalid Channel(s): {} found in the texture set {}".format( invalid_channels, instance.name )) parameters = config["exportParameters"][0]["parameters"] From be546455c766f3ab88fbd458d2ffb975308b153d Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Tue, 28 May 2024 20:19:15 +0300 Subject: [PATCH 340/469] add missing section in publish settings --- server_addon/houdini/server/settings/publish.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 4a0c022f23..336de8e046 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -79,7 +79,8 @@ class PublishPluginsModel(BaseSettingsModel): ) ValidateInstanceInContextHoudini: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Instance is in same Context.") + title="Validate Instance is in same Context.", + section="Validators") ValidateMeshIsStatic: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, title="Validate Mesh is Static.") From 3b074c91820606948a622f4e653b7688d49093e9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 08:13:12 +0800 Subject: [PATCH 341/469] code tweaks - big roy's comment --- client/ayon_core/hosts/substancepainter/api/lib.py | 6 +----- .../substancepainter/plugins/create/create_textures.py | 4 +--- .../plugins/publish/collect_textureset_images.py | 4 ++-- .../substancepainter/plugins/publish/validate_ouput_maps.py | 4 ++-- 4 files changed, 6 insertions(+), 12 deletions(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index c89f87ebb9..e409605d07 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -645,7 +645,7 @@ def prompt_new_file_with_mesh(mesh_filepath): def get_export_presets_by_filtering(export_preset_name, channel_type_names): - """Function to get export presets included with specific channels + """Return export presets included with specific channels requested by users. Args: @@ -707,10 +707,6 @@ def set_layer_stack_opacity(node_ids, channel_types): stack_root_layers = ( substance_painter.layerstack.get_root_layer_nodes(stack) ) - all_selected_nodes = [] - for node_id in node_ids: - node = substance_painter.layerstack.get_node_by_uid(int(node_id)) - all_selected_nodes.append(node) node_ids = set(node_ids) # lookup excluded_nodes = [ node for node in stack_root_layers diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py index a9b26c62c6..34826240a3 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py +++ b/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py @@ -14,9 +14,7 @@ from ayon_core.hosts.substancepainter.api.pipeline import ( set_instances, remove_instance ) -from ayon_core.hosts.substancepainter.api.lib import ( - get_export_presets -) +from ayon_core.hosts.substancepainter.api.lib import get_export_presets import substance_painter import substance_painter.project diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py index b90e77db80..f7837e5106 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py @@ -8,7 +8,7 @@ import substance_painter.textureset from ayon_core.pipeline import publish from ayon_core.hosts.substancepainter.api.lib import ( get_parsed_export_maps, - get_export_presets_by_filtering, + get_filtered_export_preset, strip_template ) from ayon_core.pipeline.create import get_product_name @@ -210,6 +210,6 @@ class CollectTextureSet(pyblish.api.InstancePlugin): parameters.pop(key) channel_layer = creator_attrs.get("exportChannel", []) if channel_layer: - maps = get_export_presets_by_filtering(preset_url, channel_layer) + maps = get_filtered_export_preset(preset_url, channel_layer) config.update(maps) return config diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py index 36b4aeddd2..3293e7f204 100644 --- a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py +++ b/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py @@ -33,7 +33,7 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): invalid_channels = self.get_invalid_channels(instance, config) if invalid_channels: raise PublishValidationError( - "Invalid Channel(s): {} found in the texture set {}".format( + "Invalid Channel(s): {} found in texture set {}".format( invalid_channels, instance.name )) parameters = config["exportParameters"][0]["parameters"] @@ -137,7 +137,7 @@ class ValidateOutputMaps(pyblish.api.InstancePlugin): for export_preset in config.get("exportPresets", {}): if not export_preset.get("maps", {}): raise PublishValidationError( - "No Texture Map Exported with texture set:{}.".format( + "No Texture Map Exported with texture set: {}.".format( instance.name) ) map_names = [channel_map["fileName"] for channel_map From eeb454432baa37dd4a2b58d5b5df6cd77413509a Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 08:14:47 +0800 Subject: [PATCH 342/469] code tweaks - big roy's comment --- client/ayon_core/hosts/substancepainter/api/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/client/ayon_core/hosts/substancepainter/api/lib.py index e409605d07..0ae3932f58 100644 --- a/client/ayon_core/hosts/substancepainter/api/lib.py +++ b/client/ayon_core/hosts/substancepainter/api/lib.py @@ -644,7 +644,7 @@ def prompt_new_file_with_mesh(mesh_filepath): return project_mesh -def get_export_presets_by_filtering(export_preset_name, channel_type_names): +def get_filtered_export_preset(export_preset_name, channel_type_names): """Return export presets included with specific channels requested by users. From 4359f21c50a796b7afd6913107685999f416c869 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Wed, 29 May 2024 11:19:43 +0300 Subject: [PATCH 343/469] refine the description of `only_available`. Co-authored-by: Roy Nieterau --- server_addon/applications/server/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/applications/server/settings.py b/server_addon/applications/server/settings.py index 6c131a5e9d..3f9d90ef5b 100644 --- a/server_addon/applications/server/settings.py +++ b/server_addon/applications/server/settings.py @@ -214,7 +214,7 @@ class ApplicationsAddonSettings(BaseSettingsModel): only_available: bool = SettingsField( True, title="Show only available applications", - description="Enable to show only available applications in AYON Launcher" + description="Enable to show only applications in AYON Launcher" " for which the executable paths are found on the running machine." " This applies as an additional filter to the applications defined in a " " project's anatomy settings to ignore unavailable applications." From 2e120020fafcb3e9bb76f0705f6f240b9663291c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 18:55:39 +0800 Subject: [PATCH 344/469] use ayon_substancepainter as import --- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- .../ayon_substancepainter/plugins/publish/extract_textures.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index b100e4189d..0bf451f0e2 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -16,7 +16,7 @@ import substance_painter.project class CreateWorkfile(AutoCreator): """Workfile auto-creator.""" - identifier = "io.openpype.creators.substancepainter.workfile" + identifier = "io.ayon.creators.substancepainter.workfile" label = "Workfile" product_type = "workfile" icon = "document" diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py index 361ad788ca..52212922ae 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py @@ -1,6 +1,6 @@ import substance_painter.export from ayon_core.pipeline import KnownPublishError, publish -from ayon_core.hosts.substancepainter.api.lib import set_layer_stack_opacity +from ayon_substancepainter.api.lib import set_layer_stack_opacity class ExtractTextures(publish.Extractor, From 1e0d7e5db0ae5d351bb5870f742257b090cca390 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 20:44:48 +0800 Subject: [PATCH 345/469] move max hosts to ayon_max --- .../hosts/max => server_addon/max/client/ayon_max}/__init__.py | 0 .../hosts/max => server_addon/max/client/ayon_max}/addon.py | 0 .../max => server_addon/max/client/ayon_max}/api/__init__.py | 0 .../hosts/max => server_addon/max/client/ayon_max}/api/action.py | 0 .../max => server_addon/max/client/ayon_max}/api/colorspace.py | 0 .../hosts/max => server_addon/max/client/ayon_max}/api/lib.py | 0 .../max/client/ayon_max}/api/lib_renderproducts.py | 0 .../max/client/ayon_max}/api/lib_rendersettings.py | 0 .../hosts/max => server_addon/max/client/ayon_max}/api/menu.py | 0 .../max => server_addon/max/client/ayon_max}/api/pipeline.py | 0 .../hosts/max => server_addon/max/client/ayon_max}/api/plugin.py | 0 .../max/client/ayon_max}/api/preview_animation.py | 0 .../max/client/ayon_max}/hooks/force_startup_script.py | 0 .../max/client/ayon_max}/hooks/inject_python.py | 0 .../max => server_addon/max/client/ayon_max}/hooks/set_paths.py | 0 .../max => server_addon/max/client/ayon_max}/plugins/__init__.py | 0 .../max/client/ayon_max}/plugins/create/create_camera.py | 0 .../max/client/ayon_max}/plugins/create/create_maxScene.py | 0 .../max/client/ayon_max}/plugins/create/create_model.py | 0 .../max/client/ayon_max}/plugins/create/create_pointcache.py | 0 .../max/client/ayon_max}/plugins/create/create_pointcloud.py | 0 .../max/client/ayon_max}/plugins/create/create_redshift_proxy.py | 0 .../max/client/ayon_max}/plugins/create/create_render.py | 0 .../max/client/ayon_max}/plugins/create/create_review.py | 0 .../max/client/ayon_max}/plugins/create/create_tycache.py | 0 .../max/client/ayon_max}/plugins/create/create_workfile.py | 0 .../max/client/ayon_max}/plugins/load/load_camera_fbx.py | 0 .../max/client/ayon_max}/plugins/load/load_max_scene.py | 0 .../max/client/ayon_max}/plugins/load/load_model.py | 0 .../max/client/ayon_max}/plugins/load/load_model_fbx.py | 0 .../max/client/ayon_max}/plugins/load/load_model_obj.py | 0 .../max/client/ayon_max}/plugins/load/load_model_usd.py | 0 .../max/client/ayon_max}/plugins/load/load_pointcache.py | 0 .../max/client/ayon_max}/plugins/load/load_pointcache_ornatrix.py | 0 .../max/client/ayon_max}/plugins/load/load_pointcloud.py | 0 .../max/client/ayon_max}/plugins/load/load_redshift_proxy.py | 0 .../max/client/ayon_max}/plugins/load/load_tycache.py | 0 .../max/client/ayon_max}/plugins/publish/collect_current_file.py | 0 .../max/client/ayon_max}/plugins/publish/collect_frame_range.py | 0 .../max/client/ayon_max}/plugins/publish/collect_members.py | 0 .../max/client/ayon_max}/plugins/publish/collect_render.py | 0 .../max/client/ayon_max}/plugins/publish/collect_review.py | 0 .../ayon_max}/plugins/publish/collect_tycache_attributes.py | 0 .../max/client/ayon_max}/plugins/publish/collect_workfile.py | 0 .../max/client/ayon_max}/plugins/publish/extract_alembic.py | 0 .../max/client/ayon_max}/plugins/publish/extract_fbx.py | 0 .../max/client/ayon_max}/plugins/publish/extract_max_scene_raw.py | 0 .../max/client/ayon_max}/plugins/publish/extract_model_obj.py | 0 .../max/client/ayon_max}/plugins/publish/extract_model_usd.py | 0 .../max/client/ayon_max}/plugins/publish/extract_pointcloud.py | 0 .../client/ayon_max}/plugins/publish/extract_redshift_proxy.py | 0 .../client/ayon_max}/plugins/publish/extract_review_animation.py | 0 .../max/client/ayon_max}/plugins/publish/extract_thumbnail.py | 0 .../max/client/ayon_max}/plugins/publish/extract_tycache.py | 0 .../client/ayon_max}/plugins/publish/help/validate_model_name.xml | 0 .../ayon_max}/plugins/publish/increment_workfile_version.py | 0 .../max/client/ayon_max}/plugins/publish/save_scene.py | 0 .../client/ayon_max}/plugins/publish/save_scenes_for_cameras.py | 0 .../max/client/ayon_max}/plugins/publish/validate_attributes.py | 0 .../ayon_max}/plugins/publish/validate_camera_attributes.py | 0 .../client/ayon_max}/plugins/publish/validate_camera_contents.py | 0 .../ayon_max}/plugins/publish/validate_extended_viewport.py | 0 .../max/client/ayon_max}/plugins/publish/validate_frame_range.py | 0 .../ayon_max}/plugins/publish/validate_instance_has_members.py | 0 .../ayon_max}/plugins/publish/validate_instance_in_context.py | 0 .../client/ayon_max}/plugins/publish/validate_loaded_plugin.py | 0 .../max/client/ayon_max}/plugins/publish/validate_mesh_has_uv.py | 0 .../client/ayon_max}/plugins/publish/validate_model_contents.py | 0 .../max/client/ayon_max}/plugins/publish/validate_model_name.py | 0 .../max/client/ayon_max}/plugins/publish/validate_no_animation.py | 0 .../max/client/ayon_max}/plugins/publish/validate_pointcloud.py | 0 .../ayon_max}/plugins/publish/validate_renderable_camera.py | 0 .../ayon_max}/plugins/publish/validate_renderer_redshift_proxy.py | 0 .../max/client/ayon_max}/plugins/publish/validate_renderpasses.py | 0 .../ayon_max}/plugins/publish/validate_resolution_setting.py | 0 .../max/client/ayon_max}/plugins/publish/validate_scene_saved.py | 0 .../max/client/ayon_max}/plugins/publish/validate_tyflow_data.py | 0 .../max => server_addon/max/client/ayon_max}/startup/startup.ms | 0 .../max => server_addon/max/client/ayon_max}/startup/startup.py | 0 79 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/__init__.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/addon.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/__init__.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/action.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/colorspace.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/lib.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/lib_renderproducts.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/lib_rendersettings.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/menu.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/pipeline.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/plugin.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/api/preview_animation.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/hooks/force_startup_script.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/hooks/inject_python.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/hooks/set_paths.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_camera.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_maxScene.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_model.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_pointcache.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_pointcloud.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_redshift_proxy.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_render.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_review.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_tycache.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_camera_fbx.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_max_scene.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_model.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_model_fbx.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_model_obj.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_model_usd.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_pointcache.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_pointcache_ornatrix.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_pointcloud.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_redshift_proxy.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/load/load_tycache.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_frame_range.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_members.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_render.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_review.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_tycache_attributes.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_alembic.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_fbx.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_max_scene_raw.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_model_obj.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_model_usd.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_pointcloud.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_redshift_proxy.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_review_animation.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_thumbnail.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/extract_tycache.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/help/validate_model_name.xml (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/increment_workfile_version.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/save_scene.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/save_scenes_for_cameras.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_attributes.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_camera_attributes.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_camera_contents.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_extended_viewport.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_frame_range.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_instance_has_members.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_instance_in_context.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_loaded_plugin.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_mesh_has_uv.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_model_contents.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_model_name.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_no_animation.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_pointcloud.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_renderable_camera.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_renderer_redshift_proxy.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_renderpasses.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_resolution_setting.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_scene_saved.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/plugins/publish/validate_tyflow_data.py (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/startup/startup.ms (100%) rename {client/ayon_core/hosts/max => server_addon/max/client/ayon_max}/startup/startup.py (100%) diff --git a/client/ayon_core/hosts/max/__init__.py b/server_addon/max/client/ayon_max/__init__.py similarity index 100% rename from client/ayon_core/hosts/max/__init__.py rename to server_addon/max/client/ayon_max/__init__.py diff --git a/client/ayon_core/hosts/max/addon.py b/server_addon/max/client/ayon_max/addon.py similarity index 100% rename from client/ayon_core/hosts/max/addon.py rename to server_addon/max/client/ayon_max/addon.py diff --git a/client/ayon_core/hosts/max/api/__init__.py b/server_addon/max/client/ayon_max/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/max/api/__init__.py rename to server_addon/max/client/ayon_max/api/__init__.py diff --git a/client/ayon_core/hosts/max/api/action.py b/server_addon/max/client/ayon_max/api/action.py similarity index 100% rename from client/ayon_core/hosts/max/api/action.py rename to server_addon/max/client/ayon_max/api/action.py diff --git a/client/ayon_core/hosts/max/api/colorspace.py b/server_addon/max/client/ayon_max/api/colorspace.py similarity index 100% rename from client/ayon_core/hosts/max/api/colorspace.py rename to server_addon/max/client/ayon_max/api/colorspace.py diff --git a/client/ayon_core/hosts/max/api/lib.py b/server_addon/max/client/ayon_max/api/lib.py similarity index 100% rename from client/ayon_core/hosts/max/api/lib.py rename to server_addon/max/client/ayon_max/api/lib.py diff --git a/client/ayon_core/hosts/max/api/lib_renderproducts.py b/server_addon/max/client/ayon_max/api/lib_renderproducts.py similarity index 100% rename from client/ayon_core/hosts/max/api/lib_renderproducts.py rename to server_addon/max/client/ayon_max/api/lib_renderproducts.py diff --git a/client/ayon_core/hosts/max/api/lib_rendersettings.py b/server_addon/max/client/ayon_max/api/lib_rendersettings.py similarity index 100% rename from client/ayon_core/hosts/max/api/lib_rendersettings.py rename to server_addon/max/client/ayon_max/api/lib_rendersettings.py diff --git a/client/ayon_core/hosts/max/api/menu.py b/server_addon/max/client/ayon_max/api/menu.py similarity index 100% rename from client/ayon_core/hosts/max/api/menu.py rename to server_addon/max/client/ayon_max/api/menu.py diff --git a/client/ayon_core/hosts/max/api/pipeline.py b/server_addon/max/client/ayon_max/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/max/api/pipeline.py rename to server_addon/max/client/ayon_max/api/pipeline.py diff --git a/client/ayon_core/hosts/max/api/plugin.py b/server_addon/max/client/ayon_max/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/max/api/plugin.py rename to server_addon/max/client/ayon_max/api/plugin.py diff --git a/client/ayon_core/hosts/max/api/preview_animation.py b/server_addon/max/client/ayon_max/api/preview_animation.py similarity index 100% rename from client/ayon_core/hosts/max/api/preview_animation.py rename to server_addon/max/client/ayon_max/api/preview_animation.py diff --git a/client/ayon_core/hosts/max/hooks/force_startup_script.py b/server_addon/max/client/ayon_max/hooks/force_startup_script.py similarity index 100% rename from client/ayon_core/hosts/max/hooks/force_startup_script.py rename to server_addon/max/client/ayon_max/hooks/force_startup_script.py diff --git a/client/ayon_core/hosts/max/hooks/inject_python.py b/server_addon/max/client/ayon_max/hooks/inject_python.py similarity index 100% rename from client/ayon_core/hosts/max/hooks/inject_python.py rename to server_addon/max/client/ayon_max/hooks/inject_python.py diff --git a/client/ayon_core/hosts/max/hooks/set_paths.py b/server_addon/max/client/ayon_max/hooks/set_paths.py similarity index 100% rename from client/ayon_core/hosts/max/hooks/set_paths.py rename to server_addon/max/client/ayon_max/hooks/set_paths.py diff --git a/client/ayon_core/hosts/max/plugins/__init__.py b/server_addon/max/client/ayon_max/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/__init__.py rename to server_addon/max/client/ayon_max/plugins/__init__.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_camera.py b/server_addon/max/client/ayon_max/plugins/create/create_camera.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_camera.py rename to server_addon/max/client/ayon_max/plugins/create/create_camera.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_maxScene.py b/server_addon/max/client/ayon_max/plugins/create/create_maxScene.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_maxScene.py rename to server_addon/max/client/ayon_max/plugins/create/create_maxScene.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_model.py b/server_addon/max/client/ayon_max/plugins/create/create_model.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_model.py rename to server_addon/max/client/ayon_max/plugins/create/create_model.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_pointcache.py b/server_addon/max/client/ayon_max/plugins/create/create_pointcache.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_pointcache.py rename to server_addon/max/client/ayon_max/plugins/create/create_pointcache.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_pointcloud.py b/server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_pointcloud.py rename to server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_redshift_proxy.py rename to server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_render.py b/server_addon/max/client/ayon_max/plugins/create/create_render.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_render.py rename to server_addon/max/client/ayon_max/plugins/create/create_render.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_review.py b/server_addon/max/client/ayon_max/plugins/create/create_review.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_review.py rename to server_addon/max/client/ayon_max/plugins/create/create_review.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_tycache.py b/server_addon/max/client/ayon_max/plugins/create/create_tycache.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_tycache.py rename to server_addon/max/client/ayon_max/plugins/create/create_tycache.py diff --git a/client/ayon_core/hosts/max/plugins/create/create_workfile.py b/server_addon/max/client/ayon_max/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/create/create_workfile.py rename to server_addon/max/client/ayon_max/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_camera_fbx.py b/server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_camera_fbx.py rename to server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_max_scene.py b/server_addon/max/client/ayon_max/plugins/load/load_max_scene.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_max_scene.py rename to server_addon/max/client/ayon_max/plugins/load/load_max_scene.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_model.py b/server_addon/max/client/ayon_max/plugins/load/load_model.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_model.py rename to server_addon/max/client/ayon_max/plugins/load/load_model.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_model_fbx.py b/server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_model_fbx.py rename to server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_model_obj.py b/server_addon/max/client/ayon_max/plugins/load/load_model_obj.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_model_obj.py rename to server_addon/max/client/ayon_max/plugins/load/load_model_obj.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_model_usd.py b/server_addon/max/client/ayon_max/plugins/load/load_model_usd.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_model_usd.py rename to server_addon/max/client/ayon_max/plugins/load/load_model_usd.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_pointcache.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcache.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_pointcache.py rename to server_addon/max/client/ayon_max/plugins/load/load_pointcache.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_pointcache_ornatrix.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_pointcache_ornatrix.py rename to server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_pointcloud.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_pointcloud.py rename to server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_redshift_proxy.py rename to server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py diff --git a/client/ayon_core/hosts/max/plugins/load/load_tycache.py b/server_addon/max/client/ayon_max/plugins/load/load_tycache.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/load/load_tycache.py rename to server_addon/max/client/ayon_max/plugins/load/load_tycache.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_current_file.py b/server_addon/max/client/ayon_max/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_current_file.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_frame_range.py b/server_addon/max/client/ayon_max/plugins/publish/collect_frame_range.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_frame_range.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_frame_range.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_members.py b/server_addon/max/client/ayon_max/plugins/publish/collect_members.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_members.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_members.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_render.py b/server_addon/max/client/ayon_max/plugins/publish/collect_render.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_render.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_render.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_review.py b/server_addon/max/client/ayon_max/plugins/publish/collect_review.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_review.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_review.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_tycache_attributes.py b/server_addon/max/client/ayon_max/plugins/publish/collect_tycache_attributes.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_tycache_attributes.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_tycache_attributes.py diff --git a/client/ayon_core/hosts/max/plugins/publish/collect_workfile.py b/server_addon/max/client/ayon_max/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/collect_workfile.py rename to server_addon/max/client/ayon_max/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_alembic.py b/server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_alembic.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_fbx.py b/server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_fbx.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_max_scene_raw.py b/server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_max_scene_raw.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_model_obj.py b/server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_model_obj.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_model_usd.py b/server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_model_usd.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_pointcloud.py b/server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_pointcloud.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_redshift_proxy.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_review_animation.py b/server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_review_animation.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_thumbnail.py b/server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_thumbnail.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py diff --git a/client/ayon_core/hosts/max/plugins/publish/extract_tycache.py b/server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/extract_tycache.py rename to server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py diff --git a/client/ayon_core/hosts/max/plugins/publish/help/validate_model_name.xml b/server_addon/max/client/ayon_max/plugins/publish/help/validate_model_name.xml similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/help/validate_model_name.xml rename to server_addon/max/client/ayon_max/plugins/publish/help/validate_model_name.xml diff --git a/client/ayon_core/hosts/max/plugins/publish/increment_workfile_version.py b/server_addon/max/client/ayon_max/plugins/publish/increment_workfile_version.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/increment_workfile_version.py rename to server_addon/max/client/ayon_max/plugins/publish/increment_workfile_version.py diff --git a/client/ayon_core/hosts/max/plugins/publish/save_scene.py b/server_addon/max/client/ayon_max/plugins/publish/save_scene.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/save_scene.py rename to server_addon/max/client/ayon_max/plugins/publish/save_scene.py diff --git a/client/ayon_core/hosts/max/plugins/publish/save_scenes_for_cameras.py b/server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/save_scenes_for_cameras.py rename to server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_attributes.py b/server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_attributes.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_camera_attributes.py b/server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_camera_attributes.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_camera_contents.py b/server_addon/max/client/ayon_max/plugins/publish/validate_camera_contents.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_camera_contents.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_camera_contents.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_extended_viewport.py b/server_addon/max/client/ayon_max/plugins/publish/validate_extended_viewport.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_extended_viewport.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_extended_viewport.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_frame_range.py b/server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_frame_range.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_instance_has_members.py b/server_addon/max/client/ayon_max/plugins/publish/validate_instance_has_members.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_instance_has_members.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_instance_has_members.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_instance_in_context.py b/server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_instance_in_context.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_loaded_plugin.py b/server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_loaded_plugin.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_mesh_has_uv.py b/server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_mesh_has_uv.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_model_contents.py b/server_addon/max/client/ayon_max/plugins/publish/validate_model_contents.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_model_contents.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_model_contents.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_model_name.py b/server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_model_name.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_no_animation.py b/server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_no_animation.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_pointcloud.py b/server_addon/max/client/ayon_max/plugins/publish/validate_pointcloud.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_pointcloud.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_pointcloud.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_renderable_camera.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_renderable_camera.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_renderer_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_renderer_redshift_proxy.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_renderpasses.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_renderpasses.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py b/server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_resolution_setting.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_scene_saved.py b/server_addon/max/client/ayon_max/plugins/publish/validate_scene_saved.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_scene_saved.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_scene_saved.py diff --git a/client/ayon_core/hosts/max/plugins/publish/validate_tyflow_data.py b/server_addon/max/client/ayon_max/plugins/publish/validate_tyflow_data.py similarity index 100% rename from client/ayon_core/hosts/max/plugins/publish/validate_tyflow_data.py rename to server_addon/max/client/ayon_max/plugins/publish/validate_tyflow_data.py diff --git a/client/ayon_core/hosts/max/startup/startup.ms b/server_addon/max/client/ayon_max/startup/startup.ms similarity index 100% rename from client/ayon_core/hosts/max/startup/startup.ms rename to server_addon/max/client/ayon_max/startup/startup.ms diff --git a/client/ayon_core/hosts/max/startup/startup.py b/server_addon/max/client/ayon_max/startup/startup.py similarity index 100% rename from client/ayon_core/hosts/max/startup/startup.py rename to server_addon/max/client/ayon_max/startup/startup.py From e598e5fef355ec6bce62504c66b01917a9f07415 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 14:57:00 +0200 Subject: [PATCH 346/469] refactor of scene inventory view --- .../ayon_core/tools/sceneinventory/control.py | 34 +- .../tools/sceneinventory/delegates.py | 112 +-- .../ayon_core/tools/sceneinventory/model.py | 780 +++++++---------- .../tools/sceneinventory/models/__init__.py | 2 + .../tools/sceneinventory/models/containers.py | 343 ++++++++ client/ayon_core/tools/sceneinventory/view.py | 782 ++++++++++-------- .../ayon_core/tools/sceneinventory/window.py | 103 +-- client/ayon_core/tools/utils/lib.py | 17 +- 8 files changed, 1146 insertions(+), 1027 deletions(-) create mode 100644 client/ayon_core/tools/sceneinventory/models/containers.py diff --git a/client/ayon_core/tools/sceneinventory/control.py b/client/ayon_core/tools/sceneinventory/control.py index 592113455c..c564b5a992 100644 --- a/client/ayon_core/tools/sceneinventory/control.py +++ b/client/ayon_core/tools/sceneinventory/control.py @@ -1,14 +1,14 @@ import ayon_api from ayon_core.lib.events import QueuedEventSystem -from ayon_core.host import ILoadHost +from ayon_core.host import HostBase, ILoadHost from ayon_core.pipeline import ( registered_host, get_current_context, ) from ayon_core.tools.common_models import HierarchyModel -from .models import SiteSyncModel +from .models import SiteSyncModel, ContainersModel class SceneInventoryController: @@ -28,11 +28,15 @@ class SceneInventoryController: self._current_folder_id = None self._current_folder_set = False + self._containers_model = ContainersModel(self) self._sitesync_model = SiteSyncModel(self) # Switch dialog requirements self._hierarchy_model = HierarchyModel(self) self._event_system = self._create_event_system() + def get_host(self) -> HostBase: + return self._host + def emit_event(self, topic, data=None, source=None): if data is None: data = {} @@ -47,6 +51,7 @@ class SceneInventoryController: self._current_folder_id = None self._current_folder_set = False + self._containers_model.reset() self._sitesync_model.reset() self._hierarchy_model.reset() @@ -80,13 +85,26 @@ class SceneInventoryController: self._current_folder_set = True return self._current_folder_id + # Containers methods def get_containers(self): - host = self._host - if isinstance(host, ILoadHost): - return list(host.get_containers()) - elif hasattr(host, "ls"): - return list(host.ls()) - return [] + return self._containers_model.get_containers() + + def get_containers_by_item_ids(self, item_ids): + return self._containers_model.get_containers_by_item_ids(item_ids) + + def get_container_items(self): + return self._containers_model.get_container_items() + + def get_container_items_by_id(self, item_ids): + return self._containers_model.get_container_items_by_id(item_ids) + + def get_representation_info_items(self, representation_ids): + return self._containers_model.get_representation_info_items( + representation_ids + ) + + def get_version_items(self, product_ids): + return self._containers_model.get_version_items(product_ids) # Site Sync methods def is_sitesync_enabled(self): diff --git a/client/ayon_core/tools/sceneinventory/delegates.py b/client/ayon_core/tools/sceneinventory/delegates.py index 2126fa1cbe..6f91587613 100644 --- a/client/ayon_core/tools/sceneinventory/delegates.py +++ b/client/ayon_core/tools/sceneinventory/delegates.py @@ -1,38 +1,10 @@ -import numbers - -import ayon_api - -from ayon_core.pipeline import HeroVersionType -from ayon_core.tools.utils.models import TreeModel -from ayon_core.tools.utils.lib import format_version - from qtpy import QtWidgets, QtCore, QtGui +from .model import VERSION_LABEL_ROLE + class VersionDelegate(QtWidgets.QStyledItemDelegate): """A delegate that display version integer formatted as version string.""" - - version_changed = QtCore.Signal() - first_run = False - lock = False - - def __init__(self, controller, *args, **kwargs): - self._controller = controller - super(VersionDelegate, self).__init__(*args, **kwargs) - - def get_project_name(self): - return self._controller.get_current_project_name() - - def displayText(self, value, locale): - if isinstance(value, HeroVersionType): - return format_version(value) - if not isinstance(value, numbers.Integral): - # For cases where no version is resolved like NOT FOUND cases - # where a representation might not exist in current database - return - - return format_version(value) - def paint(self, painter, option, index): fg_color = index.data(QtCore.Qt.ForegroundRole) if fg_color: @@ -44,7 +16,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): fg_color = None if not fg_color: - return super(VersionDelegate, self).paint(painter, option, index) + return super().paint(painter, option, index) if option.widget: style = option.widget.style() @@ -60,9 +32,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): painter.save() - text = self.displayText( - index.data(QtCore.Qt.DisplayRole), option.locale - ) + text = index.data(VERSION_LABEL_ROLE) pen = painter.pen() pen.setColor(fg_color) painter.setPen(pen) @@ -82,77 +52,3 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): ) painter.restore() - - def createEditor(self, parent, option, index): - item = index.data(TreeModel.ItemRole) - if item.get("isGroup") or item.get("isMerged"): - return - - editor = QtWidgets.QComboBox(parent) - - def commit_data(): - if not self.first_run: - self.commitData.emit(editor) # Update model data - self.version_changed.emit() # Display model data - editor.currentIndexChanged.connect(commit_data) - - self.first_run = True - self.lock = False - - return editor - - def setEditorData(self, editor, index): - if self.lock: - # Only set editor data once per delegation - return - - editor.clear() - - # Current value of the index - item = index.data(TreeModel.ItemRole) - value = index.data(QtCore.Qt.DisplayRole) - - project_name = self.get_project_name() - # Add all available versions to the editor - product_id = item["version_entity"]["productId"] - version_entities = list(sorted( - ayon_api.get_versions( - project_name, product_ids={product_id}, active=True - ), - key=lambda item: abs(item["version"]) - )) - - selected = None - items = [] - is_hero_version = value < 0 - for version_entity in version_entities: - version = version_entity["version"] - label = format_version(version) - item = QtGui.QStandardItem(label) - item.setData(version_entity, QtCore.Qt.UserRole) - items.append(item) - - if ( - version == value - or is_hero_version and version < 0 - ): - selected = item - - # Reverse items so latest versions be upper - items.reverse() - for item in items: - editor.model().appendRow(item) - - index = 0 - if selected: - index = selected.row() - - # Will trigger index-change signal - editor.setCurrentIndex(index) - self.first_run = False - self.lock = True - - def setModelData(self, editor, model, index): - """Apply the integer version back in the model""" - version = editor.itemData(editor.currentIndex()) - model.setData(index, version["name"]) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 330b174218..052bdf3e4e 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -1,57 +1,110 @@ import re import logging -import uuid -from collections import defaultdict +import collections -import ayon_api from qtpy import QtCore, QtGui import qtawesome from ayon_core.pipeline import ( - get_current_project_name, HeroVersionType, ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.models import TreeModel, Item +from ayon_core.tools.utils.lib import format_version + +ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 +NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 +COUNT_ROLE = QtCore.Qt.UserRole + 3 +IS_CONTAINER_ITEM_ROLE = QtCore.Qt.UserRole + 4 +VERSION_IS_LATEST_ROLE = QtCore.Qt.UserRole + 5 +VERSION_VALUE_ROLE = QtCore.Qt.UserRole + 6 +VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 +VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 +STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 +STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 10 +PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 11 +PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 12 +PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 13 +PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 14 +PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 15 +LOADER_NAME_ROLE = QtCore.Qt.UserRole + 16 +OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 17 +ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 18 +REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 19 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 20 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 21 +# This value hold unique value of container that should be used to identify +# containers inbetween refresh. +ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 22 -def walk_hierarchy(node): - """Recursively yield group node.""" - for child in node.children(): - if child.get("isGroupNode"): - yield child - - for _child in walk_hierarchy(child): - yield _child - - -class InventoryModel(TreeModel): +class InventoryModel(QtGui.QStandardItemModel): """The model for the inventory""" - Columns = [ + column_labels = [ "Name", - "version", - "count", - "productType", - "group", - "loader", - "objectName", - "active_site", - "remote_site", + "Version", + "Count", + "Product type", + "Group", + "Loader", + "Object name", + "Active site", + "Remote site", ] - active_site_col = Columns.index("active_site") - remote_site_col = Columns.index("remote_site") + name_col = column_labels.index("Name") + version_col = column_labels.index("Version") + count_col = column_labels.index("Count") + product_type_col = column_labels.index("Product type") + product_group_col = column_labels.index("Group") + loader_col = column_labels.index("Loader") + object_name_col = column_labels.index("Object name") + active_site_col = column_labels.index("Active site") + remote_site_col = column_labels.index("Remote site") + display_role_by_column = { + name_col: QtCore.Qt.DisplayRole, + version_col: VERSION_LABEL_ROLE, + count_col: COUNT_ROLE, + # 3: STATUS_NAME_ROLE, + product_type_col: PRODUCT_TYPE_ROLE, + product_group_col: PRODUCT_GROUP_NAME_ROLE, + loader_col: LOADER_NAME_ROLE, + object_name_col: OBJECT_NAME_ROLE, + active_site_col: ACTIVE_SITE_PROGRESS_ROLE, + remote_site_col: REMOTE_SITE_PROGRESS_ROLE, + } + decoration_role_by_column = { + name_col: QtCore.Qt.DecorationRole, + product_type_col: PRODUCT_TYPE_ICON_ROLE, + product_group_col: PRODUCT_GROUP_ICON_ROLE, + active_site_col: ACTIVE_SITE_ICON_ROLE, + remote_site_col: REMOTE_SITE_ICON_ROLE, + } + foreground_role_by_column = { + version_col: VERSION_COLOR_ROLE, + name_col: NAME_COLOR_ROLE, + } + width_by_column = { + name_col: 250, + version_col: 55, + count_col: 55, + product_type_col: 150, + product_group_col: 120, + loader_col: 150, + } OUTDATED_COLOR = QtGui.QColor(235, 30, 30) CHILD_OUTDATED_COLOR = QtGui.QColor(200, 160, 30) GRAYOUT_COLOR = QtGui.QColor(160, 160, 160) - UniqueRole = QtCore.Qt.UserRole + 2 # unique label role - def __init__(self, controller, parent=None): - super(InventoryModel, self).__init__(parent) + super().__init__(parent) + + self.setColumnCount(len(self.column_labels)) + for idx, label in enumerate(self.column_labels): + self.setHeaderData(idx, QtCore.Qt.Horizontal, label) + self.log = logging.getLogger(self.__class__.__name__) self._controller = controller @@ -60,103 +113,201 @@ class InventoryModel(TreeModel): self._default_icon_color = get_default_entity_icon_color() - site_icons = self._controller.get_site_provider_icons() - - self._site_icons = { - provider: get_qt_icon(icon_def) - for provider, icon_def in site_icons.items() - } - def outdated(self, item): return item.get("isOutdated", True) + def refresh(self, selected=None): + """Refresh the model""" + # for debugging or testing, injecting items from outside + container_items = self._controller.get_container_items() + + self._clear_items() + + items_by_repre_id = {} + for container_item in container_items: + # if ( + # selected is not None + # and container_item.item_id not in selected + # ): + # continue + repre_id = container_item.representation_id + items = items_by_repre_id.setdefault(repre_id, []) + items.append(container_item) + + repre_id = set(items_by_repre_id.keys()) + repre_info_by_id = self._controller.get_representation_info_items( + repre_id + ) + product_ids = { + repre_info.product_id + for repre_info in repre_info_by_id.values() + } + version_items_by_product_id = self._controller.get_version_items( + product_ids + ) + # SiteSync addon information + progress_by_id = self._controller.get_representations_site_progress( + repre_id + ) + sites_info = self._controller.get_sites_information() + site_icons = { + provider: get_qt_icon(icon_def) + for provider, icon_def in ( + self._controller.get_site_provider_icons().items() + ) + } + + group_item_icon = qtawesome.icon( + "fa.folder", color=self._default_icon_color + ) + valid_item_icon = qtawesome.icon( + "fa.file-o", color=self._default_icon_color + ) + invalid_item_icon = qtawesome.icon( + "fa.exclamation-circle", color=self._default_icon_color + ) + group_icon = qtawesome.icon( + "fa.object-group", color=self._default_icon_color + ) + product_type_icon = qtawesome.icon( + "fa.folder", color="#0091B2" + ) + group_item_font = QtGui.QFont() + group_item_font.setBold(True) + + active_site_icon = site_icons.get(sites_info["active_site_provider"]) + remote_site_icon = site_icons.get(sites_info["remote_site_provider"]) + + root_item = self.invisibleRootItem() + + group_items = [] + for repre_id, container_items in items_by_repre_id.items(): + repre_info = repre_info_by_id[repre_id] + version_label = "N/A" + version_color = None + version_value = None + is_latest = False + if not repre_info.is_valid: + group_name = "< Entity N/A >" + item_icon = invalid_item_icon + + else: + group_name = "{}_{}: ({})".format( + repre_info.folder_path.rsplit("/")[-1], + repre_info.product_name, + repre_info.representation_name + ) + item_icon = valid_item_icon + + version_items = ( + version_items_by_product_id[repre_info.product_id] + ) + version_item = version_items[repre_info.version_id] + version_value = version_item.version + if version_value < 0: + version_value = HeroVersionType(version_value) + version_label = format_version(version_value) + is_latest = version_item.is_latest + if not is_latest: + version_color = self.OUTDATED_COLOR + + container_model_items = [] + for container_item in container_items: + unique_name = ( + repre_info.representation_name + + container_item.object_name or "" + ) + + item = QtGui.QStandardItem() + item.setColumnCount(root_item.columnCount()) + item.setData(container_item.namespace, QtCore.Qt.DisplayRole) + item.setData(self.GRAYOUT_COLOR, NAME_COLOR_ROLE) + item.setData(self.GRAYOUT_COLOR, VERSION_COLOR_ROLE) + item.setData(item_icon, QtCore.Qt.DecorationRole) + item.setData(repre_info.product_id, PRODUCT_ID_ROLE) + item.setData(container_item.item_id, ITEM_ID_ROLE) + item.setData(version_value, VERSION_VALUE_ROLE) + item.setData(version_label, VERSION_LABEL_ROLE) + item.setData(True, IS_CONTAINER_ITEM_ROLE) + item.setData(unique_name, ITEM_UNIQUE_NAME_ROLE) + container_model_items.append(item) + + if not container_model_items: + continue + + progress = progress_by_id[repre_id] + active_site_progress = "{}%".format( + max(progress["active_site"], 0) * 100 + ) + remote_site_progress = "{}%".format( + max(progress["remote_site"], 0) * 100 + ) + + group_item = QtGui.QStandardItem() + group_item.setColumnCount(root_item.columnCount()) + group_item.setData(group_name, QtCore.Qt.DisplayRole) + group_item.setData(group_name, ITEM_UNIQUE_NAME_ROLE) + group_item.setData(group_item_icon, QtCore.Qt.DecorationRole) + group_item.setData(group_item_font, QtCore.Qt.FontRole) + group_item.setData(repre_info.product_id, PRODUCT_ID_ROLE) + group_item.setData(repre_info.product_type, PRODUCT_TYPE_ROLE) + group_item.setData(product_type_icon, PRODUCT_TYPE_ICON_ROLE) + group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) + group_item.setData(version_label, VERSION_LABEL_ROLE) + group_item.setData(len(container_items), COUNT_ROLE) + group_item.setData( + active_site_progress, ACTIVE_SITE_PROGRESS_ROLE + ) + group_item.setData( + remote_site_progress, REMOTE_SITE_PROGRESS_ROLE + ) + group_item.setData(active_site_icon, ACTIVE_SITE_ICON_ROLE) + group_item.setData(remote_site_icon, REMOTE_SITE_ICON_ROLE) + group_item.setData(False, IS_CONTAINER_ITEM_ROLE) + + if version_color is not None: + group_item.setData(version_color, VERSION_COLOR_ROLE) + + if repre_info.product_group: + group_item.setData( + repre_info.product_group, PRODUCT_GROUP_NAME_ROLE + ) + group_item.setData(group_icon, PRODUCT_GROUP_ICON_ROLE) + + group_item.appendRows(container_model_items) + group_items.append(group_item) + + if group_items: + root_item.appendRows(group_items) + + def flags(self, index): + return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable + def data(self, index, role): if not index.isValid(): return - item = index.internalPointer() + col = index.column() + if role == QtCore.Qt.DisplayRole: + role = self.display_role_by_column.get(col) + if role is None: + print(col, role) + return None - if role == QtCore.Qt.FontRole: - # Make top-level entries bold - if item.get("isGroupNode") or item.get("isNotSet"): # group-item - font = QtGui.QFont() - font.setBold(True) - return font + elif role == QtCore.Qt.DecorationRole: + role = self.decoration_role_by_column.get(col) + if role is None: + return None - if role == QtCore.Qt.ForegroundRole: - # Set the text color to the OUTDATED_COLOR when the - # collected version is not the same as the highest version - key = self.Columns[index.column()] - if key == "version": # version - if item.get("isGroupNode"): # group-item - if self.outdated(item): - return self.OUTDATED_COLOR + elif role == QtCore.Qt.ForegroundRole: + role = self.foreground_role_by_column.get(col) + if role is None: + return None - if self._hierarchy_view: - # If current group is not outdated, check if any - # outdated children. - for _node in walk_hierarchy(item): - if self.outdated(_node): - return self.CHILD_OUTDATED_COLOR - else: + if col != 0: + index = self.index(index.row(), 0, index.parent()) - if self._hierarchy_view: - # Although this is not a group item, we still need - # to distinguish which one contain outdated child. - for _node in walk_hierarchy(item): - if self.outdated(_node): - return self.CHILD_OUTDATED_COLOR.darker(150) - - return self.GRAYOUT_COLOR - - if key == "Name" and not item.get("isGroupNode"): - return self.GRAYOUT_COLOR - - # Add icons - if role == QtCore.Qt.DecorationRole: - if index.column() == 0: - # Override color - color = item.get("color", self._default_icon_color) - if item.get("isGroupNode"): # group-item - return qtawesome.icon("fa.folder", color=color) - if item.get("isNotSet"): - return qtawesome.icon("fa.exclamation-circle", color=color) - - return qtawesome.icon("fa.file-o", color=color) - - if index.column() == 3: - # Product type icon - return item.get("productTypeIcon", None) - - column_name = self.Columns[index.column()] - - if column_name == "group" and item.get("group"): - return qtawesome.icon("fa.object-group", - color=get_default_entity_icon_color()) - - if item.get("isGroupNode"): - if column_name == "active_site": - provider = item.get("active_site_provider") - return self._site_icons.get(provider) - - if column_name == "remote_site": - provider = item.get("remote_site_provider") - return self._site_icons.get(provider) - - if role == QtCore.Qt.DisplayRole and item.get("isGroupNode"): - column_name = self.Columns[index.column()] - progress = None - if column_name == "active_site": - progress = item.get("active_site_progress", 0) - elif column_name == "remote_site": - progress = item.get("remote_site_progress", 0) - if progress is not None: - return "{}%".format(max(progress, 0) * 100) - - if role == self.UniqueRole: - return item["representation"] + item.get("objectName", "") - - return super(InventoryModel, self).data(index, role) + return super().data(index, role) def set_hierarchy_view(self, state): """Set whether to display products in hierarchy view.""" @@ -165,299 +316,21 @@ class InventoryModel(TreeModel): if state != self._hierarchy_view: self._hierarchy_view = state - def refresh(self, selected=None, containers=None): - """Refresh the model""" + def get_outdated_item_ids(self): + return set() - # for debugging or testing, injecting items from outside - if containers is None: - containers = self._controller.get_containers() - - self.clear() - if not selected or not self._hierarchy_view: - self._add_containers(containers) - return - - # Filter by cherry-picked items - self._add_containers(( - container - for container in containers - if container["objectName"] in selected - )) - - def _add_containers(self, containers, parent=None): - """Add the items to the model. - - The items should be formatted similar to `api.ls()` returns, an item - is then represented as: - {"filename_v001.ma": [full/filename/of/loaded/filename_v001.ma, - full/filename/of/loaded/filename_v001.ma], - "nodetype" : "reference", - "node": "referenceNode1"} - - Note: When performing an additional call to `add_items` it will *not* - group the new items with previously existing item groups of the - same type. - - Args: - containers (generator): Container items. - parent (Item, optional): Set this item as parent for the added - items when provided. Defaults to the root of the model. - - Returns: - node.Item: root node which has children added based on the data - """ - - project_name = get_current_project_name() - - self.beginResetModel() - - # Group by representation - grouped = defaultdict(lambda: {"containers": list()}) - for container in containers: - repre_id = container["representation"] - grouped[repre_id]["containers"].append(container) - - ( - repres_by_id, - versions_by_id, - products_by_id, - folders_by_id, - ) = self._query_entities(project_name, set(grouped.keys())) - # Add to model - not_found = defaultdict(list) - not_found_ids = [] - for repre_id, group_dict in sorted(grouped.items()): - group_containers = group_dict["containers"] - representation = repres_by_id.get(repre_id) - if not representation: - not_found["representation"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - version_entity = versions_by_id.get(representation["versionId"]) - if not version_entity: - not_found["version"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - product_entity = products_by_id.get(version_entity["productId"]) - if not product_entity: - not_found["product"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - folder_entity = folders_by_id.get(product_entity["folderId"]) - if not folder_entity: - not_found["folder"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - group_dict.update({ - "representation": representation, - "version": version_entity, - "product": product_entity, - "folder": folder_entity - }) - - for _repre_id in not_found_ids: - grouped.pop(_repre_id) - - for where, group_containers in not_found.items(): - # create the group header - group_node = Item() - name = "< NOT FOUND - {} >".format(where) - group_node["Name"] = name - group_node["representation"] = name - group_node["count"] = len(group_containers) - group_node["isGroupNode"] = False - group_node["isNotSet"] = True - - self.add_child(group_node, parent=parent) - - for container in group_containers: - item_node = Item() - item_node.update(container) - item_node["Name"] = container.get("objectName", "NO NAME") - item_node["isNotFound"] = True - self.add_child(item_node, parent=group_node) - - # TODO Use product icons - product_type_icon = qtawesome.icon( - "fa.folder", color="#0091B2" - ) - # Prepare site sync specific data - progress_by_id = self._controller.get_representations_site_progress( - set(grouped.keys()) - ) - sites_info = self._controller.get_sites_information() - - # Query the highest available version so the model can know - # whether current version is currently up-to-date. - highest_version_by_product_id = ayon_api.get_last_versions( - project_name, - product_ids={ - group["version"]["productId"] for group in grouped.values() - }, - fields={"productId", "version"} - ) - # Map value to `version` key - highest_version_by_product_id = { - product_id: version["version"] - for product_id, version in highest_version_by_product_id.items() - } - - for repre_id, group_dict in sorted(grouped.items()): - group_containers = group_dict["containers"] - repre_entity = group_dict["representation"] - version_entity = group_dict["version"] - folder_entity = group_dict["folder"] - product_entity = group_dict["product"] - - product_type = product_entity["productType"] - - # create the group header - group_node = Item() - group_node["Name"] = "{}_{}: ({})".format( - folder_entity["name"], - product_entity["name"], - repre_entity["name"] - ) - group_node["representation"] = repre_id - - # Detect hero version type - version = version_entity["version"] - if version < 0: - version = HeroVersionType(version) - group_node["version"] = version - - # Check if the version is outdated. - # Hero versions are never considered to be outdated. - is_outdated = False - if not isinstance(version, HeroVersionType): - last_version = highest_version_by_product_id.get( - version_entity["productId"]) - if last_version is not None: - is_outdated = version_entity["version"] != last_version - group_node["isOutdated"] = is_outdated - - group_node["productType"] = product_type or "" - group_node["productTypeIcon"] = product_type_icon - group_node["count"] = len(group_containers) - group_node["isGroupNode"] = True - group_node["group"] = product_entity["attrib"].get("productGroup") - - # Site sync specific data - progress = progress_by_id[repre_id] - group_node.update(sites_info) - group_node["active_site_progress"] = progress["active_site"] - group_node["remote_site_progress"] = progress["remote_site"] - - self.add_child(group_node, parent=parent) - - for container in group_containers: - item_node = Item() - item_node.update(container) - - # store the current version on the item - item_node["version"] = version_entity["version"] - item_node["version_entity"] = version_entity - - # Remapping namespace to item name. - # Noted that the name key is capital "N", by doing this, we - # can view namespace in GUI without changing container data. - item_node["Name"] = container["namespace"] - - self.add_child(item_node, parent=group_node) - - self.endResetModel() - - return self._root_item - - def _query_entities(self, project_name, repre_ids): - """Query entities for representations from containers. - - Returns: - tuple[dict, dict, dict, dict]: Representation, version, product - and folder documents by id. - """ - - repres_by_id = {} - versions_by_id = {} - products_by_id = {} - folders_by_id = {} - output = ( - repres_by_id, - versions_by_id, - products_by_id, - folders_by_id, - ) - - filtered_repre_ids = set() - for repre_id in repre_ids: - # Filter out invalid representation ids - # NOTE: This is added because scenes from OpenPype did contain - # ObjectId from mongo. - try: - uuid.UUID(repre_id) - filtered_repre_ids.add(repre_id) - except ValueError: - continue - if not filtered_repre_ids: - return output - - repre_entities = ayon_api.get_representations(project_name, repre_ids) - repres_by_id.update({ - repre_entity["id"]: repre_entity - for repre_entity in repre_entities - }) - version_ids = { - repre_entity["versionId"] - for repre_entity in repres_by_id.values() - } - if not version_ids: - return output - - versions_by_id.update({ - version_entity["id"]: version_entity - for version_entity in ayon_api.get_versions( - project_name, version_ids=version_ids - ) - }) - - product_ids = { - version_entity["productId"] - for version_entity in versions_by_id.values() - } - if not product_ids: - return output - - products_by_id.update({ - product_entity["id"]: product_entity - for product_entity in ayon_api.get_products( - project_name, product_ids=product_ids - ) - }) - folder_ids = { - product_entity["folderId"] - for product_entity in products_by_id.values() - } - if not folder_ids: - return output - - folders_by_id.update({ - folder_entity["id"]: folder_entity - for folder_entity in ayon_api.get_folders( - project_name, folder_ids=folder_ids - ) - }) - return output + def _clear_items(self): + root_item = self.invisibleRootItem() + root_item.removeRows(0, root_item.rowCount()) class FilterProxyModel(QtCore.QSortFilterProxyModel): """Filter model to where key column's value is in the filtered tags""" def __init__(self, *args, **kwargs): - super(FilterProxyModel, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) + self.setDynamicSortFilter(True) + self.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) self._filter_outdated = False self._hierarchy_view = False @@ -467,28 +340,23 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): # Always allow bottom entries (individual containers), since their # parent group hidden if it wouldn't have been validated. - rows = model.rowCount(source_index) - if not rows: + if source_index.data(IS_CONTAINER_ITEM_ROLE): return True - # Filter by regex - if hasattr(self, "filterRegExp"): - regex = self.filterRegExp() - else: - regex = self.filterRegularExpression() - pattern = regex.pattern() - if pattern: - pattern = re.escape(pattern) - - if not self._matches(row, parent, pattern): - return False - if self._filter_outdated: # When filtering to outdated we filter the up to date entries # thus we "allow" them when they are outdated - if not self._is_outdated(row, parent): + if source_index.data(VERSION_IS_LATEST_ROLE): return False + # Filter by regex + if hasattr(self, "filterRegularExpression"): + regex = self.filterRegularExpression() + else: + regex = self.filterRegExp() + + if not self._matches(row, parent, regex.pattern()): + return False return True def set_filter_outdated(self, state): @@ -505,37 +373,6 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): if state != self._hierarchy_view: self._hierarchy_view = state - def _is_outdated(self, row, parent): - """Return whether row is outdated. - - A row is considered outdated if `isOutdated` data is true or not set. - - """ - def outdated(node): - return node.get("isOutdated", True) - - index = self.sourceModel().index(row, self.filterKeyColumn(), parent) - - # The scene contents are grouped by "representation", e.g. the same - # "representation" loaded twice is grouped under the same header. - # Since the version check filters these parent groups we skip that - # check for the individual children. - has_parent = index.parent().isValid() - if has_parent and not self._hierarchy_view: - return True - - # Filter to those that have the different version numbers - node = index.internalPointer() - if outdated(node): - return True - - if self._hierarchy_view: - for _node in walk_hierarchy(node): - if outdated(_node): - return True - - return False - def _matches(self, row, parent, pattern): """Return whether row matches regex pattern. @@ -548,38 +385,31 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): bool """ + if not pattern: + return True + + flags = 0 + if self.sortCaseSensitivity() == QtCore.Qt.CaseInsensitive: + flags = re.IGNORECASE + + regex = re.compile(re.escape(pattern), flags=flags) + model = self.sourceModel() column = self.filterKeyColumn() role = self.filterRole() - def matches(row, parent, pattern): + matches_queue = collections.deque() + matches_queue.append((row, parent)) + while matches_queue: + queue_item = matches_queue.popleft() + row, parent = queue_item + index = model.index(row, column, parent) - key = model.data(index, role) - if re.search(pattern, key, re.IGNORECASE): + value = model.data(index, role) + if regex.search(value): return True - if matches(row, parent, pattern): - return True + for idx in range(model.rowCount(index)): + matches_queue.append((idx, index)) - # Also allow if any of the children matches - source_index = model.index(row, column, parent) - rows = model.rowCount(source_index) - - if any( - matches(idx, source_index, pattern) - for idx in range(rows) - ): - return True - - if not self._hierarchy_view: - return False - - for idx in range(rows): - child_index = model.index(idx, column, source_index) - child_rows = model.rowCount(child_index) - return any( - self._matches(child_idx, child_index, pattern) - for child_idx in range(child_rows) - ) - - return True + return False diff --git a/client/ayon_core/tools/sceneinventory/models/__init__.py b/client/ayon_core/tools/sceneinventory/models/__init__.py index f840a45aa8..28bc7be4d4 100644 --- a/client/ayon_core/tools/sceneinventory/models/__init__.py +++ b/client/ayon_core/tools/sceneinventory/models/__init__.py @@ -1,6 +1,8 @@ +from .containers import ContainersModel from .sitesync import SiteSyncModel __all__ = ( + "ContainersModel", "SiteSyncModel", ) diff --git a/client/ayon_core/tools/sceneinventory/models/containers.py b/client/ayon_core/tools/sceneinventory/models/containers.py new file mode 100644 index 0000000000..5230827ef6 --- /dev/null +++ b/client/ayon_core/tools/sceneinventory/models/containers.py @@ -0,0 +1,343 @@ +import uuid +import collections + +import ayon_api +from ayon_api.graphql import GraphQlQuery +from ayon_core.host import ILoadHost + + +# --- Implementation that should be in ayon-python-api --- +# The implementation is not available in all versions of ayon-python-api. +RepresentationHierarchy = collections.namedtuple( + "RepresentationHierarchy", + ("folder", "product", "version", "representation") +) + + +def representations_parent_ids_qraphql_query(): + query = GraphQlQuery("RepresentationsHierarchyQuery") + + project_name_var = query.add_variable("projectName", "String!") + repre_ids_var = query.add_variable("representationIds", "[String!]") + + project_field = query.add_field("project") + project_field.set_filter("name", project_name_var) + + repres_field = project_field.add_field_with_edges("representations") + repres_field.add_field("id") + repres_field.add_field("name") + repres_field.set_filter("ids", repre_ids_var) + version_field = repres_field.add_field("version") + version_field.add_field("id") + product_field = version_field.add_field("product") + product_field.add_field("id") + product_field.add_field("name") + product_field.add_field("productType") + product_attrib_field = product_field.add_field("attrib") + product_attrib_field.add_field("productGroup") + folder_field = product_field.add_field("folder") + folder_field.add_field("id") + folder_field.add_field("path") + return query + + +def get_representations_hierarchy(project_name, representation_ids): + """Find representations parents by representation id. + + Representation parent entities up to project. + + Args: + project_name (str): Project where to look for entities. + representation_ids (Iterable[str]): Representation ids. + + Returns: + dict[str, RepresentationParents]: Parent entities by + representation id. + + """ + if not representation_ids: + return {} + + repre_ids = set(representation_ids) + output = { + repre_id: RepresentationHierarchy(None, None, None, None) + for repre_id in representation_ids + } + + query = representations_parent_ids_qraphql_query() + query.set_variable_value("projectName", project_name) + query.set_variable_value("representationIds", list(repre_ids)) + + con = ayon_api.get_server_api_connection() + parsed_data = query.query(con) + for repre in parsed_data["project"]["representations"]: + repre_id = repre["id"] + version = repre.pop("version") + product = version.pop("product") + folder = product.pop("folder") + + output[repre_id] = RepresentationHierarchy( + folder, product, version, repre + ) + + return output +# --- END of ayon-python-api implementation --- + + +class ContainerItem: + def __init__( + self, + representation_id, + loader_name, + namespace, + name, + object_name, + item_id + ): + self.representation_id = representation_id + self.loader_name = loader_name + self.object_name = object_name + self.namespace = namespace + self.name = name + self.item_id = item_id + + @classmethod + def from_container_data(cls, container): + return cls( + representation_id=container["representation"], + loader_name=container["loader"], + namespace=container["namespace"], + name=container["name"], + object_name=container["objectName"], + item_id=uuid.uuid4().hex, + ) + + +class RepresentationInfo: + def __init__( + self, + folder_id, + folder_path, + product_id, + product_name, + product_type, + product_group, + version_id, + representation_name, + ): + self.folder_id = folder_id + self.folder_path = folder_path + self.product_id = product_id + self.product_name = product_name + self.product_type = product_type + self.product_group = product_group + self.version_id = version_id + self.representation_name = representation_name + self._is_valid = None + + @property + def is_valid(self): + if self._is_valid is None: + self._is_valid = ( + self.folder_id is not None + and self.product_id is not None + and self.version_id is not None + and self.representation_name is not None + ) + return self._is_valid + + @classmethod + def new_invalid(cls): + return cls(None, None, None, None, None, None, None, None) + + +class VersionItem: + def __init__(self, version_id, product_id, version, status, is_latest): + self.version = version + self.version_id = version_id + self.product_id = product_id + self.version = version + self.status = status + self.is_latest = is_latest + + @property + def is_hero(self): + return self.version < 0 + + @classmethod + def from_entity(cls, version_entity, is_latest): + return cls( + version_id=version_entity["id"], + product_id=version_entity["productId"], + version=version_entity["version"], + status=version_entity["status"], + is_latest=is_latest, + ) + + +class ContainersModel: + def __init__(self, controller): + self._controller = controller + self._items_cache = None + self._containers_by_id = {} + self._container_items_by_id = {} + self._version_items_by_product_id = {} + self._repre_info_by_id = {} + + def reset(self): + self._items_cache = None + self._containers_by_id = {} + self._container_items_by_id = {} + self._version_items_by_product_id = {} + self._repre_info_by_id = {} + + def get_containers(self): + self._update_cache() + return list(self._containers_by_id.values()) + + def get_containers_by_item_ids(self, item_ids): + return { + item_id: self._containers_by_id.get(item_id) + for item_id in item_ids + } + + def get_container_items(self): + self._update_cache() + return list(self._items_cache) + + def get_container_items_by_id(self, item_ids): + return { + item_id: self._container_items_by_id.get(item_id) + for item_id in item_ids + } + + def get_representation_info_items(self, representation_ids): + output = {} + missing_repre_ids = set() + for repre_id in representation_ids: + try: + uuid.UUID(repre_id) + except ValueError: + output[repre_id] = RepresentationInfo.new_invalid() + continue + + repre_info = self._repre_info_by_id.get(repre_id) + if repre_info is None: + missing_repre_ids.add(repre_id) + else: + output[repre_id] = repre_info + + if not missing_repre_ids: + return output + + project_name = self._controller.get_current_project_name() + repre_hierarchy_by_id = get_representations_hierarchy( + project_name, missing_repre_ids + ) + for repre_id, repre_hierarchy in repre_hierarchy_by_id.items(): + kwargs = { + "folder_id": None, + "folder_path": None, + "product_id": None, + "product_name": None, + "product_type": None, + "product_group": None, + "version_id": None, + "representation_name": None, + } + folder = repre_hierarchy.folder + product = repre_hierarchy.product + version = repre_hierarchy.version + repre = repre_hierarchy.representation + if folder: + kwargs["folder_id"] = folder["id"] + kwargs["folder_path"] = folder["path"] + if product: + group = product["attrib"]["productGroup"] + kwargs["product_id"] = product["id"] + kwargs["product_name"] = product["name"] + kwargs["product_type"] = product["productType"] + kwargs["product_group"] = group + if version: + kwargs["version_id"] = version["id"] + if repre: + kwargs["representation_name"] = repre["name"] + + repre_info = RepresentationInfo(**kwargs) + self._repre_info_by_id[repre_id] = repre_info + output[repre_id] = repre_info + return output + + def get_version_items(self, product_ids): + if not product_ids: + return {} + + missing_ids = { + product_id + for product_id in product_ids + if product_id not in self._version_items_by_product_id + } + if missing_ids: + def version_sorted(entity): + return entity["version"] + + project_name = self._controller.get_current_project_name() + version_entities_by_product_id = { + product_id: [] + for product_id in missing_ids + } + + version_entities = list(ayon_api.get_versions( + project_name, + product_ids=missing_ids, + fields={"id", "version", "productId", "status"} + )) + version_entities.sort(key=version_sorted) + for version_entity in version_entities: + product_id = version_entity["productId"] + version_entities_by_product_id[product_id].append( + version_entity + ) + + for product_id, version_entities in ( + version_entities_by_product_id.items() + ): + last_version = abs(version_entities[-1]["version"]) + version_items_by_id = { + entity["id"]: VersionItem.from_entity( + entity, abs(entity["version"]) == last_version + ) + for entity in version_entities + } + self._version_items_by_product_id[product_id] = ( + version_items_by_id + ) + + return { + product_id: dict(self._version_items_by_product_id[product_id]) + for product_id in product_ids + } + + def _update_cache(self): + if self._items_cache is not None: + return + + host = self._controller.get_host() + if isinstance(host, ILoadHost): + containers = list(host.get_containers()) + elif hasattr(host, "ls"): + containers = list(host.ls()) + else: + containers = [] + container_items = [] + containers_by_id = {} + container_items_by_id = {} + for container in containers: + item = ContainerItem.from_container_data(container) + containers_by_id[item.item_id] = container + container_items_by_id[item.item_id] = item + container_items.append(item) + + self._containers_by_id = containers_by_id + self._container_items_by_id = container_items_by_id + self._items_cache = container_items diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 5cbd4daf70..9dcf3349e6 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -1,11 +1,8 @@ -import uuid import collections import logging -import itertools from functools import partial -import ayon_api -from qtpy import QtWidgets, QtCore +from qtpy import QtWidgets, QtCore, QtGui import qtawesome from ayon_core import style @@ -17,12 +14,21 @@ from ayon_core.pipeline import ( ) from ayon_core.tools.utils.lib import ( iter_model_rows, - format_version + format_version, + preserve_expanded_rows, + preserve_selection, ) from .switch_dialog import SwitchAssetDialog -from .model import InventoryModel - +from .model import ( + InventoryModel, + FilterProxyModel, + ITEM_UNIQUE_NAME_ROLE, + OBJECT_NAME_ROLE, + ITEM_ID_ROLE, + IS_CONTAINER_ITEM_ROLE, +) +from .delegates import VersionDelegate DEFAULT_COLOR = "#fb9c15" @@ -43,185 +49,187 @@ class SceneInventoryView(QtWidgets.QTreeView): self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + model = InventoryModel(controller) + proxy_model = FilterProxyModel() + proxy_model.setSourceModel(model) + + self.setModel(proxy_model) + + version_delegate = VersionDelegate() + self.setItemDelegateForColumn(model.version_col, version_delegate) + + # set some nice default widths for the view + for col, width in model.width_by_column.items(): + self.setColumnWidth(col, width) + + sync_enabled = controller.is_sitesync_enabled() + self.setColumnHidden(model.active_site_col, not sync_enabled) + self.setColumnHidden(model.remote_site_col, not sync_enabled) + self.customContextMenuRequested.connect(self._show_right_mouse_menu) + self._model = model + self._proxy_model = proxy_model + self._version_delegate = version_delegate + self._hierarchy_view = False self._selected = None self._controller = controller + def refresh(self): + with preserve_expanded_rows( + tree_view=self, + role=ITEM_UNIQUE_NAME_ROLE + ): + with preserve_selection( + tree_view=self, + role=ITEM_UNIQUE_NAME_ROLE, + current_index=False + ): + kwargs = {} + # TODO do not touch view's inner attribute + if self._hierarchy_view: + kwargs["selected"] = self._selected + self._model.refresh(**kwargs) + + def set_hierarchy_view(self, enabled): + self._proxy.set_hierarchy_view(enabled) + self._model.set_hierarchy_view(enabled) + + def set_text_filter(self, text_filter): + if hasattr(self._proxy, "setFilterRegularExpression"): + self._proxy.setFilterRegularExpression(text_filter) + else: + self._proxy.setFilterRegExp(text_filter) + + def set_filter_outdated(self, enabled): + self._proxy.set_filter_outdated(enabled) + + def get_selected_indexes(self): + """Get the selected rows""" + indexes, _ = self._get_selected_indexes() + return indexes + + def get_selected_item_ids(self): + return self._get_item_ids_from_indexes( + self.get_selected_indexes() + ) + + def get_selected_container_indexes(self): + return self._get_container_indexes( + self.get_selected_indexes() + ) + + def _get_selected_indexes(self): + selection_model = self.selectionModel() + indexes = selection_model.selectedRows() + active = self.currentIndex() + active = active.sibling(active.row(), 0) + if active not in indexes: + indexes.append(active) + return indexes, active + + def _get_item_ids_from_indexes(self, indexes): + return { + index.data(ITEM_ID_ROLE) + for index in self._get_container_indexes(indexes) + } + def _set_hierarchy_view(self, enabled): if enabled == self._hierarchy_view: return self._hierarchy_view = enabled self.hierarchy_view_changed.emit(enabled) - def _enter_hierarchy(self, items): - self._selected = set(i["objectName"] for i in items) + def _enter_hierarchy(self, item_ids): + self._selected = set(item_ids) self._set_hierarchy_view(True) self.data_changed.emit() self.expandToDepth(1) - self.setStyleSheet(""" - QTreeView { - border-color: #fb9c15; - } - """) + self.setStyleSheet("border-color: #fb9c15;") def _leave_hierarchy(self): self._set_hierarchy_view(False) self.data_changed.emit() - self.setStyleSheet("QTreeView {}") + self.setStyleSheet("") - def _build_item_menu_for_selection(self, items, menu): - # Exclude items that are "NOT FOUND" since setting versions, updating - # and removal won't work for those items. - items = [item for item in items if not item.get("isNotFound")] - if not items: + def _build_item_menu_for_selection(self, menu, indexes, active_index): + item_ids = { + index.data(ITEM_ID_ROLE) + for index in indexes + } + item_ids.discard(None) + if not item_ids: return - # An item might not have a representation, for example when an item - # is listed as "NOT FOUND" - repre_ids = set() - for item in items: - repre_id = item["representation"] - try: - uuid.UUID(repre_id) - repre_ids.add(repre_id) - except ValueError: - pass - - project_name = self._controller.get_current_project_name() - repre_entities = ayon_api.get_representations( - project_name, - representation_ids=repre_ids, - fields={"versionId"} + container_items_by_id = self._controller.get_container_items_by_id( + item_ids ) - version_ids = { - repre_entity["versionId"] - for repre_entity in repre_entities + active_repre_id = None + if active_index is not None: + for index in self._get_container_indexes({active_index}): + item_id = index.data(ITEM_ID_ROLE) + container_item = container_items_by_id[item_id] + active_repre_id = container_item.representation_id + break + + repre_info_by_id = self._controller.get_representation_info_items({ + container_item.representation_id + for container_item in container_items_by_id.values() + }) + valid_repre_ids = { + repre_id + for repre_id, repre_info in repre_info_by_id.items() + if repre_info.is_valid } - loaded_versions = ayon_api.get_versions( - project_name, version_ids=version_ids - ) - - loaded_hero_versions = [] - versions_by_product_id = collections.defaultdict(list) + # Exclude items that are "NOT FOUND" since setting versions, updating + # and removal won't work for those items. + filtered_items = [] product_ids = set() - for version_entity in loaded_versions: - version = version_entity["version"] - if version < 0: - loaded_hero_versions.append(version_entity) - else: - product_id = version_entity["productId"] - versions_by_product_id[product_id].append(version_entity) - product_ids.add(product_id) + version_ids = set() + for container_item in container_items_by_id.values(): + repre_id = container_item.representation_id + repre_info = repre_info_by_id.get(repre_id) + if repre_info and repre_info.is_valid: + filtered_items.append(container_item) + version_ids.add(repre_info.version_id) + product_ids.add(repre_info.product_id) - all_versions = ayon_api.get_versions( - project_name, product_ids=product_ids + # remove + remove_icon = qtawesome.icon("fa.remove", color=DEFAULT_COLOR) + remove_action = QtWidgets.QAction(remove_icon, "Remove items", menu) + remove_action.triggered.connect( + lambda: self._show_remove_warning_dialog(item_ids)) + + if not filtered_items: + # Keep remove action for invalid items + menu.addAction(remove_action) + return + + version_items_by_product_id = self._controller.get_version_items( + product_ids ) - hero_versions = [] - version_entities = [] - for version_entity in all_versions: - version = version_entity["version"] - if version < 0: - hero_versions.append(version_entity) - else: - version_entities.append(version_entity) - - has_loaded_hero_versions = len(loaded_hero_versions) > 0 - has_available_hero_version = len(hero_versions) > 0 has_outdated = False + has_loaded_hero_versions = False + has_available_hero_version = False + for version_items_by_id in version_items_by_product_id.values(): + for version_item in version_items_by_id.values(): + if version_item.is_hero: + has_available_hero_version = True - for version_entity in version_entities: - product_id = version_entity["productId"] - current_versions = versions_by_product_id[product_id] - for current_version in current_versions: - if current_version["version"] < version_entity["version"]: + if version_item.version_id not in version_ids: + continue + if version_item.is_hero: + has_loaded_hero_versions = True + + elif not version_item.is_latest: has_outdated = True - break - - if has_outdated: - break switch_to_versioned = None if has_loaded_hero_versions: - def _on_switch_to_versioned(items): - repre_ids = { - item["representation"] - for item in items - } - - repre_entities = ayon_api.get_representations( - project_name, - representation_ids=repre_ids, - fields={"id", "versionId"} - ) - - version_id_by_repre_id = {} - for repre_entity in repre_entities: - repre_id = repre_entity["id"] - version_id = repre_entity["versionId"] - version_id_by_repre_id[repre_id] = version_id - version_ids = set(version_id_by_repre_id.values()) - - src_version_entity_by_id = { - version_entity["id"]: version_entity - for version_entity in ayon_api.get_versions( - project_name, - version_ids, - fields={"productId", "version"} - ) - } - hero_versions_by_product_id = {} - for version_entity in src_version_entity_by_id.values(): - version = version_entity["version"] - if version < 0: - product_id = version_entity["productId"] - hero_versions_by_product_id[product_id] = abs(version) - - if not hero_versions_by_product_id: - return - - standard_versions = ayon_api.get_versions( - project_name, - product_ids=hero_versions_by_product_id.keys(), - versions=hero_versions_by_product_id.values() - ) - standard_version_by_product_id = { - product_id: {} - for product_id in hero_versions_by_product_id.keys() - } - for version_entity in standard_versions: - product_id = version_entity["productId"] - version = version_entity["version"] - standard_version_by_product_id[product_id][version] = ( - version_entity - ) - - # Specify version per item to update to - update_items = [] - update_versions = [] - for item in items: - repre_id = item["representation"] - version_id = version_id_by_repre_id.get(repre_id) - version_entity = src_version_entity_by_id.get(version_id) - if not version_entity or version_entity["version"] >= 0: - continue - product_id = version_entity["productId"] - version_entities_by_version = ( - standard_version_by_product_id[product_id] - ) - new_version = hero_versions_by_product_id.get(product_id) - new_version_entity = version_entities_by_version.get( - new_version - ) - if new_version_entity is not None: - update_items.append(item) - update_versions.append(new_version) - self._update_containers(update_items, update_versions) - update_icon = qtawesome.icon( "fa.asterisk", color=DEFAULT_COLOR @@ -232,7 +240,7 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) switch_to_versioned.triggered.connect( - lambda: _on_switch_to_versioned(items) + lambda: self._on_switch_to_versioned(item_ids) ) update_to_latest_action = None @@ -247,7 +255,9 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) update_to_latest_action.triggered.connect( - lambda: self._update_containers(items, version=-1) + lambda: self._update_containers_to_version( + item_ids, version=-1 + ) ) change_to_hero = None @@ -263,20 +273,23 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) change_to_hero.triggered.connect( - lambda: self._update_containers( - items, version=HeroVersionType(-1) + lambda: self._update_containers_to_version( + item_ids, version=HeroVersionType(-1) ) ) # set version - set_version_icon = qtawesome.icon("fa.hashtag", color=DEFAULT_COLOR) - set_version_action = QtWidgets.QAction( - set_version_icon, - "Set version", - menu - ) - set_version_action.triggered.connect( - lambda: self._show_version_dialog(items)) + set_version_action = None + if active_repre_id is not None: + set_version_icon = qtawesome.icon("fa.hashtag", color=DEFAULT_COLOR) + set_version_action = QtWidgets.QAction( + set_version_icon, + "Set version", + menu + ) + set_version_action.triggered.connect( + lambda: self._show_version_dialog(item_ids, active_repre_id) + ) # switch folder switch_folder_icon = qtawesome.icon("fa.sitemap", color=DEFAULT_COLOR) @@ -286,13 +299,7 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) switch_folder_action.triggered.connect( - lambda: self._show_switch_dialog(items)) - - # remove - remove_icon = qtawesome.icon("fa.remove", color=DEFAULT_COLOR) - remove_action = QtWidgets.QAction(remove_icon, "Remove items", menu) - remove_action.triggered.connect( - lambda: self._show_remove_warning_dialog(items)) + lambda: self._show_switch_dialog(item_ids)) # add the actions if switch_to_versioned: @@ -304,14 +311,15 @@ class SceneInventoryView(QtWidgets.QTreeView): if change_to_hero: menu.addAction(change_to_hero) - menu.addAction(set_version_action) + if set_version_action is not None: + menu.addAction(set_version_action) menu.addAction(switch_folder_action) menu.addSeparator() menu.addAction(remove_action) - self._handle_sitesync(menu, repre_ids) + self._handle_sitesync(menu, valid_repre_ids) def _handle_sitesync(self, menu, repre_ids): """Adds actions for download/upload when SyncServer is enabled @@ -327,6 +335,9 @@ class SceneInventoryView(QtWidgets.QTreeView): if not self._controller.is_sitesync_enabled(): return + if not repre_ids: + return + menu.addSeparator() download_icon = qtawesome.icon("fa.download", color=DEFAULT_COLOR) @@ -365,30 +376,35 @@ class SceneInventoryView(QtWidgets.QTreeView): self.data_changed.emit() - def _build_item_menu(self, items=None): + def _build_item_menu(self, indexes=None, active_index=None): """Create menu for the selected items""" - - if not items: - items = [] - menu = QtWidgets.QMenu(self) - # add the actions - self._build_item_menu_for_selection(items, menu) - # These two actions should be able to work without selection # expand all items - expandall_action = QtWidgets.QAction(menu, text="Expand all items") - expandall_action.triggered.connect(self.expandAll) + expand_all_action = QtWidgets.QAction(menu, text="Expand all items") + expand_all_action.triggered.connect(self.expandAll) # collapse all items collapse_action = QtWidgets.QAction(menu, text="Collapse all items") collapse_action.triggered.connect(self.collapseAll) - menu.addAction(expandall_action) + if not indexes: + indexes = [] + + item_ids = { + index.data(ITEM_ID_ROLE) + for index in indexes + } + item_ids.discard(None) + + # add the actions + self._build_item_menu_for_selection(menu, indexes, active_index) + + menu.addAction(expand_all_action) menu.addAction(collapse_action) - custom_actions = self._get_custom_actions(containers=items) + custom_actions = self._get_custom_actions(item_ids) if custom_actions: submenu = QtWidgets.QMenu("Actions", self) for action in custom_actions: @@ -396,7 +412,10 @@ class SceneInventoryView(QtWidgets.QTreeView): icon = qtawesome.icon("fa.%s" % action.icon, color=color) action_item = QtWidgets.QAction(icon, action.label, submenu) action_item.triggered.connect( - partial(self._process_custom_action, action, items)) + partial( + self._process_custom_action, action, item_ids + ) + ) submenu.addAction(action_item) @@ -421,9 +440,9 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) enter_hierarchy_action.triggered.connect( - lambda: self._enter_hierarchy(items)) + lambda: self._enter_hierarchy(item_ids)) - if items: + if indexes: menu.addAction(enter_hierarchy_action) if back_to_flat_action is not None: @@ -431,11 +450,11 @@ class SceneInventoryView(QtWidgets.QTreeView): return menu - def _get_custom_actions(self, containers): + def _get_custom_actions(self, item_ids): """Get the registered Inventory Actions Args: - containers(list): collection of containers + item_ids (Iterable[str]): collection of containers Returns: list: collection of filter and initialized actions @@ -448,29 +467,40 @@ class SceneInventoryView(QtWidgets.QTreeView): # Fedd an empty dict if no selection, this will ensure the compat # lookup always work, so plugin can interact with Scene Inventory # reversely. - containers = containers or [dict()] + if not item_ids: + containers = [dict()] + else: + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + containers = list(containers_by_id.values()) # Check which action will be available in the menu Plugins = discover_inventory_actions() - compatible = [p() for p in Plugins if - any(p.is_compatible(c) for c in containers)] + compatible = [ + p() + for p in Plugins + if any(p.is_compatible(c) for c in containers) + ] return sorted(compatible, key=sorter) - def _process_custom_action(self, action, containers): + def _process_custom_action(self, action, item_ids): """Run action and if results are returned positive update the view If the result is list or dict, will select view items by the result. Args: action (InventoryAction): Inventory Action instance - containers (list): Data of currently selected items + item_ids (Iterable[str]): Data of currently selected items Returns: None """ - - result = action.process(containers) + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + result = action.process(list(containers_by_id.values())) if result: self.data_changed.emit() @@ -498,17 +528,24 @@ class SceneInventoryView(QtWidgets.QTreeView): if options.get("clear", True): self.clearSelection() - object_names = set(object_names) - if ( - self._hierarchy_view - and not self._selected.issuperset(object_names) - ): - # If any container not in current cherry-picked view, update - # view before selecting them. - self._selected.update(object_names) - self.data_changed.emit() - model = self.model() + object_names = set(object_names) + if self._hierarchy_view: + item_ids = set() + for index in iter_model_rows(model): + if not index.data(IS_CONTAINER_ITEM_ROLE): + continue + if index.data(OBJECT_NAME_ROLE) in object_names: + item_id = index.data(ITEM_ID_ROLE) + if item_id: + item_ids.add(item_id) + + if not self._selected.issuperset(item_ids): + # If any container not in current cherry-picked view, update + # view before selecting them. + self._selected.update(item_ids) + self.data_changed.emit() + selection_model = self.selectionModel() select_mode = { @@ -517,12 +554,10 @@ class SceneInventoryView(QtWidgets.QTreeView): "toggle": QtCore.QItemSelectionModel.Toggle, }[options.get("mode", "select")] - for index in iter_model_rows(model, 0): - item = index.data(InventoryModel.ItemRole) - if item.get("isGroupNode"): + for index in iter_model_rows(model): + if not index.data(IS_CONTAINER_ITEM_ROLE): continue - - name = item.get("objectName") + name = index.data(OBJECT_NAME_ROLE) if name in object_names: self.scrollTo(index) # Ensure item is visible flags = select_mode | QtCore.QItemSelectionModel.Rows @@ -539,143 +574,140 @@ class SceneInventoryView(QtWidgets.QTreeView): globalpos = self.viewport().mapToGlobal(pos) if not self.selectionModel().hasSelection(): - print("No selection") # Build menu without selection, feed an empty list menu = self._build_item_menu() menu.exec_(globalpos) return - active = self.currentIndex() # index under mouse - active = active.sibling(active.row(), 0) # get first column - - # move index under mouse - indices = self.get_indices() - if active in indices: - indices.remove(active) - - indices.append(active) + indexes, active_index = self._get_selected_indexes() # Extend to the sub-items - all_indices = self._extend_to_children(indices) - items = [dict(i.data(InventoryModel.ItemRole)) for i in all_indices - if i.parent().isValid()] + all_indexes = self._extend_to_children(indexes) - if self._hierarchy_view: - # Ensure no group item - items = [n for n in items if not n.get("isGroupNode")] - - menu = self._build_item_menu(items) + menu = self._build_item_menu(all_indexes, active_index) menu.exec_(globalpos) - def get_indices(self): - """Get the selected rows""" - selection_model = self.selectionModel() - return selection_model.selectedRows() + def _get_container_indexes(self, indexes): + container_indexes = [] + indexes_queue = collections.deque() + indexes_queue.extend(indexes) + # Ignore already added containers + items_ids = set() + while indexes_queue: + index = indexes_queue.popleft() + if index.data(IS_CONTAINER_ITEM_ROLE): + item_id = index.data(ITEM_ID_ROLE) + if item_id in items_ids: + continue + items_ids.add(item_id) + container_indexes.append(index) + continue + model = index.model() + for row in range(model.rowCount(index)): + child = model.index(row, 0, parent=index) + indexes_queue.append(child) + return container_indexes - def _extend_to_children(self, indices): + def _extend_to_children(self, indexes): """Extend the indices to the children indices. Top-level indices are extended to its children indices. Sub-items are kept as is. Args: - indices (list): The indices to extend. + indexes (list): The indices to extend. Returns: list: The children indices """ - def get_children(i): - model = i.model() - rows = model.rowCount(parent=i) - for row in range(rows): - child = model.index(row, 0, parent=i) - yield child + def get_children(index): + model = index.model() + for row in range(model.rowCount(index)): + yield model.index(row, 0, parent=index) subitems = set() - for i in indices: - valid_parent = i.parent().isValid() - if valid_parent and i not in subitems: - subitems.add(i) + for index in indexes: + if index.parent().isValid() and index not in subitems: + subitems.add(index) if self._hierarchy_view: # Assume this is a group item - for child in get_children(i): + for child in get_children(index): subitems.add(child) else: # is top level item - for child in get_children(i): + for child in get_children(index): subitems.add(child) return list(subitems) - def _show_version_dialog(self, items): + def _show_version_dialog(self, item_ids, active_repre_id): """Create a dialog with the available versions for the selected file Args: - items (list): list of items to run the "set_version" for + item_ids (Iterable[str]): List of item ids to run the + "set_version" for. + active_repre_id (Union[str, None]): Active representation id. Returns: None + """ - - active = items[-1] - - project_name = self._controller.get_current_project_name() - # Get available versions for active representation - repre_entity = ayon_api.get_representation_by_id( - project_name, - active["representation"], - fields={"versionId"} + container_items_by_id = self._controller.get_container_items_by_id( + item_ids + ) + repre_ids = { + container_item.representation_id + for container_item in container_items_by_id.values() + } + repre_info_by_id = self._controller.get_representation_info_items( + repre_ids ) - repre_version_entity = ayon_api.get_version_by_id( - project_name, - repre_entity["versionId"], - fields={"productId"} - ) + active_repre_info = repre_info_by_id[active_repre_id] + active_product_id = active_repre_info.product_id + active_version_id = active_repre_info.version_id + filtered_repre_info_by_id = { + repre_id: repre_info + for repre_id, repre_info in repre_info_by_id.items() + if repre_info.product_id == active_product_id + } + filtered_container_item_ids = { + item_id + for item_id, container_item in container_items_by_id.items() + if container_item.representation_id in filtered_repre_info_by_id + } + version_items_by_id = self._controller.get_version_items( + {active_product_id} + )[active_product_id] - version_entities = list(ayon_api.get_versions( - project_name, - product_ids={repre_version_entity["productId"]}, - )) - hero_version = None - standard_versions = [] - for version_entity in version_entities: - if version_entity["version"] < 0: - hero_version = version_entity - else: - standard_versions.append(version_entity) - standard_versions.sort(key=lambda item: item["version"]) - standard_versions.reverse() + def version_sorter(item): + hero_value = 0 + version = item.version + if version < 0: + hero_value = 1 + version = abs(version) + return version, hero_value - # Get index among the listed versions - current_item = None - current_version = active["version"] - if isinstance(current_version, HeroVersionType): - current_item = hero_version - else: - for version_entity in standard_versions: - if version_entity["version"] == current_version: - current_item = version_entity - break + version_items = list(version_items_by_id.values()) + version_items.sort(key=version_sorter, reverse=True) - all_versions = [] - if hero_version: - all_versions.append(hero_version) - all_versions.extend(standard_versions) - - if current_item: - index = all_versions.index(current_item) - else: - index = 0 - - versions_by_label = dict() + versions_by_label = {} labels = [] - for version_entity in all_versions: - label = format_version(version_entity["version"]) + active_version_label = None + for version_item in version_items: + version = version_item.version + label = format_version(version) + if version_item.version_id == active_version_id: + active_version_label = label + labels.append(label) - versions_by_label[label] = version_entity["version"] + versions_by_label[label] = version + + index = 0 + if active_version_label in labels: + index = labels.index(active_version_label) label, state = QtWidgets.QInputDialog.getItem( self, @@ -692,24 +724,35 @@ class SceneInventoryView(QtWidgets.QTreeView): version = versions_by_label[label] if version < 0: version = HeroVersionType(version) - self._update_containers(items, version) - def _show_switch_dialog(self, items): + self._update_containers_to_version( + filtered_container_item_ids, version + ) + + def _show_switch_dialog(self, item_ids): """Display Switch dialog""" - dialog = SwitchAssetDialog(self._controller, self, items) + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + dialog = SwitchAssetDialog( + self._controller, self, list(containers_by_id.values()) + ) dialog.switched.connect(self.data_changed.emit) dialog.show() - def _show_remove_warning_dialog(self, items): + def _show_remove_warning_dialog(self, item_ids): """Prompt a dialog to inform the user the action will remove items""" - + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + containers = list(containers_by_id.values()) accept = QtWidgets.QMessageBox.Ok buttons = accept | QtWidgets.QMessageBox.Cancel state = QtWidgets.QMessageBox.question( self, "Are you sure?", - "Are you sure you want to remove {} item(s)".format(len(items)), + f"Are you sure you want to remove {len(containers)} item(s)", buttons=buttons, defaultButton=accept ) @@ -717,15 +760,15 @@ class SceneInventoryView(QtWidgets.QTreeView): if state != accept: return - for item in items: - remove_container(item) + for container in containers: + remove_container(container) self.data_changed.emit() - def _show_version_error_dialog(self, version, items): + def _show_version_error_dialog(self, version, item_ids): """Shows QMessageBox when version switch doesn't work - Args: - version: str or int or None + Args: + version: str or int or None """ if version == -1: version_str = "latest" @@ -745,7 +788,7 @@ class SceneInventoryView(QtWidgets.QTreeView): "Switch Folder", QtWidgets.QMessageBox.ActionRole ) - switch_btn.clicked.connect(lambda: self._show_switch_dialog(items)) + switch_btn.clicked.connect(lambda: self._show_switch_dialog(item_ids)) dialog.addButton(QtWidgets.QMessageBox.Cancel) @@ -760,69 +803,106 @@ class SceneInventoryView(QtWidgets.QTreeView): def update_all(self): """Update all items that are currently 'outdated' in the view""" # Get the source model through the proxy model - model = self.model().sourceModel() - - # Get all items from outdated groups - outdated_items = [] - for index in iter_model_rows(model, - column=0, - include_root=False): - item = index.data(model.ItemRole) - - if not item.get("isGroupNode"): - continue - - # Only the group nodes contain the "highest_version" data and as - # such we find only the groups and take its children. - if not model.outdated(item): - continue - - # Collect all children which we want to update - children = item.children() - outdated_items.extend(children) - - if not outdated_items: + item_ids = self._model.get_outdated_item_ids() + if not item_ids: log.info("Nothing to update.") return # Trigger update to latest - self._update_containers(outdated_items, version=-1) + self._update_containers_to_version(item_ids, version=-1) - def _update_containers(self, items, version): + def _on_switch_to_versioned(self, item_ids): + containers_items_by_id = self._controller.get_container_items_by_id( + item_ids + ) + product_ids = { + container_item.product_id + for container_item in containers_items_by_id.values() + if container_item.is_valid + } + version_items_by_product_id = self._controller.get_version_items( + product_ids + ) + + update_containers = [] + update_versions = [] + for item_id, container_item in containers_items_by_id.items(): + product_id = container_item.product_id + version_items_id = version_items_by_product_id[product_id] + version_item = version_items_id.get(container_item.version_id, {}) + if not version_item or not version_item.is_hero: + continue + version = abs(version_item.version) + version_found = False + for version_item in version_items_id.values(): + if version_item.is_hero: + continue + if version_item.version == version: + version_found = True + break + + if not version_found: + continue + + update_containers.append(container_item.item_id) + update_versions.append(version) + + # Specify version per item to update to + self._update_containers(update_containers, update_versions) + + def _update_containers(self, item_ids, versions): """Helper to update items to given version (or version per item) If at least one item is specified this will always try to refresh the inventory even if errors occurred on any of the items. Arguments: - items (list): Items to update - version (int or list): Version to set to. + item_ids (Iterable[str]): Items to update + versions (Iterable[Union[int, HeroVersion]]): Version to set to. This can be a list specifying a version for each item. Like `update_container` version -1 sets the latest version and HeroTypeVersion instances set the hero version. """ - if isinstance(version, (list, tuple)): - # We allow a unique version to be specified per item. In that case - # the length must match with the items - assert len(items) == len(version), ( - "Number of items mismatches number of versions: " - "{} items - {} versions".format(len(items), len(version)) - ) - versions = version - else: - # Repeat the same version infinitely - versions = itertools.repeat(version) + # We allow a unique version to be specified per item. In that case + # the length must match with the items + assert len(item_ids) == len(versions), ( + "Number of items mismatches number of versions: " + f"{len(item_ids)} items - {len(versions)} versions" + ) # Trigger update to latest + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) try: - for item, item_version in zip(items, versions): + for item_id, item_version in zip(item_ids, versions): + container = containers_by_id[item_id] try: - update_container(item, item_version) + update_container(container, item_version) except AssertionError: - self._show_version_error_dialog(item_version, [item]) log.warning("Update failed", exc_info=True) + self._show_version_error_dialog( + item_version, [item_id] + ) finally: # Always update the scene inventory view, even if errors occurred self.data_changed.emit() + + def _update_containers_to_version(self, item_ids, version): + """Helper to update items to given version (or version per item) + + If at least one item is specified this will always try to refresh + the inventory even if errors occurred on any of the items. + + Arguments: + item_ids (Iterable[str]): Items to update + version (Union[int, HeroVersion]): Version to set to. + This can be a list specifying a version for each item. + Like `update_container` version -1 sets the latest version + and HeroTypeVersion instances set the hero version. + + """ + versions = [version for _ in range(len(item_ids))] + self._update_containers(item_ids, versions) diff --git a/client/ayon_core/tools/sceneinventory/window.py b/client/ayon_core/tools/sceneinventory/window.py index 555db3a17c..58ff0c3b6d 100644 --- a/client/ayon_core/tools/sceneinventory/window.py +++ b/client/ayon_core/tools/sceneinventory/window.py @@ -2,17 +2,10 @@ from qtpy import QtWidgets, QtCore, QtGui import qtawesome from ayon_core import style, resources -from ayon_core.tools.utils.lib import ( - preserve_expanded_rows, - preserve_selection, -) +from ayon_core.tools.utils import PlaceholderLineEdit + from ayon_core.tools.sceneinventory import SceneInventoryController -from .delegates import VersionDelegate -from .model import ( - InventoryModel, - FilterProxyModel -) from .view import SceneInventoryView @@ -20,7 +13,7 @@ class SceneInventoryWindow(QtWidgets.QDialog): """Scene Inventory window""" def __init__(self, controller=None, parent=None): - super(SceneInventoryWindow, self).__init__(parent) + super().__init__(parent) if controller is None: controller = SceneInventoryController() @@ -33,10 +26,9 @@ class SceneInventoryWindow(QtWidgets.QDialog): self.resize(1100, 480) - # region control - filter_label = QtWidgets.QLabel("Search", self) - text_filter = QtWidgets.QLineEdit(self) + text_filter = PlaceholderLineEdit(self) + text_filter.setPlaceholderText("Filter by name...") outdated_only_checkbox = QtWidgets.QCheckBox( "Filter to outdated", self @@ -44,52 +36,30 @@ class SceneInventoryWindow(QtWidgets.QDialog): outdated_only_checkbox.setToolTip("Show outdated files only") outdated_only_checkbox.setChecked(False) - icon = qtawesome.icon("fa.arrow-up", color="white") + update_all_icon = qtawesome.icon("fa.arrow-up", color="white") update_all_button = QtWidgets.QPushButton(self) update_all_button.setToolTip("Update all outdated to latest version") - update_all_button.setIcon(icon) + update_all_button.setIcon(update_all_icon) - icon = qtawesome.icon("fa.refresh", color="white") + refresh_icon = qtawesome.icon("fa.refresh", color="white") refresh_button = QtWidgets.QPushButton(self) refresh_button.setToolTip("Refresh") - refresh_button.setIcon(icon) + refresh_button.setIcon(refresh_icon) - control_layout = QtWidgets.QHBoxLayout() - control_layout.addWidget(filter_label) - control_layout.addWidget(text_filter) - control_layout.addWidget(outdated_only_checkbox) - control_layout.addWidget(update_all_button) - control_layout.addWidget(refresh_button) - - model = InventoryModel(controller) - proxy = FilterProxyModel() - proxy.setSourceModel(model) - proxy.setDynamicSortFilter(True) - proxy.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) + headers_widget = QtWidgets.QWidget(self) + headers_layout = QtWidgets.QHBoxLayout(headers_widget) + headers_layout.setContentsMargins(0, 0, 0, 0) + headers_layout.addWidget(filter_label, 0) + headers_layout.addWidget(text_filter, 1) + headers_layout.addWidget(outdated_only_checkbox, 0) + headers_layout.addWidget(update_all_button, 0) + headers_layout.addWidget(refresh_button, 0) view = SceneInventoryView(controller, self) - view.setModel(proxy) - sync_enabled = controller.is_sitesync_enabled() - view.setColumnHidden(model.active_site_col, not sync_enabled) - view.setColumnHidden(model.remote_site_col, not sync_enabled) - - # set some nice default widths for the view - view.setColumnWidth(0, 250) # name - view.setColumnWidth(1, 55) # version - view.setColumnWidth(2, 55) # count - view.setColumnWidth(3, 150) # product type - view.setColumnWidth(4, 120) # group - view.setColumnWidth(5, 150) # loader - - # apply delegates - version_delegate = VersionDelegate(controller, self) - column = model.Columns.index("version") - view.setItemDelegateForColumn(column, version_delegate) - - layout = QtWidgets.QVBoxLayout(self) - layout.addLayout(control_layout) - layout.addWidget(view) + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.addWidget(headers_widget, 0) + main_layout.addWidget(view, 1) show_timer = QtCore.QTimer() show_timer.setInterval(0) @@ -114,12 +84,8 @@ class SceneInventoryWindow(QtWidgets.QDialog): self._update_all_button = update_all_button self._outdated_only_checkbox = outdated_only_checkbox self._view = view - self._model = model - self._proxy = proxy - self._version_delegate = version_delegate self._first_show = True - self._first_refresh = True def showEvent(self, event): super(SceneInventoryWindow, self).showEvent(event) @@ -139,29 +105,16 @@ class SceneInventoryWindow(QtWidgets.QDialog): whilst trying to name an instance. """ + pass def _on_refresh_request(self): """Signal callback to trigger 'refresh' without any arguments.""" self.refresh() - def refresh(self, containers=None): - self._first_refresh = False + def refresh(self): self._controller.reset() - with preserve_expanded_rows( - tree_view=self._view, - role=self._model.UniqueRole - ): - with preserve_selection( - tree_view=self._view, - role=self._model.UniqueRole, - current_index=False - ): - kwargs = {"containers": containers} - # TODO do not touch view's inner attribute - if self._view._hierarchy_view: - kwargs["selected"] = self._view._selected - self._model.refresh(**kwargs) + self._view.refresh() def _on_show_timer(self): if self._show_counter < 3: @@ -171,17 +124,13 @@ class SceneInventoryWindow(QtWidgets.QDialog): self.refresh() def _on_hierarchy_view_change(self, enabled): - self._proxy.set_hierarchy_view(enabled) - self._model.set_hierarchy_view(enabled) + self._view.set_hierarchy_view(enabled) def _on_text_filter_change(self, text_filter): - if hasattr(self._proxy, "setFilterRegExp"): - self._proxy.setFilterRegExp(text_filter) - else: - self._proxy.setFilterRegularExpression(text_filter) + self._view.set_text_filter(text_filter) def _on_outdated_state_change(self): - self._proxy.set_filter_outdated( + self._view.set_filter_outdated( self._outdated_only_checkbox.isChecked() ) diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index d56b370d75..323b5c07e1 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -1,6 +1,7 @@ import os import sys import contextlib +import collections from functools import partial from qtpy import QtWidgets, QtCore, QtGui @@ -196,16 +197,16 @@ def get_openpype_qt_app(): return get_ayon_qt_app() -def iter_model_rows(model, column, include_root=False): +def iter_model_rows(model, column=0, include_root=False): """Iterate over all row indices in a model""" - indices = [QtCore.QModelIndex()] # start iteration at root - - for index in indices: + indexes_queue = collections.deque() + # start iteration at root + indexes_queue.append(QtCore.QModelIndex()) + while indexes_queue: + index = indexes_queue.popleft() # Add children to the iterations - child_rows = model.rowCount(index) - for child_row in range(child_rows): - child_index = model.index(child_row, column, index) - indices.append(child_index) + for child_row in range(model.rowCount(index)): + indexes_queue.append(model.index(child_row, column, index)) if not include_root and not index.isValid(): continue From 72d53bd0bdd5d60698d03531e6ac7e13e21978c9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:17:26 +0200 Subject: [PATCH 347/469] added unified StatusDelegate --- client/ayon_core/tools/utils/delegates.py | 79 ++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/utils/delegates.py b/client/ayon_core/tools/utils/delegates.py index 1147074b77..b296f952e0 100644 --- a/client/ayon_core/tools/utils/delegates.py +++ b/client/ayon_core/tools/utils/delegates.py @@ -2,7 +2,7 @@ import time from datetime import datetime import logging -from qtpy import QtWidgets +from qtpy import QtWidgets, QtGui log = logging.getLogger(__name__) @@ -106,3 +106,80 @@ class PrettyTimeDelegate(QtWidgets.QStyledItemDelegate): def displayText(self, value, locale): if value is not None: return pretty_timestamp(value) + + +class StatusDelegate(QtWidgets.QStyledItemDelegate): + """Delegate showing status name and short name.""" + def __init__( + self, + status_name_role, + status_short_name_role, + status_color_role, + status_icon_role, + *args, **kwargs + ): + super().__init__(*args, **kwargs) + self.status_name_role = status_name_role + self.status_short_name_role = status_short_name_role + self.status_color_role = status_color_role + self.status_icon_role = status_icon_role + + def paint(self, painter, option, index): + if option.widget: + style = option.widget.style() + else: + style = QtWidgets.QApplication.style() + + style.drawControl( + QtWidgets.QCommonStyle.CE_ItemViewItem, + option, + painter, + option.widget + ) + + painter.save() + + text_rect = style.subElementRect( + QtWidgets.QCommonStyle.SE_ItemViewItemText, + option + ) + text_margin = style.proxy().pixelMetric( + QtWidgets.QCommonStyle.PM_FocusFrameHMargin, + option, + option.widget + ) + 1 + padded_text_rect = text_rect.adjusted( + text_margin, 0, - text_margin, 0 + ) + + fm = QtGui.QFontMetrics(option.font) + text = self._get_status_name(index) + if padded_text_rect.width() < fm.width(text): + text = self._get_status_short_name(index) + + fg_color = self._get_status_color(index) + pen = painter.pen() + pen.setColor(fg_color) + painter.setPen(pen) + + painter.drawText( + padded_text_rect, + option.displayAlignment, + text + ) + + painter.restore() + + def _get_status_name(self, index): + return index.data(self.status_name_role) + + def _get_status_short_name(self, index): + return index.data(self.status_short_name_role) + + def _get_status_color(self, index): + return QtGui.QColor(index.data(self.status_color_role)) + + def _get_status_icon(self, index): + if self.status_icon_role is not None: + return index.data(self.status_icon_role) + return None From daadddf8a4fd4ed7ffaed0c8670ee95e883ba987 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:17:44 +0200 Subject: [PATCH 348/469] added statuses to scene inventory --- .../ayon_core/tools/sceneinventory/control.py | 11 +++- .../ayon_core/tools/sceneinventory/model.py | 50 +++++++++++++------ client/ayon_core/tools/sceneinventory/view.py | 18 ++++++- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/control.py b/client/ayon_core/tools/sceneinventory/control.py index c564b5a992..b890462506 100644 --- a/client/ayon_core/tools/sceneinventory/control.py +++ b/client/ayon_core/tools/sceneinventory/control.py @@ -1,12 +1,12 @@ import ayon_api from ayon_core.lib.events import QueuedEventSystem -from ayon_core.host import HostBase, ILoadHost +from ayon_core.host import HostBase from ayon_core.pipeline import ( registered_host, get_current_context, ) -from ayon_core.tools.common_models import HierarchyModel +from ayon_core.tools.common_models import HierarchyModel, ProjectsModel from .models import SiteSyncModel, ContainersModel @@ -32,6 +32,7 @@ class SceneInventoryController: self._sitesync_model = SiteSyncModel(self) # Switch dialog requirements self._hierarchy_model = HierarchyModel(self) + self._projects_model = ProjectsModel(self) self._event_system = self._create_event_system() def get_host(self) -> HostBase: @@ -85,6 +86,12 @@ class SceneInventoryController: self._current_folder_set = True return self._current_folder_id + def get_project_status_items(self): + project_name = self.get_current_project_name() + return self._projects_model.get_project_status_items( + project_name, None + ) + # Containers methods def get_containers(self): return self._containers_model.get_containers() diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 052bdf3e4e..8e549f6bde 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -23,20 +23,22 @@ VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 10 -PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 11 -PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 12 -PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 13 -PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 14 -PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 15 -LOADER_NAME_ROLE = QtCore.Qt.UserRole + 16 -OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 17 -ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 18 -REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 19 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 20 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 21 +STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 11 +STATUS_ICON_ROLE = QtCore.Qt.UserRole + 12 +PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 13 +PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 14 +PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 15 +PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 16 +PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 17 +LOADER_NAME_ROLE = QtCore.Qt.UserRole + 18 +OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 19 +ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 20 +REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 21 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 22 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 23 # This value hold unique value of container that should be used to identify # containers inbetween refresh. -ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 22 +ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 24 class InventoryModel(QtGui.QStandardItemModel): @@ -45,6 +47,7 @@ class InventoryModel(QtGui.QStandardItemModel): column_labels = [ "Name", "Version", + "Status", "Count", "Product type", "Group", @@ -55,6 +58,7 @@ class InventoryModel(QtGui.QStandardItemModel): ] name_col = column_labels.index("Name") version_col = column_labels.index("Version") + status_col = column_labels.index("Status") count_col = column_labels.index("Count") product_type_col = column_labels.index("Product type") product_group_col = column_labels.index("Group") @@ -65,8 +69,8 @@ class InventoryModel(QtGui.QStandardItemModel): display_role_by_column = { name_col: QtCore.Qt.DisplayRole, version_col: VERSION_LABEL_ROLE, + status_col: STATUS_NAME_ROLE, count_col: COUNT_ROLE, - # 3: STATUS_NAME_ROLE, product_type_col: PRODUCT_TYPE_ROLE, product_group_col: PRODUCT_GROUP_NAME_ROLE, loader_col: LOADER_NAME_ROLE, @@ -82,12 +86,14 @@ class InventoryModel(QtGui.QStandardItemModel): remote_site_col: REMOTE_SITE_ICON_ROLE, } foreground_role_by_column = { - version_col: VERSION_COLOR_ROLE, name_col: NAME_COLOR_ROLE, + version_col: VERSION_COLOR_ROLE, + status_col: STATUS_COLOR_ROLE } width_by_column = { name_col: 250, version_col: 55, + status_col: 100, count_col: 55, product_type_col: 150, product_group_col: 120, @@ -156,6 +162,10 @@ class InventoryModel(QtGui.QStandardItemModel): self._controller.get_site_provider_icons().items() ) } + status_items_by_name = { + status_item.name: status_item + for status_item in self._controller.get_project_status_items() + } group_item_icon = qtawesome.icon( "fa.folder", color=self._default_icon_color @@ -187,6 +197,9 @@ class InventoryModel(QtGui.QStandardItemModel): version_color = None version_value = None is_latest = False + status_name = None + status_color = None + status_short = None if not repre_info.is_valid: group_name = "< Entity N/A >" item_icon = invalid_item_icon @@ -210,6 +223,11 @@ class InventoryModel(QtGui.QStandardItemModel): is_latest = version_item.is_latest if not is_latest: version_color = self.OUTDATED_COLOR + status_name = version_item.status + status_item = status_items_by_name.get(status_name) + if status_item: + status_short = status_item.short + status_color = status_item.color container_model_items = [] for container_item in container_items: @@ -255,6 +273,10 @@ class InventoryModel(QtGui.QStandardItemModel): group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) group_item.setData(version_label, VERSION_LABEL_ROLE) group_item.setData(len(container_items), COUNT_ROLE) + group_item.setData(status_name, STATUS_NAME_ROLE) + group_item.setData(status_short, STATUS_SHORT_ROLE) + group_item.setData(status_color, STATUS_COLOR_ROLE) + group_item.setData( active_site_progress, ACTIVE_SITE_PROGRESS_ROLE ) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 9dcf3349e6..18615b8a89 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -18,6 +18,7 @@ from ayon_core.tools.utils.lib import ( preserve_expanded_rows, preserve_selection, ) +from ayon_core.tools.utils.delegates import StatusDelegate from .switch_dialog import SwitchAssetDialog from .model import ( @@ -27,6 +28,10 @@ from .model import ( OBJECT_NAME_ROLE, ITEM_ID_ROLE, IS_CONTAINER_ITEM_ROLE, + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, ) from .delegates import VersionDelegate @@ -56,7 +61,17 @@ class SceneInventoryView(QtWidgets.QTreeView): self.setModel(proxy_model) version_delegate = VersionDelegate() - self.setItemDelegateForColumn(model.version_col, version_delegate) + status_delegate = StatusDelegate( + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, + ) + for col, delegate in ( + (model.version_col, version_delegate), + (model.status_col, status_delegate), + ): + self.setItemDelegateForColumn(col, delegate) # set some nice default widths for the view for col, width in model.width_by_column.items(): @@ -71,6 +86,7 @@ class SceneInventoryView(QtWidgets.QTreeView): self._model = model self._proxy_model = proxy_model self._version_delegate = version_delegate + self._status_delegate = status_delegate self._hierarchy_view = False self._selected = None From 5fdc433c22a30f716062cc52315ecd5bf1316f50 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:18:11 +0200 Subject: [PATCH 349/469] loader uses generic status delegate --- .../tools/loader/ui/products_delegates.py | 54 ------------------- .../tools/loader/ui/products_model.py | 25 ++++----- .../tools/loader/ui/products_widget.py | 14 +++-- 3 files changed, 24 insertions(+), 69 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 1ac19b53eb..cedac6199b 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -6,9 +6,6 @@ from ayon_core.tools.utils.lib import format_version from .products_model import ( PRODUCT_ID_ROLE, VERSION_NAME_EDIT_ROLE, - VERSION_STATUS_NAME_ROLE, - VERSION_STATUS_SHORT_ROLE, - VERSION_STATUS_COLOR_ROLE, VERSION_ID_ROLE, PRODUCT_IN_SCENE_ROLE, ACTIVE_SITE_ICON_ROLE, @@ -205,57 +202,6 @@ class LoadedInSceneDelegate(QtWidgets.QStyledItemDelegate): option.palette.setBrush(QtGui.QPalette.Text, color) -class StatusDelegate(QtWidgets.QStyledItemDelegate): - """Delegate showing status name and short name.""" - - def paint(self, painter, option, index): - if option.widget: - style = option.widget.style() - else: - style = QtWidgets.QApplication.style() - - style.drawControl( - QtWidgets.QCommonStyle.CE_ItemViewItem, - option, - painter, - option.widget - ) - - painter.save() - - text_rect = style.subElementRect( - QtWidgets.QCommonStyle.SE_ItemViewItemText, - option - ) - text_margin = style.proxy().pixelMetric( - QtWidgets.QCommonStyle.PM_FocusFrameHMargin, - option, - option.widget - ) + 1 - padded_text_rect = text_rect.adjusted( - text_margin, 0, - text_margin, 0 - ) - - fm = QtGui.QFontMetrics(option.font) - text = index.data(VERSION_STATUS_NAME_ROLE) - if padded_text_rect.width() < fm.width(text): - text = index.data(VERSION_STATUS_SHORT_ROLE) - - status_color = index.data(VERSION_STATUS_COLOR_ROLE) - fg_color = QtGui.QColor(status_color) - pen = painter.pen() - pen.setColor(fg_color) - painter.setPen(pen) - - painter.drawText( - padded_text_rect, - option.displayAlignment, - text - ) - - painter.restore() - - class SiteSyncDelegate(QtWidgets.QStyledItemDelegate): """Paints icons and downloaded representation ration for both sites.""" diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index f309473d10..8035b1f0fe 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -25,18 +25,19 @@ VERSION_PUBLISH_TIME_ROLE = QtCore.Qt.UserRole + 14 VERSION_STATUS_NAME_ROLE = QtCore.Qt.UserRole + 15 VERSION_STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 16 VERSION_STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 17 -VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 18 -VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 19 -VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 20 -VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 21 -VERSION_STEP_ROLE = QtCore.Qt.UserRole + 22 -VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 23 -VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 24 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 25 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 -REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 27 -SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 28 -SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 +VERSION_STATUS_ICON_ROLE = QtCore.Qt.UserRole + 18 +VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 19 +VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 20 +VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 21 +VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 22 +VERSION_STEP_ROLE = QtCore.Qt.UserRole + 23 +VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 24 +VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 25 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 27 +REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 28 +SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 +SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 30 class ProductsModel(QtGui.QStandardItemModel): diff --git a/client/ayon_core/tools/loader/ui/products_widget.py b/client/ayon_core/tools/loader/ui/products_widget.py index 3a30d83d52..61ddd690e9 100644 --- a/client/ayon_core/tools/loader/ui/products_widget.py +++ b/client/ayon_core/tools/loader/ui/products_widget.py @@ -6,7 +6,7 @@ from ayon_core.tools.utils import ( RecursiveSortFilterProxyModel, DeselectableTreeView, ) -from ayon_core.tools.utils.delegates import PrettyTimeDelegate +from ayon_core.tools.utils.delegates import PrettyTimeDelegate, StatusDelegate from .products_model import ( ProductsModel, @@ -17,12 +17,15 @@ from .products_model import ( FOLDER_ID_ROLE, PRODUCT_ID_ROLE, VERSION_ID_ROLE, + VERSION_STATUS_NAME_ROLE, + VERSION_STATUS_SHORT_ROLE, + VERSION_STATUS_COLOR_ROLE, + VERSION_STATUS_ICON_ROLE, VERSION_THUMBNAIL_ID_ROLE, ) from .products_delegates import ( VersionDelegate, LoadedInSceneDelegate, - StatusDelegate, SiteSyncDelegate, ) from .actions_utils import show_actions_menu @@ -131,7 +134,12 @@ class ProductsWidget(QtWidgets.QWidget): version_delegate = VersionDelegate() time_delegate = PrettyTimeDelegate() - status_delegate = StatusDelegate() + status_delegate = StatusDelegate( + VERSION_STATUS_NAME_ROLE, + VERSION_STATUS_SHORT_ROLE, + VERSION_STATUS_COLOR_ROLE, + VERSION_STATUS_ICON_ROLE, + ) in_scene_delegate = LoadedInSceneDelegate() sitesync_delegate = SiteSyncDelegate() From 829a3e93def9d4041e2c39d6ccc25be3e1f7e368 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 22:34:37 +0800 Subject: [PATCH 350/469] add setting category to ayon_max host --- .../deadline/plugins/publish/submit_max_deadline.py | 8 ++++---- server_addon/max/client/ayon_max/api/lib.py | 2 +- .../max/client/ayon_max/api/lib_renderproducts.py | 2 +- .../max/client/ayon_max/api/lib_rendersettings.py | 2 +- server_addon/max/client/ayon_max/api/menu.py | 2 +- server_addon/max/client/ayon_max/api/pipeline.py | 10 +++++----- .../max/client/ayon_max/api/preview_animation.py | 2 +- .../max/client/ayon_max/hooks/force_startup_script.py | 2 +- .../client/ayon_max/plugins/create/create_camera.py | 4 +++- .../client/ayon_max/plugins/create/create_maxScene.py | 4 +++- .../max/client/ayon_max/plugins/create/create_model.py | 4 +++- .../ayon_max/plugins/create/create_pointcache.py | 4 +++- .../ayon_max/plugins/create/create_pointcloud.py | 4 +++- .../ayon_max/plugins/create/create_redshift_proxy.py | 4 +++- .../client/ayon_max/plugins/create/create_render.py | 6 ++++-- .../client/ayon_max/plugins/create/create_review.py | 4 +++- .../client/ayon_max/plugins/create/create_tycache.py | 4 +++- .../client/ayon_max/plugins/create/create_workfile.py | 6 ++++-- .../client/ayon_max/plugins/load/load_camera_fbx.py | 6 +++--- .../max/client/ayon_max/plugins/load/load_max_scene.py | 6 +++--- .../max/client/ayon_max/plugins/load/load_model.py | 6 +++--- .../max/client/ayon_max/plugins/load/load_model_fbx.py | 8 ++++---- .../max/client/ayon_max/plugins/load/load_model_obj.py | 6 +++--- .../max/client/ayon_max/plugins/load/load_model_usd.py | 8 ++++---- .../client/ayon_max/plugins/load/load_pointcache.py | 6 +++--- .../ayon_max/plugins/load/load_pointcache_ornatrix.py | 6 +++--- .../client/ayon_max/plugins/load/load_pointcloud.py | 6 +++--- .../ayon_max/plugins/load/load_redshift_proxy.py | 6 +++--- .../max/client/ayon_max/plugins/load/load_tycache.py | 6 +++--- .../client/ayon_max/plugins/publish/collect_render.py | 8 ++++---- .../client/ayon_max/plugins/publish/collect_review.py | 2 +- .../client/ayon_max/plugins/publish/extract_alembic.py | 4 ++-- .../max/client/ayon_max/plugins/publish/extract_fbx.py | 4 ++-- .../ayon_max/plugins/publish/extract_max_scene_raw.py | 2 ++ .../ayon_max/plugins/publish/extract_model_obj.py | 6 ++++-- .../ayon_max/plugins/publish/extract_model_usd.py | 4 +++- .../ayon_max/plugins/publish/extract_pointcloud.py | 2 +- .../ayon_max/plugins/publish/extract_redshift_proxy.py | 2 +- .../plugins/publish/extract_review_animation.py | 2 +- .../ayon_max/plugins/publish/extract_thumbnail.py | 2 +- .../client/ayon_max/plugins/publish/extract_tycache.py | 2 +- .../plugins/publish/save_scenes_for_cameras.py | 4 ++-- .../ayon_max/plugins/publish/validate_attributes.py | 2 ++ .../plugins/publish/validate_camera_attributes.py | 4 +++- .../ayon_max/plugins/publish/validate_frame_range.py | 4 +++- .../plugins/publish/validate_instance_in_context.py | 4 +++- .../ayon_max/plugins/publish/validate_loaded_plugin.py | 4 +++- .../ayon_max/plugins/publish/validate_mesh_has_uv.py | 4 +++- .../ayon_max/plugins/publish/validate_model_name.py | 5 ++++- .../ayon_max/plugins/publish/validate_no_animation.py | 4 +++- .../plugins/publish/validate_renderable_camera.py | 2 +- .../publish/validate_renderer_redshift_proxy.py | 2 +- .../ayon_max/plugins/publish/validate_renderpasses.py | 4 +++- .../plugins/publish/validate_resolution_setting.py | 2 +- server_addon/max/client/ayon_max/startup/startup.py | 2 +- server_addon/max/package.py | 8 +++++++- 56 files changed, 145 insertions(+), 94 deletions(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py index ababb01285..4cb510f1cb 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_max_deadline.py @@ -15,11 +15,11 @@ from ayon_core.pipeline.publish.lib import ( replace_with_published_scene_path ) from ayon_core.pipeline.publish import KnownPublishError -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api.lib import ( get_current_renderer, get_multipass_setting ) -from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings +from ayon_max.api.lib_rendersettings import RenderSettings from openpype_modules.deadline import abstract_submit_deadline from openpype_modules.deadline.abstract_submit_deadline import DeadlineJobInfo @@ -205,11 +205,11 @@ class MaxSubmitDeadline(abstract_submit_deadline.AbstractSubmitDeadline, def _use_published_name(self, data, project_settings): # Not all hosts can import these modules. - from ayon_core.hosts.max.api.lib import ( + from ayon_max.api.lib import ( get_current_renderer, get_multipass_setting ) - from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings + from ayon_max.api.lib_rendersettings import RenderSettings instance = self._instance job_info = copy.deepcopy(self.job_info) diff --git a/server_addon/max/client/ayon_max/api/lib.py b/server_addon/max/client/ayon_max/api/lib.py index f20f754248..eb22dbafd2 100644 --- a/server_addon/max/client/ayon_max/api/lib.py +++ b/server_addon/max/client/ayon_max/api/lib.py @@ -20,7 +20,7 @@ from pymxs import runtime as rt JSON_PREFIX = "JSON::" -log = logging.getLogger("ayon_core.hosts.max") +log = logging.getLogger("ayon_max") def get_main_window(): diff --git a/server_addon/max/client/ayon_max/api/lib_renderproducts.py b/server_addon/max/client/ayon_max/api/lib_renderproducts.py index 710ed0031a..82a6a0c20c 100644 --- a/server_addon/max/client/ayon_max/api/lib_renderproducts.py +++ b/server_addon/max/client/ayon_max/api/lib_renderproducts.py @@ -6,7 +6,7 @@ import os from pymxs import runtime as rt -from ayon_core.hosts.max.api.lib import get_current_renderer +from ayon_max.api.lib import get_current_renderer from ayon_core.pipeline import get_current_project_name from ayon_core.settings import get_project_settings diff --git a/server_addon/max/client/ayon_max/api/lib_rendersettings.py b/server_addon/max/client/ayon_max/api/lib_rendersettings.py index 35b6d064c1..4b65e1397e 100644 --- a/server_addon/max/client/ayon_max/api/lib_rendersettings.py +++ b/server_addon/max/client/ayon_max/api/lib_rendersettings.py @@ -5,7 +5,7 @@ from ayon_core.settings import get_project_settings from ayon_core.pipeline import get_current_project_name from ayon_core.pipeline.context_tools import get_current_folder_entity -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api.lib import ( set_render_frame_range, get_current_renderer, get_default_render_folder diff --git a/server_addon/max/client/ayon_max/api/menu.py b/server_addon/max/client/ayon_max/api/menu.py index c6ceeb3a43..25dd39fd84 100644 --- a/server_addon/max/client/ayon_max/api/menu.py +++ b/server_addon/max/client/ayon_max/api/menu.py @@ -5,7 +5,7 @@ from qtpy import QtWidgets, QtCore from pymxs import runtime as rt from ayon_core.tools.utils import host_tools -from ayon_core.hosts.max.api import lib +from ayon_max.api import lib class AYONMenu(object): diff --git a/server_addon/max/client/ayon_max/api/pipeline.py b/server_addon/max/client/ayon_max/api/pipeline.py index d9cfc3407f..5f5e896e86 100644 --- a/server_addon/max/client/ayon_max/api/pipeline.py +++ b/server_addon/max/client/ayon_max/api/pipeline.py @@ -14,14 +14,14 @@ from ayon_core.pipeline import ( AVALON_CONTAINER_ID, AYON_CONTAINER_ID, ) -from ayon_core.hosts.max.api.menu import AYONMenu -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.plugin import MS_CUSTOM_ATTRIB -from ayon_core.hosts.max import MAX_HOST_DIR +from ayon_max.api.menu import AYONMenu +from ayon_max.api import lib +from ayon_max.api.plugin import MS_CUSTOM_ATTRIB +from ayon_max import MAX_HOST_DIR from pymxs import runtime as rt # noqa -log = logging.getLogger("ayon_core.hosts.max") +log = logging.getLogger("ayon_max") PLUGINS_DIR = os.path.join(MAX_HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/server_addon/max/client/ayon_max/api/preview_animation.py b/server_addon/max/client/ayon_max/api/preview_animation.py index 399d3b6222..acda5360a1 100644 --- a/server_addon/max/client/ayon_max/api/preview_animation.py +++ b/server_addon/max/client/ayon_max/api/preview_animation.py @@ -3,7 +3,7 @@ import contextlib from pymxs import runtime as rt from .lib import get_max_version, render_resolution -log = logging.getLogger("ayon_core.hosts.max") +log = logging.getLogger("ayon_max") @contextlib.contextmanager diff --git a/server_addon/max/client/ayon_max/hooks/force_startup_script.py b/server_addon/max/client/ayon_max/hooks/force_startup_script.py index 417f0049ab..1699ea300a 100644 --- a/server_addon/max/client/ayon_max/hooks/force_startup_script.py +++ b/server_addon/max/client/ayon_max/hooks/force_startup_script.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Pre-launch to force 3ds max startup script.""" import os -from ayon_core.hosts.max import MAX_HOST_DIR +from ayon_max import MAX_HOST_DIR from ayon_applications import PreLaunchHook, LaunchTypes diff --git a/server_addon/max/client/ayon_max/plugins/create/create_camera.py b/server_addon/max/client/ayon_max/plugins/create/create_camera.py index 42f8cb716d..451e178afc 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_camera.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_camera.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating camera.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreateCamera(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreateCamera(plugin.MaxCreator): label = "Camera" product_type = "camera" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_maxScene.py b/server_addon/max/client/ayon_max/plugins/create/create_maxScene.py index 0e5768b267..ee58ef663d 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_maxScene.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_maxScene.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating raw max scene.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreateMaxScene(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreateMaxScene(plugin.MaxCreator): label = "Max Scene" product_type = "maxScene" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_model.py b/server_addon/max/client/ayon_max/plugins/create/create_model.py index 297c92067e..f48182ecd7 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_model.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_model.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for model.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreateModel(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreateModel(plugin.MaxCreator): label = "Model" product_type = "model" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_pointcache.py b/server_addon/max/client/ayon_max/plugins/create/create_pointcache.py index eb0686a0c0..6d7aabe12c 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_pointcache.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_pointcache.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating pointcache alembics.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreatePointCache(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreatePointCache(plugin.MaxCreator): label = "Point Cache" product_type = "pointcache" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py b/server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py index 9a58f4e624..52014d77b2 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_pointcloud.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating point cloud.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreatePointCloud(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreatePointCloud(plugin.MaxCreator): label = "Point Cloud" product_type = "pointcloud" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py index 17f5349dc1..bcc96c7efe 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_redshift_proxy.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating camera.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreateRedshiftProxy(plugin.MaxCreator): @@ -8,3 +8,5 @@ class CreateRedshiftProxy(plugin.MaxCreator): label = "Redshift Proxy" product_type = "redshiftproxy" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_render.py b/server_addon/max/client/ayon_max/plugins/create/create_render.py index 60fe628a5e..d1e236f3ef 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_render.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_render.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- """Creator plugin for creating camera.""" import os -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin from ayon_core.lib import BoolDef -from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings +from ayon_max.api.lib_rendersettings import RenderSettings class CreateRender(plugin.MaxCreator): @@ -13,6 +13,8 @@ class CreateRender(plugin.MaxCreator): product_type = "maxrender" icon = "gear" + settings_category = "max" + def create(self, product_name, instance_data, pre_create_data): from pymxs import runtime as rt file = rt.maxFileName diff --git a/server_addon/max/client/ayon_max/plugins/create/create_review.py b/server_addon/max/client/ayon_max/plugins/create/create_review.py index 0a0ffd2e46..a49490519a 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_review.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_review.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating review in Max.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin from ayon_core.lib import BoolDef, EnumDef, NumberDef @@ -12,6 +12,8 @@ class CreateReview(plugin.MaxCreator): product_type = "review" icon = "video-camera" + settings_category = "max" + review_width = 1920 review_height = 1080 percentSize = 100 diff --git a/server_addon/max/client/ayon_max/plugins/create/create_tycache.py b/server_addon/max/client/ayon_max/plugins/create/create_tycache.py index 2b3893bf13..cbdd94e272 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_tycache.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_tycache.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator plugin for creating TyCache.""" -from ayon_core.hosts.max.api import plugin +from ayon_max.api import plugin class CreateTyCache(plugin.MaxCreator): @@ -9,3 +9,5 @@ class CreateTyCache(plugin.MaxCreator): label = "TyCache" product_type = "tycache" icon = "gear" + + settings_category = "max" diff --git a/server_addon/max/client/ayon_max/plugins/create/create_workfile.py b/server_addon/max/client/ayon_max/plugins/create/create_workfile.py index 901da6254c..35c41f0fcc 100644 --- a/server_addon/max/client/ayon_max/plugins/create/create_workfile.py +++ b/server_addon/max/client/ayon_max/plugins/create/create_workfile.py @@ -3,8 +3,8 @@ import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.max.api import plugin -from ayon_core.hosts.max.api.lib import read, imprint +from ayon_max.api import plugin +from ayon_max.api.lib import read, imprint from pymxs import runtime as rt @@ -17,6 +17,8 @@ class CreateWorkfile(plugin.MaxCreatorBase, AutoCreator): default_variant = "Main" + settings_category = "max" + def create(self): variant = self.default_variant current_instance = next( diff --git a/server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py b/server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py index 6f1e9988c5..81ea15d52a 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_camera_fbx.py @@ -1,12 +1,12 @@ import os -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_namespace, object_transform_set ) -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, diff --git a/server_addon/max/client/ayon_max/plugins/load/load_max_scene.py b/server_addon/max/client/ayon_max/plugins/load/load_max_scene.py index 97b8c6cd52..7fca69b193 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_max_scene.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_max_scene.py @@ -1,14 +1,14 @@ import os from qtpy import QtWidgets, QtCore from ayon_core.lib.attribute_definitions import EnumDef -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_namespace, object_transform_set, is_headless ) -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, remove_container_data diff --git a/server_addon/max/client/ayon_max/plugins/load/load_model.py b/server_addon/max/client/ayon_max/plugins/load/load_model.py index 1070fce2bd..2a6bc45c18 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_model.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_model.py @@ -1,12 +1,12 @@ import os from ayon_core.pipeline import load, get_representation_path -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, remove_container_data ) -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( maintained_selection, unique_namespace ) diff --git a/server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py b/server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py index 6f5de20ae0..2775e1b453 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_model_fbx.py @@ -1,17 +1,17 @@ import os from ayon_core.pipeline import load, get_representation_path -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, remove_container_data ) -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_namespace, object_transform_set ) -from ayon_core.hosts.max.api.lib import maintained_selection +from ayon_max.api.lib import maintained_selection class FbxModelLoader(load.LoaderPlugin): diff --git a/server_addon/max/client/ayon_max/plugins/load/load_model_obj.py b/server_addon/max/client/ayon_max/plugins/load/load_model_obj.py index a9119259df..d38aadb5bc 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_model_obj.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_model_obj.py @@ -1,13 +1,13 @@ import os -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_namespace, maintained_selection, object_transform_set ) -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, diff --git a/server_addon/max/client/ayon_max/plugins/load/load_model_usd.py b/server_addon/max/client/ayon_max/plugins/load/load_model_usd.py index 2ed5d64a18..f4dd41d5db 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_model_usd.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_model_usd.py @@ -2,15 +2,15 @@ import os from pymxs import runtime as rt from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_namespace, object_transform_set, get_plugins ) -from ayon_core.hosts.max.api.lib import maintained_selection -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.lib import maintained_selection +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, diff --git a/server_addon/max/client/ayon_max/plugins/load/load_pointcache.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcache.py index 0743b3bb34..d7def3d0ba 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_pointcache.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_pointcache.py @@ -6,9 +6,9 @@ Because of limited api, alembics can be only loaded, but not easily updated. """ import os from ayon_core.pipeline import load, get_representation_path -from ayon_core.hosts.max.api import lib, maintained_selection -from ayon_core.hosts.max.api.lib import unique_namespace -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api import lib, maintained_selection +from ayon_max.api.lib import unique_namespace +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, remove_container_data diff --git a/server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py index 47690f84e9..bc997951c1 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_pointcache_ornatrix.py @@ -1,20 +1,20 @@ import os from ayon_core.pipeline import load, get_representation_path from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, remove_container_data ) -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api.lib import ( unique_namespace, get_namespace, object_transform_set, get_plugins ) -from ayon_core.hosts.max.api import lib +from ayon_max.api import lib from pymxs import runtime as rt diff --git a/server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py b/server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py index 0e79882fc5..0fb506d5bd 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_pointcloud.py @@ -1,11 +1,11 @@ import os -from ayon_core.hosts.max.api import lib, maintained_selection -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib, maintained_selection +from ayon_max.api.lib import ( unique_namespace, ) -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, diff --git a/server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py index 22d42390d9..3fd84b7538 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_redshift_proxy.py @@ -6,14 +6,14 @@ from ayon_core.pipeline import ( get_representation_path ) from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, update_custom_attribute_data, get_previous_loaded_object, remove_container_data ) -from ayon_core.hosts.max.api import lib -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib +from ayon_max.api.lib import ( unique_namespace, get_plugins ) diff --git a/server_addon/max/client/ayon_max/plugins/load/load_tycache.py b/server_addon/max/client/ayon_max/plugins/load/load_tycache.py index 7a5296d933..e087d5599a 100644 --- a/server_addon/max/client/ayon_max/plugins/load/load_tycache.py +++ b/server_addon/max/client/ayon_max/plugins/load/load_tycache.py @@ -1,10 +1,10 @@ import os -from ayon_core.hosts.max.api import lib, maintained_selection -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api import lib, maintained_selection +from ayon_max.api.lib import ( unique_namespace, ) -from ayon_core.hosts.max.api.pipeline import ( +from ayon_max.api.pipeline import ( containerise, get_previous_loaded_object, update_custom_attribute_data, diff --git a/server_addon/max/client/ayon_max/plugins/publish/collect_render.py b/server_addon/max/client/ayon_max/plugins/publish/collect_render.py index 4ad9dfb3a3..a5e8d65df2 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/collect_render.py +++ b/server_addon/max/client/ayon_max/plugins/publish/collect_render.py @@ -5,10 +5,10 @@ import pyblish.api from pymxs import runtime as rt from ayon_core.pipeline.publish import KnownPublishError -from ayon_core.hosts.max.api import colorspace -from ayon_core.hosts.max.api.lib import get_max_version, get_current_renderer -from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings -from ayon_core.hosts.max.api.lib_renderproducts import RenderProducts +from ayon_max.api import colorspace +from ayon_max.api.lib import get_max_version, get_current_renderer +from ayon_max.api.lib_rendersettings import RenderSettings +from ayon_max.api.lib_renderproducts import RenderProducts class CollectRender(pyblish.api.InstancePlugin): diff --git a/server_addon/max/client/ayon_max/plugins/publish/collect_review.py b/server_addon/max/client/ayon_max/plugins/publish/collect_review.py index d746e2b2db..321aa7439c 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/collect_review.py +++ b/server_addon/max/client/ayon_max/plugins/publish/collect_review.py @@ -4,7 +4,7 @@ import pyblish.api from pymxs import runtime as rt from ayon_core.lib import BoolDef -from ayon_core.hosts.max.api.lib import get_max_version +from ayon_max.api.lib import get_max_version from ayon_core.pipeline.publish import ( AYONPyblishPluginMixin, KnownPublishError diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py b/server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py index 67cec23ecc..b0999e5a78 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_alembic.py @@ -41,8 +41,8 @@ import os import pyblish.api from ayon_core.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection -from ayon_core.hosts.max.api.lib import suspended_refresh +from ayon_max.api import maintained_selection +from ayon_max.api.lib import suspended_refresh from ayon_core.lib import BoolDef diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py b/server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py index 3d80588c47..bdfc1d0d78 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_fbx.py @@ -2,8 +2,8 @@ import os import pyblish.api from ayon_core.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection -from ayon_core.hosts.max.api.lib import convert_unit_scale +from ayon_max.api import maintained_selection +from ayon_max.api.lib import convert_unit_scale class ExtractModelFbx(publish.Extractor, OptionalPyblishPluginMixin): diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py b/server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py index f5c703564c..ecde6d2ce9 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_max_scene_raw.py @@ -15,6 +15,8 @@ class ExtractMaxSceneRaw(publish.Extractor, OptionalPyblishPluginMixin): families = ["camera", "maxScene", "model"] optional = True + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py b/server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py index 03bdde7d5d..6556bd7809 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_model_obj.py @@ -2,8 +2,8 @@ import os import pyblish.api from ayon_core.pipeline import publish, OptionalPyblishPluginMixin from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection -from ayon_core.hosts.max.api.lib import suspended_refresh +from ayon_max.api import maintained_selection +from ayon_max.api.lib import suspended_refresh from ayon_core.pipeline.publish import KnownPublishError @@ -18,6 +18,8 @@ class ExtractModelObj(publish.Extractor, OptionalPyblishPluginMixin): families = ["model"] optional = True + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py b/server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py index 64791e4c7d..a48126c6e5 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_model_usd.py @@ -3,7 +3,7 @@ import os import pyblish.api from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection +from ayon_max.api import maintained_selection from ayon_core.pipeline import OptionalPyblishPluginMixin, publish @@ -17,6 +17,8 @@ class ExtractModelUSD(publish.Extractor, families = ["model"] optional = True + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py b/server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py index 67dde7f0a6..f763325eb9 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_pointcloud.py @@ -3,7 +3,7 @@ import os import pyblish.api from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection +from ayon_max.api import maintained_selection from ayon_core.pipeline import publish diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py index 6a647670bc..dfb3527be1 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_redshift_proxy.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection +from ayon_max.api import maintained_selection class ExtractRedshiftProxy(publish.Extractor): diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py b/server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py index 12f1fbb63b..b6397d404e 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_review_animation.py @@ -1,7 +1,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.max.api.preview_animation import ( +from ayon_max.api.preview_animation import ( render_preview_animation ) diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py b/server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py index 5764ce98c4..183e381be2 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_thumbnail.py @@ -1,7 +1,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.max.api.preview_animation import render_preview_animation +from ayon_max.api.preview_animation import render_preview_animation class ExtractThumbnail(publish.Extractor): diff --git a/server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py b/server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py index 50bb06a765..576abe32a2 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py +++ b/server_addon/max/client/ayon_max/plugins/publish/extract_tycache.py @@ -3,7 +3,7 @@ import os import pyblish.api from pymxs import runtime as rt -from ayon_core.hosts.max.api import maintained_selection +from ayon_max.api import maintained_selection from ayon_core.pipeline import publish diff --git a/server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py b/server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py index 817db1b28f..a211210550 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py +++ b/server_addon/max/client/ayon_max/plugins/publish/save_scenes_for_cameras.py @@ -5,8 +5,8 @@ import tempfile from pymxs import runtime as rt from ayon_core.lib import run_subprocess -from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings -from ayon_core.hosts.max.api.lib_renderproducts import RenderProducts +from ayon_max.api.lib_rendersettings import RenderSettings +from ayon_max.api.lib_renderproducts import RenderProducts class SaveScenesForCamera(pyblish.api.InstancePlugin): diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py b/server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py index 354539871f..a489533b2c 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_attributes.py @@ -61,6 +61,8 @@ class ValidateAttributes(OptionalPyblishPluginMixin, actions = [RepairContextAction] optional = True + settings_category = "max" + @classmethod def get_invalid(cls, context): attributes = json.loads( diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py b/server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py index 9398cba2b7..63a2ef39a7 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_camera_attributes.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_core.hosts.max.api.action import SelectInvalidAction +from ayon_max.api.action import SelectInvalidAction class ValidateCameraAttributes(OptionalPyblishPluginMixin, @@ -23,6 +23,8 @@ class ValidateCameraAttributes(OptionalPyblishPluginMixin, actions = [SelectInvalidAction, RepairAction] optional = True + settings_category = "max" + DEFAULTS = ["fov", "nearrange", "farrange", "nearclip", "farclip"] CAM_TYPE = ["Freecamera", "Targetcamera", diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py b/server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py index 11b55232d5..9a9f22dd3e 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_frame_range.py @@ -10,7 +10,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, KnownPublishError ) -from ayon_core.hosts.max.api.lib import get_frame_range, set_timeline +from ayon_max.api.lib import get_frame_range, set_timeline class ValidateFrameRange(pyblish.api.InstancePlugin, @@ -36,6 +36,8 @@ class ValidateFrameRange(pyblish.api.InstancePlugin, optional = True actions = [RepairAction] + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): self.log.debug("Skipping Validate Frame Range...") diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py b/server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py index 5107665235..d5bdfe4eb0 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_instance_in_context.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.max.api.action import SelectInvalidAction +from ayon_max.api.action import SelectInvalidAction from pymxs import runtime as rt @@ -27,6 +27,8 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin, hosts = ["max"] actions = [SelectInvalidAction, RepairAction] + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py b/server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py index e278041b6b..1fddc7998d 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_loaded_plugin.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_core.hosts.max.api.lib import get_plugins +from ayon_max.api.lib import get_plugins class ValidateLoadedPlugin(OptionalPyblishPluginMixin, @@ -25,6 +25,8 @@ class ValidateLoadedPlugin(OptionalPyblishPluginMixin, optional = True actions = [RepairAction] + settings_category = "max" + family_plugins_mapping = [] @classmethod diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py b/server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py index ccd91da2be..31143a60c0 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_mesh_has_uv.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.max.api.action import SelectInvalidAction +from ayon_max.api.action import SelectInvalidAction from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -30,6 +30,8 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin, actions = [SelectInvalidAction] optional = True + settings_category = "max" + @classmethod def get_invalid(cls, instance): meshes = [member for member in instance.data["members"] diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py b/server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py index eb86e2e5bd..d691b739b7 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_model_name.py @@ -4,7 +4,7 @@ import re import pyblish.api -from ayon_core.hosts.max.api.action import SelectInvalidAction +from ayon_max.api.action import SelectInvalidAction from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, @@ -39,6 +39,9 @@ class ValidateModelName(pyblish.api.InstancePlugin, families = ["model"] label = "Validate Model Name" actions = [SelectInvalidAction] + + settings_category = "max" + # defined by settings regex = r"(.*)_(?P.*)_(GEO)" # cache diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py b/server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py index 4b2a18d606..26384954ca 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_no_animation.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.max.api.action import SelectInvalidAction +from ayon_max.api.action import SelectInvalidAction def get_invalid_keys(obj): @@ -39,6 +39,8 @@ class ValidateNoAnimation(pyblish.api.InstancePlugin, label = "Validate No Animation" actions = [SelectInvalidAction] + settings_category = "max" + def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py index ffd6b183fe..dc05771e1b 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_renderable_camera.py @@ -4,7 +4,7 @@ from ayon_core.pipeline import ( PublishValidationError, OptionalPyblishPluginMixin) from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.max.api.lib import get_current_renderer +from ayon_max.api.lib import get_current_renderer from pymxs import runtime as rt diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py index de3a806c85..66c69bc100 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_renderer_redshift_proxy.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.pipeline import PublishValidationError from pymxs import runtime as rt from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.max.api.lib import get_current_renderer +from ayon_max.api.lib import get_current_renderer class ValidateRendererRedshiftProxy(pyblish.api.InstancePlugin): diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py b/server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py index 394d3119c4..d0d47c6340 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_renderpasses.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.max.api.lib_rendersettings import RenderSettings +from ayon_max.api.lib_rendersettings import RenderSettings class ValidateRenderPasses(OptionalPyblishPluginMixin, @@ -21,6 +21,8 @@ class ValidateRenderPasses(OptionalPyblishPluginMixin, label = "Validate Render Passes" actions = [RepairAction] + settings_category = "max" + def process(self, instance): invalid = self.get_invalid(instance) if invalid: diff --git a/server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py b/server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py index 5f6cd0a21d..9f7ec17dd9 100644 --- a/server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py +++ b/server_addon/max/client/ayon_max/plugins/publish/validate_resolution_setting.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( RepairAction, PublishValidationError ) -from ayon_core.hosts.max.api.lib import ( +from ayon_max.api.lib import ( reset_scene_resolution, imprint ) diff --git a/server_addon/max/client/ayon_max/startup/startup.py b/server_addon/max/client/ayon_max/startup/startup.py index 49a861bad0..298c36f226 100644 --- a/server_addon/max/client/ayon_max/startup/startup.py +++ b/server_addon/max/client/ayon_max/startup/startup.py @@ -8,7 +8,7 @@ for path in os.environ["PYTHONPATH"].split(os.pathsep): if path and path not in sys.path: sys.path.append(path) -from ayon_core.hosts.max.api import MaxHost +from ayon_max.api import MaxHost from ayon_core.pipeline import install_host host = MaxHost() diff --git a/server_addon/max/package.py b/server_addon/max/package.py index fb1f1b3050..ddd4e3b33e 100644 --- a/server_addon/max/package.py +++ b/server_addon/max/package.py @@ -1,3 +1,9 @@ name = "max" title = "Max" -version = "0.1.7" +version = "0.2.0" +client_dir = "ayon_max" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From dd61d75998d104082da211f7f727b88cc038331b Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 22:38:04 +0800 Subject: [PATCH 351/469] cosmetic fix --- server_addon/max/client/ayon_max/startup/startup.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server_addon/max/client/ayon_max/startup/startup.py b/server_addon/max/client/ayon_max/startup/startup.py index 298c36f226..1462cc93b7 100644 --- a/server_addon/max/client/ayon_max/startup/startup.py +++ b/server_addon/max/client/ayon_max/startup/startup.py @@ -1,15 +1,13 @@ # -*- coding: utf-8 -*- import os import sys - +from ayon_max.api import MaxHost +from ayon_core.pipeline import install_host # this might happen in some 3dsmax version where PYTHONPATH isn't added # to sys.path automatically for path in os.environ["PYTHONPATH"].split(os.pathsep): if path and path not in sys.path: sys.path.append(path) -from ayon_max.api import MaxHost -from ayon_core.pipeline import install_host - host = MaxHost() install_host(host) From ff6efcccfc7b7796cefbfea79fab99368488a9a1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:12:06 +0200 Subject: [PATCH 352/469] added statuses to set version dialog --- .../sceneinventory/select_version_dialog.py | 218 ++++++++++++++++++ client/ayon_core/tools/sceneinventory/view.py | 62 ++--- 2 files changed, 254 insertions(+), 26 deletions(-) create mode 100644 client/ayon_core/tools/sceneinventory/select_version_dialog.py diff --git a/client/ayon_core/tools/sceneinventory/select_version_dialog.py b/client/ayon_core/tools/sceneinventory/select_version_dialog.py new file mode 100644 index 0000000000..421989338c --- /dev/null +++ b/client/ayon_core/tools/sceneinventory/select_version_dialog.py @@ -0,0 +1,218 @@ +import uuid + +from qtpy import QtWidgets, QtCore, QtGui + +from ayon_core.tools.utils.delegates import StatusDelegate + +from .model import ( + ITEM_ID_ROLE, + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, +) + + +class VersionOption: + def __init__( + self, + version, + label, + status_name, + status_short, + status_color + ): + self.version = version + self.label = label + self.status_name = status_name + self.status_short = status_short + self.status_color = status_color + + +class SelectVersionModel(QtGui.QStandardItemModel): + def data(self, index, role=None): + if role is None: + role = QtCore.Qt.DisplayRole + + index = self.index(index.row(), 0, index.parent()) + return super().data(index, role) + + +class SelectVersionComboBox(QtWidgets.QComboBox): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + combo_model = SelectVersionModel(0, 2) + + self.setModel(combo_model) + + combo_view = QtWidgets.QTreeView(self) + combo_view.setHeaderHidden(True) + combo_view.setIndentation(0) + + self.setView(combo_view) + + header = combo_view.header() + header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) + header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + + status_delegate = StatusDelegate( + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, + ) + combo_view.setItemDelegateForColumn(1, status_delegate) + + self._combo_model = combo_model + self._combo_view = combo_view + self._status_delegate = status_delegate + self._items_by_id = {} + + def paintEvent(self, event): + painter = QtWidgets.QStylePainter(self) + option = QtWidgets.QStyleOptionComboBox() + self.initStyleOption(option) + painter.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, option) + idx = self.currentIndex() + status_name = self.itemData(idx, STATUS_NAME_ROLE) + if status_name is None: + painter.drawControl(QtWidgets.QStyle.CE_ComboBoxLabel, option) + return + + painter.save() + text_field_rect = self.style().subControlRect( + QtWidgets.QStyle.CC_ComboBox, + option, + QtWidgets.QStyle.SC_ComboBoxEditField + ) + adj_rect = text_field_rect.adjusted(1, 0, -1, 0) + painter.drawText( + adj_rect, + QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, + option.currentText + ) + metrics = QtGui.QFontMetrics(self.font()) + text_width = metrics.width(option.currentText) + x_offset = text_width + 2 + diff_width = adj_rect.width() - x_offset + if diff_width <= 0: + return + + status_rect = adj_rect.adjusted(x_offset + 2, 0, 0, 0) + if diff_width < metrics.width(status_name): + status_name = self.itemData(idx, STATUS_SHORT_ROLE) + + color = QtGui.QColor(self.itemData(idx, STATUS_COLOR_ROLE)) + + pen = painter.pen() + pen.setColor(color) + painter.setPen(pen) + painter.drawText( + status_rect, + QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, + status_name + ) + + def set_current_index(self, index): + model = self._combo_view.model() + if index > model.rowCount(): + return + + self.setCurrentIndex(index) + + def get_item_by_id(self, item_id): + return self._items_by_id[item_id] + + def set_versions(self, version_options): + self._items_by_id = {} + model = self._combo_model + root_item = model.invisibleRootItem() + root_item.removeRows(0, root_item.rowCount()) + + new_items = [] + for version_option in version_options: + item_id = uuid.uuid4().hex + item = QtGui.QStandardItem(version_option.label) + item.setColumnCount(root_item.columnCount()) + item.setData( + version_option.status_name, STATUS_NAME_ROLE + ) + item.setData( + version_option.status_short, STATUS_SHORT_ROLE + ) + item.setData( + version_option.status_color, STATUS_COLOR_ROLE + ) + item.setData(item_id, ITEM_ID_ROLE) + + new_items.append(item) + self._items_by_id[item_id] = version_option + + if new_items: + root_item.appendRows(new_items) + + +class SelectVersionDialog(QtWidgets.QDialog): + def __init__(self, parent=None): + super().__init__(parent=parent) + + self.setWindowTitle("Select version") + + label_widget = QtWidgets.QLabel("Set version number to", self) + versions_combobox = SelectVersionComboBox(self) + + btns_widget = QtWidgets.QWidget(self) + + confirm_btn = QtWidgets.QPushButton("OK", btns_widget) + cancel_btn = QtWidgets.QPushButton("Cancel", btns_widget) + + btns_layout = QtWidgets.QHBoxLayout(btns_widget) + btns_layout.setContentsMargins(0, 0, 0, 0) + btns_layout.addStretch(1) + btns_layout.addWidget(confirm_btn, 0) + btns_layout.addWidget(cancel_btn, 0) + + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.addWidget(label_widget, 0) + main_layout.addWidget(versions_combobox, 0) + main_layout.addWidget(btns_widget, 0) + + confirm_btn.clicked.connect(self._on_confirm) + cancel_btn.clicked.connect(self._on_cancel) + + self._selected_item = None + self._cancelled = False + self._versions_combobox = versions_combobox + + def get_selected_item(self): + if self._cancelled: + return None + return self._selected_item + + def set_versions(self, version_options): + self._versions_combobox.set_versions(version_options) + + def select_index(self, index): + self._versions_combobox.set_current_index(index) + + @classmethod + def ask_for_version(cls, version_options, index=None, parent=None): + dialog = cls(parent) + dialog.set_versions(version_options) + if index is not None: + dialog.select_index(index) + dialog.exec_() + return dialog.get_selected_item() + + def _on_confirm(self): + self._cancelled = False + index = self._versions_combobox.currentIndex() + print(index) + item_id = self._versions_combobox.itemData(index, ITEM_ID_ROLE) + print(item_id) + self._selected_item = self._versions_combobox.get_item_by_id(item_id) + self.accept() + + def _on_cancel(self): + self._cancelled = True + self.reject() diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 18615b8a89..15f00fc707 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -34,6 +34,7 @@ from .model import ( STATUS_ICON_ROLE, ) from .delegates import VersionDelegate +from .select_version_dialog import SelectVersionDialog, VersionOption DEFAULT_COLOR = "#fb9c15" @@ -708,42 +709,51 @@ class SceneInventoryView(QtWidgets.QTreeView): version_items = list(version_items_by_id.values()) version_items.sort(key=version_sorter, reverse=True) + status_items_by_name = { + status_item.name: status_item + for status_item in self._controller.get_project_status_items() + } - versions_by_label = {} - labels = [] - active_version_label = None - for version_item in version_items: + version_options = [] + active_version_idx = 0 + for idx, version_item in enumerate(version_items): version = version_item.version label = format_version(version) if version_item.version_id == active_version_id: - active_version_label = label + active_version_idx = idx - labels.append(label) - versions_by_label[label] = version + status_name = version_item.status + status_short = None + status_color = None + status_item = status_items_by_name.get(status_name) + if status_item: + status_short = status_item.short + status_color = status_item.color + version_options.append( + VersionOption( + version, + label, + status_name, + status_short, + status_color, + ) + ) - index = 0 - if active_version_label in labels: - index = labels.index(active_version_label) - - label, state = QtWidgets.QInputDialog.getItem( - self, - "Set version..", - "Set version number to", - labels, - current=index, - editable=False + version_option = SelectVersionDialog.ask_for_version( + version_options, + active_version_idx, + parent=self ) - if not state: + if version_option is None: return - if label: - version = versions_by_label[label] - if version < 0: - version = HeroVersionType(version) + version = version_option.version + if version < 0: + version = HeroVersionType(version) - self._update_containers_to_version( - filtered_container_item_ids, version - ) + self._update_containers_to_version( + filtered_container_item_ids, version + ) def _show_switch_dialog(self, item_ids): """Display Switch dialog""" From e2de3795a2545048f39c1ccae2f975826e7c8a2a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:46:41 +0200 Subject: [PATCH 353/469] fix switch to versioned --- client/ayon_core/tools/sceneinventory/view.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 15f00fc707..1daeae74ab 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -841,10 +841,17 @@ class SceneInventoryView(QtWidgets.QTreeView): containers_items_by_id = self._controller.get_container_items_by_id( item_ids ) - product_ids = { - container_item.product_id + repre_ids = { + container_item.representation_id for container_item in containers_items_by_id.values() - if container_item.is_valid + } + repre_info_by_id = self._controller.get_representation_info_items( + repre_ids + ) + product_ids = { + repre_info.product_id + for repre_info in repre_info_by_id.values() + if repre_info.is_valid } version_items_by_product_id = self._controller.get_version_items( product_ids @@ -853,9 +860,11 @@ class SceneInventoryView(QtWidgets.QTreeView): update_containers = [] update_versions = [] for item_id, container_item in containers_items_by_id.items(): - product_id = container_item.product_id + repre_id = container_item.representation_id + repre_info = repre_info_by_id[repre_id] + product_id = repre_info.product_id version_items_id = version_items_by_product_id[product_id] - version_item = version_items_id.get(container_item.version_id, {}) + version_item = version_items_id.get(repre_info.version_id, {}) if not version_item or not version_item.is_hero: continue version = abs(version_item.version) From 04339d9bc0e75b809310067ae707acfa8d1d1dc1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:48:40 +0200 Subject: [PATCH 354/469] remove unused import --- client/ayon_core/tools/sceneinventory/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 1daeae74ab..b4ff62a405 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -2,7 +2,7 @@ import collections import logging from functools import partial -from qtpy import QtWidgets, QtCore, QtGui +from qtpy import QtWidgets, QtCore import qtawesome from ayon_core import style From bcdecef227bdf5dba791f1801c73dbc0696d9f97 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 19:13:20 +0200 Subject: [PATCH 355/469] use updatedBy for author value --- client/ayon_core/tools/workfiles/abstract.py | 4 ++++ client/ayon_core/tools/workfiles/models/workfiles.py | 5 ++++- .../tools/workfiles/widgets/files_widget_workarea.py | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/workfiles/abstract.py b/client/ayon_core/tools/workfiles/abstract.py index b45c643d97..1a5ed77019 100644 --- a/client/ayon_core/tools/workfiles/abstract.py +++ b/client/ayon_core/tools/workfiles/abstract.py @@ -16,6 +16,7 @@ class WorkfileInfo: creation_time (float): Creation time (timestamp). modification_time (float): Modification time (timestamp). created_by (Union[str, none]): User who created the file. + updated_by (Union[str, none]): User who last updated the file. note (str): Note. """ @@ -28,6 +29,7 @@ class WorkfileInfo: creation_time, modification_time, created_by, + updated_by, note, ): self.folder_id = folder_id @@ -37,6 +39,7 @@ class WorkfileInfo: self.creation_time = creation_time self.modification_time = modification_time self.created_by = created_by + self.updated_by = updated_by self.note = note def to_data(self): @@ -54,6 +57,7 @@ class WorkfileInfo: "creation_time": self.creation_time, "modification_time": self.modification_time, "created_by": self.created_by, + "updated_by": self.updated_by, "note": self.note, } diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index bf30b5dfc2..6ef943910d 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -470,9 +470,11 @@ class WorkfileEntitiesModel: ): note = "" created_by = None + updated_by = None if workfile_info: note = workfile_info["attrib"].get("description") or "" created_by = workfile_info.get("createdBy") + updated_by = workfile_info.get("updatedBy") filestat = os.stat(filepath) return WorkfileInfo( @@ -483,6 +485,7 @@ class WorkfileEntitiesModel: creation_time=filestat.st_ctime, modification_time=filestat.st_mtime, created_by=created_by, + updated_by=updated_by, note=note ) @@ -494,7 +497,7 @@ class WorkfileEntitiesModel: for workfile_info in ayon_api.get_workfiles_info( self._controller.get_current_project_name(), task_ids=[task_id], - fields=["id", "path", "attrib", "createdBy"], + fields=["id", "path", "attrib", "createdBy", "updatedBy"], ): workfile_identifier = self._get_workfile_info_identifier( folder_id, task_id, workfile_info["path"] diff --git a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py index 7b316adf81..7798755f0e 100644 --- a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py +++ b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py @@ -213,7 +213,7 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): item.setData(file_item.filename, FILENAME_ROLE) item.setData(file_item.filepath, FILEPATH_ROLE) - item.setData(file_item.created_by, AUTHOR_ROLE) + item.setData(file_item.updated_by, AUTHOR_ROLE) item.setData(file_item.modified, DATE_MODIFIED_ROLE) self._items_by_filename[file_item.filename] = item From e09a3635461ca6d07999d03f7c477744a78f3f49 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 19:21:38 +0200 Subject: [PATCH 356/469] fix updated by access --- client/ayon_core/tools/workfiles/abstract.py | 2 ++ client/ayon_core/tools/workfiles/models/workfiles.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/workfiles/abstract.py b/client/ayon_core/tools/workfiles/abstract.py index 1a5ed77019..9ebfd9feed 100644 --- a/client/ayon_core/tools/workfiles/abstract.py +++ b/client/ayon_core/tools/workfiles/abstract.py @@ -233,6 +233,7 @@ class FileItem: filename, modified, created_by=None, + updated_by=None, representation_id=None, filepath=None, exists=None @@ -241,6 +242,7 @@ class FileItem: self.dirpath = dirpath self.modified = modified self.created_by = created_by + self.updated_by = updated_by self.representation_id = representation_id self._filepath = filepath self._exists = exists diff --git a/client/ayon_core/tools/workfiles/models/workfiles.py b/client/ayon_core/tools/workfiles/models/workfiles.py index 6ef943910d..c93bbb6637 100644 --- a/client/ayon_core/tools/workfiles/models/workfiles.py +++ b/client/ayon_core/tools/workfiles/models/workfiles.py @@ -199,7 +199,8 @@ class WorkareaModel: workdir, filename, modified, - workfile_info.created_by + workfile_info.created_by, + workfile_info.updated_by, )) return items @@ -675,6 +676,7 @@ class PublishWorkfilesModel: filename, created_at.float_timestamp, author, + None, repre_entity["id"] ) From c90db8b432a6b2da2e37de7bbd2185be5cb28584 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 19:22:19 +0200 Subject: [PATCH 357/469] added user info to side panel --- .../tools/workfiles/widgets/side_panel.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/workfiles/widgets/side_panel.py b/client/ayon_core/tools/workfiles/widgets/side_panel.py index 5085f4701e..6bb3d98b40 100644 --- a/client/ayon_core/tools/workfiles/widgets/side_panel.py +++ b/client/ayon_core/tools/workfiles/widgets/side_panel.py @@ -147,13 +147,25 @@ class SidePanelWidget(QtWidgets.QWidget): workfile_info.creation_time) modification_time = datetime.datetime.fromtimestamp( workfile_info.modification_time) + created_lines = [ + creation_time.strftime(datetime_format) + ] + if workfile_info.created_by: + created_lines.insert(0, workfile_info.created_by) + + modified_lines = [ + modification_time.strftime(datetime_format) + ] + if workfile_info.updated_by: + modified_lines.insert(0, workfile_info.updated_by) + lines = ( "Size:", size_value, "Created:", - creation_time.strftime(datetime_format), + "
".join(created_lines), "Modified:", - modification_time.strftime(datetime_format) + "
".join(modified_lines), ) self._orig_note = note self._note_input.setPlainText(note) From 7edfd5f2f183359790e1e38fba1521ebcb17ebf0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 19:37:40 +0200 Subject: [PATCH 358/469] implemented users model --- .../ayon_core/tools/common_models/__init__.py | 3 + client/ayon_core/tools/common_models/users.py | 84 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 client/ayon_core/tools/common_models/users.py diff --git a/client/ayon_core/tools/common_models/__init__.py b/client/ayon_core/tools/common_models/__init__.py index 8895515b1a..f09edfeab2 100644 --- a/client/ayon_core/tools/common_models/__init__.py +++ b/client/ayon_core/tools/common_models/__init__.py @@ -14,6 +14,7 @@ from .hierarchy import ( ) from .thumbnails import ThumbnailsModel from .selection import HierarchyExpectedSelection +from .users import UsersModel __all__ = ( @@ -32,4 +33,6 @@ __all__ = ( "ThumbnailsModel", "HierarchyExpectedSelection", + + "UsersModel", ) diff --git a/client/ayon_core/tools/common_models/users.py b/client/ayon_core/tools/common_models/users.py new file mode 100644 index 0000000000..f8beb31aa1 --- /dev/null +++ b/client/ayon_core/tools/common_models/users.py @@ -0,0 +1,84 @@ +import ayon_api + +from ayon_core.lib import CacheItem + + +class UserItem: + def __init__( + self, + username, + full_name, + email, + avatar_url, + active, + ): + self.username = username + self.full_name = full_name + self.email = email + self.avatar_url = avatar_url + self.active = active + + @classmethod + def from_entity_data(cls, user_data): + return cls( + user_data["name"], + user_data["attrib"]["fullName"], + user_data["attrib"]["email"], + user_data["attrib"]["avatarUrl"], + user_data["active"], + ) + + +class UsersModel: + def __init__(self, controller): + self._controller = controller + self._users_cache = CacheItem(default_factory=list) + + def get_user_items(self): + """Get user items. + + Returns: + List[UserItem]: List of user items. + + """ + self._invalidate_cache() + return self._users_cache.get_data() + + def get_user_items_by_name(self): + """Get user items by name. + + Implemented as most of cases using this model will need to find + user information by username. + + Returns: + Dict[str, UserItem]: Dictionary of user items by name. + + """ + return { + user_item.username: user_item + for user_item in self.get_user_items() + } + + def get_user_item_by_username(self, username): + """Get user item by username. + + Args: + username (str): Username. + + Returns: + Union[UserItem, None]: User item or None if not found. + + """ + self._invalidate_cache() + for user_item in self.get_user_items(): + if user_item.username == username: + return user_item + return None + + def _invalidate_cache(self): + if self._users_cache.is_valid: + return + self._users_cache.update_data([ + UserItem.from_entity_data(user) + for user in ayon_api.get_users() + ]) From 88b73e0a00a7aa32a6647a4eb26522daf1a0c278 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 19:37:57 +0200 Subject: [PATCH 359/469] use user full name if available --- client/ayon_core/tools/workfiles/abstract.py | 10 ++++++++++ client/ayon_core/tools/workfiles/control.py | 14 +++++++++++--- .../workfiles/widgets/files_widget_published.py | 10 +++++++++- .../workfiles/widgets/files_widget_workarea.py | 8 +++++++- .../tools/workfiles/widgets/side_panel.py | 17 +++++++++++++++-- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/tools/workfiles/abstract.py b/client/ayon_core/tools/workfiles/abstract.py index 9ebfd9feed..f345e20dca 100644 --- a/client/ayon_core/tools/workfiles/abstract.py +++ b/client/ayon_core/tools/workfiles/abstract.py @@ -536,6 +536,16 @@ class AbstractWorkfilesFrontend(AbstractWorkfilesCommon): pass + @abstractmethod + def get_user_items_by_name(self): + """Get user items available on AYON server. + + Returns: + Dict[str, UserItem]: User items by username. + + """ + pass + # Host information @abstractmethod def get_workfile_extensions(self): diff --git a/client/ayon_core/tools/workfiles/control.py b/client/ayon_core/tools/workfiles/control.py index 3048e6be94..8fa9135bc0 100644 --- a/client/ayon_core/tools/workfiles/control.py +++ b/client/ayon_core/tools/workfiles/control.py @@ -19,6 +19,7 @@ from ayon_core.tools.common_models import ( HierarchyModel, HierarchyExpectedSelection, ProjectsModel, + UsersModel, ) from .abstract import ( @@ -161,6 +162,7 @@ class BaseWorkfileController( self._save_is_enabled = True # Expected selected folder and task + self._users_model = self._create_users_model() self._expected_selection = self._create_expected_selection_obj() self._selection_model = self._create_selection_model() self._projects_model = self._create_projects_model() @@ -176,6 +178,12 @@ class BaseWorkfileController( def is_host_valid(self): return self._host_is_valid + def _create_users_model(self): + return UsersModel(self) + + def _create_workfiles_model(self): + return WorkfilesModel(self) + def _create_expected_selection_obj(self): return WorkfilesToolExpectedSelection(self) @@ -188,9 +196,6 @@ class BaseWorkfileController( def _create_hierarchy_model(self): return HierarchyModel(self) - def _create_workfiles_model(self): - return WorkfilesModel(self) - @property def event_system(self): """Inner event system for workfiles tool controller. @@ -272,6 +277,9 @@ class BaseWorkfileController( {"enabled": enabled} ) + def get_user_items_by_name(self): + return self._users_model.get_user_items_by_name() + # Host information def get_workfile_extensions(self): host = self._host diff --git a/client/ayon_core/tools/workfiles/widgets/files_widget_published.py b/client/ayon_core/tools/workfiles/widgets/files_widget_published.py index 5f2669bb48..2ce8569a9b 100644 --- a/client/ayon_core/tools/workfiles/widgets/files_widget_published.py +++ b/client/ayon_core/tools/workfiles/widgets/files_widget_published.py @@ -192,6 +192,8 @@ class PublishedFilesModel(QtGui.QStandardItemModel): self._remove_empty_item() self._remove_missing_context_item() + user_items_by_name = self._controller.get_user_items_by_name() + items_to_remove = set(self._items_by_id.keys()) new_items = [] for file_item in file_items: @@ -212,9 +214,15 @@ class PublishedFilesModel(QtGui.QStandardItemModel): else: flags = QtCore.Qt.NoItemFlags + author = file_item.created_by + user_item = user_items_by_name.get(author) + if user_item is not None and user_item.full_name: + author = user_item.full_name + item.setFlags(flags) + item.setData(file_item.filepath, FILEPATH_ROLE) - item.setData(file_item.created_by, AUTHOR_ROLE) + item.setData(author, AUTHOR_ROLE) item.setData(file_item.modified, DATE_MODIFIED_ROLE) self._items_by_id[repre_id] = item diff --git a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py index 7798755f0e..5c102dcdd4 100644 --- a/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py +++ b/client/ayon_core/tools/workfiles/widgets/files_widget_workarea.py @@ -193,6 +193,7 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): return self._remove_empty_item() self._remove_missing_context_item() + user_items_by_name = self._controller.get_user_items_by_name() items_to_remove = set(self._items_by_filename.keys()) new_items = [] @@ -212,8 +213,13 @@ class WorkAreaFilesModel(QtGui.QStandardItemModel): item.setData(file_item.filename, QtCore.Qt.DisplayRole) item.setData(file_item.filename, FILENAME_ROLE) + updated_by = file_item.updated_by + user_item = user_items_by_name.get(updated_by) + if user_item is not None and user_item.full_name: + updated_by = user_item.full_name + item.setData(file_item.filepath, FILEPATH_ROLE) - item.setData(file_item.updated_by, AUTHOR_ROLE) + item.setData(updated_by, AUTHOR_ROLE) item.setData(file_item.modified, DATE_MODIFIED_ROLE) self._items_by_filename[file_item.filename] = item diff --git a/client/ayon_core/tools/workfiles/widgets/side_panel.py b/client/ayon_core/tools/workfiles/widgets/side_panel.py index 6bb3d98b40..53fdf0e0ac 100644 --- a/client/ayon_core/tools/workfiles/widgets/side_panel.py +++ b/client/ayon_core/tools/workfiles/widgets/side_panel.py @@ -147,17 +147,30 @@ class SidePanelWidget(QtWidgets.QWidget): workfile_info.creation_time) modification_time = datetime.datetime.fromtimestamp( workfile_info.modification_time) + + user_items_by_name = self._controller.get_user_items_by_name() + + def convert_username(username): + user_item = user_items_by_name.get(username) + if user_item is not None and user_item.full_name: + return user_item.full_name + return username + created_lines = [ creation_time.strftime(datetime_format) ] if workfile_info.created_by: - created_lines.insert(0, workfile_info.created_by) + created_lines.insert( + 0, convert_username(workfile_info.created_by) + ) modified_lines = [ modification_time.strftime(datetime_format) ] if workfile_info.updated_by: - modified_lines.insert(0, workfile_info.updated_by) + modified_lines.insert( + 0, convert_username(workfile_info.updated_by) + ) lines = ( "Size:", From b93c0ace2771ae321baf4f42822a3cbb958ad2d1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:34:23 +0200 Subject: [PATCH 360/469] Remove debug prints Co-authored-by: Roy Nieterau --- client/ayon_core/tools/sceneinventory/select_version_dialog.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/select_version_dialog.py b/client/ayon_core/tools/sceneinventory/select_version_dialog.py index 421989338c..1945d71a6d 100644 --- a/client/ayon_core/tools/sceneinventory/select_version_dialog.py +++ b/client/ayon_core/tools/sceneinventory/select_version_dialog.py @@ -207,9 +207,7 @@ class SelectVersionDialog(QtWidgets.QDialog): def _on_confirm(self): self._cancelled = False index = self._versions_combobox.currentIndex() - print(index) item_id = self._versions_combobox.itemData(index, ITEM_ID_ROLE) - print(item_id) self._selected_item = self._versions_combobox.get_item_by_id(item_id) self.accept() From f937fc954246d922d37899e800f1ae08f63bd5c0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:55:57 +0200 Subject: [PATCH 361/469] fix filtering --- client/ayon_core/tools/sceneinventory/view.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index b4ff62a405..770d0d903d 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -58,6 +58,7 @@ class SceneInventoryView(QtWidgets.QTreeView): model = InventoryModel(controller) proxy_model = FilterProxyModel() proxy_model.setSourceModel(model) + proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) self.setModel(proxy_model) @@ -111,17 +112,17 @@ class SceneInventoryView(QtWidgets.QTreeView): self._model.refresh(**kwargs) def set_hierarchy_view(self, enabled): - self._proxy.set_hierarchy_view(enabled) + self._proxy_model.set_hierarchy_view(enabled) self._model.set_hierarchy_view(enabled) def set_text_filter(self, text_filter): - if hasattr(self._proxy, "setFilterRegularExpression"): - self._proxy.setFilterRegularExpression(text_filter) + if hasattr(self._proxy_model, "setFilterRegularExpression"): + self._proxy_model.setFilterRegularExpression(text_filter) else: - self._proxy.setFilterRegExp(text_filter) + self._proxy_model.setFilterRegExp(text_filter) def set_filter_outdated(self, enabled): - self._proxy.set_filter_outdated(enabled) + self._proxy_model.set_filter_outdated(enabled) def get_selected_indexes(self): """Get the selected rows""" From f2fdb237d6b1ec9abbfbcfcddd456e9b7713f4c0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:56:04 +0200 Subject: [PATCH 362/469] fix update all --- client/ayon_core/tools/sceneinventory/model.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 8e549f6bde..c505ece689 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.lib import format_version +from ayon_core.tools.utils.lib import iter_model_rows, format_version ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 @@ -339,7 +339,16 @@ class InventoryModel(QtGui.QStandardItemModel): self._hierarchy_view = state def get_outdated_item_ids(self): - return set() + outdated_item_ids = [] + root_item = self.invisibleRootItem() + for row in range(root_item.rowCount()): + group_item = root_item.child(row) + if group_item.data(VERSION_IS_LATEST_ROLE): + continue + for idx in range(group_item.rowCount()): + item = group_item.child(idx) + outdated_item_ids.append(item.data(ITEM_ID_ROLE)) + return outdated_item_ids def _clear_items(self): root_item = self.invisibleRootItem() From 879805647fa48eeb314a99ffb4b516acea598a26 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:58:15 +0200 Subject: [PATCH 363/469] fill container data --- client/ayon_core/tools/sceneinventory/model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index c505ece689..3db33c77f7 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -246,6 +246,8 @@ class InventoryModel(QtGui.QStandardItemModel): item.setData(container_item.item_id, ITEM_ID_ROLE) item.setData(version_value, VERSION_VALUE_ROLE) item.setData(version_label, VERSION_LABEL_ROLE) + item.setData(container_item.loader_name, LOADER_NAME_ROLE) + item.setData(container_item.object_name, OBJECT_NAME_ROLE) item.setData(True, IS_CONTAINER_ITEM_ROLE) item.setData(unique_name, ITEM_UNIQUE_NAME_ROLE) container_model_items.append(item) From b9f646b9a06742a0ec7ceecfb381954e1e588324 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 10:08:48 +0200 Subject: [PATCH 364/469] don't update hero versions on update all --- .../ayon_core/tools/sceneinventory/model.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 3db33c77f7..0e9c80b3da 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -11,14 +11,14 @@ from ayon_core.pipeline import ( ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.lib import iter_model_rows, format_version +from ayon_core.tools.utils.lib import format_version ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 COUNT_ROLE = QtCore.Qt.UserRole + 3 IS_CONTAINER_ITEM_ROLE = QtCore.Qt.UserRole + 4 VERSION_IS_LATEST_ROLE = QtCore.Qt.UserRole + 5 -VERSION_VALUE_ROLE = QtCore.Qt.UserRole + 6 +VERSION_IS_HERO_ROLE = QtCore.Qt.UserRole + 6 VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 @@ -195,8 +195,8 @@ class InventoryModel(QtGui.QStandardItemModel): repre_info = repre_info_by_id[repre_id] version_label = "N/A" version_color = None - version_value = None is_latest = False + is_hero = False status_name = None status_color = None status_short = None @@ -216,10 +216,8 @@ class InventoryModel(QtGui.QStandardItemModel): version_items_by_product_id[repre_info.product_id] ) version_item = version_items[repre_info.version_id] - version_value = version_item.version - if version_value < 0: - version_value = HeroVersionType(version_value) - version_label = format_version(version_value) + version_label = format_version(version_item.version) + is_hero = version_item.version < 0 is_latest = version_item.is_latest if not is_latest: version_color = self.OUTDATED_COLOR @@ -244,7 +242,6 @@ class InventoryModel(QtGui.QStandardItemModel): item.setData(item_icon, QtCore.Qt.DecorationRole) item.setData(repre_info.product_id, PRODUCT_ID_ROLE) item.setData(container_item.item_id, ITEM_ID_ROLE) - item.setData(version_value, VERSION_VALUE_ROLE) item.setData(version_label, VERSION_LABEL_ROLE) item.setData(container_item.loader_name, LOADER_NAME_ROLE) item.setData(container_item.object_name, OBJECT_NAME_ROLE) @@ -273,6 +270,7 @@ class InventoryModel(QtGui.QStandardItemModel): group_item.setData(repre_info.product_type, PRODUCT_TYPE_ROLE) group_item.setData(product_type_icon, PRODUCT_TYPE_ICON_ROLE) group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) + group_item.setData(is_hero, VERSION_IS_HERO_ROLE) group_item.setData(version_label, VERSION_LABEL_ROLE) group_item.setData(len(container_items), COUNT_ROLE) group_item.setData(status_name, STATUS_NAME_ROLE) @@ -340,13 +338,17 @@ class InventoryModel(QtGui.QStandardItemModel): if state != self._hierarchy_view: self._hierarchy_view = state - def get_outdated_item_ids(self): + def get_outdated_item_ids(self, ignore_hero=True): outdated_item_ids = [] root_item = self.invisibleRootItem() for row in range(root_item.rowCount()): group_item = root_item.child(row) if group_item.data(VERSION_IS_LATEST_ROLE): continue + + if ignore_hero and group_item.data(VERSION_IS_HERO_ROLE): + continue + for idx in range(group_item.rowCount()): item = group_item.child(idx) outdated_item_ids.append(item.data(ITEM_ID_ROLE)) From 881d487fb35f66180f8ff2e6799978ee4a4851e2 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 10:14:20 +0200 Subject: [PATCH 365/469] remove unused import --- client/ayon_core/tools/sceneinventory/model.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 0e9c80b3da..1c51b7a98b 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -6,9 +6,6 @@ import collections from qtpy import QtCore, QtGui import qtawesome -from ayon_core.pipeline import ( - HeroVersionType, -) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon from ayon_core.tools.utils.lib import format_version From 68e499b5fb98452c778a670e5f6fb15f4dd0269c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 10:38:12 +0200 Subject: [PATCH 366/469] change sizes of splitter --- client/ayon_core/tools/workfiles/widgets/window.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/workfiles/widgets/window.py b/client/ayon_core/tools/workfiles/widgets/window.py index 1cfae7ec90..8bcff66f50 100644 --- a/client/ayon_core/tools/workfiles/widgets/window.py +++ b/client/ayon_core/tools/workfiles/widgets/window.py @@ -107,7 +107,7 @@ class WorkfilesToolWindow(QtWidgets.QWidget): split_widget.addWidget(tasks_widget) split_widget.addWidget(col_3_widget) split_widget.addWidget(side_panel) - split_widget.setSizes([255, 160, 455, 175]) + split_widget.setSizes([255, 175, 550, 190]) body_layout.addWidget(split_widget) @@ -169,7 +169,7 @@ class WorkfilesToolWindow(QtWidgets.QWidget): # Force focus on the open button by default, required for Houdini. self._files_widget.setFocus() - self.resize(1200, 600) + self.resize(1260, 600) def _create_col_1_widget(self, controller, parent): col_widget = QtWidgets.QWidget(parent) From c3c4951a31e0f8b1d1002ed7eb82fef0efa4b706 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:11:46 +0200 Subject: [PATCH 367/469] move client code next to server codebase --- .../celaction/client/ayon_celaction}/__init__.py | 0 .../celaction/client/ayon_celaction}/addon.py | 0 .../ayon_celaction}/hooks/pre_celaction_setup.py | 0 .../client/ayon_celaction}/plugins/__init__.py | 0 .../plugins/publish/collect_celaction_cli_kwargs.py | 0 .../plugins/publish/collect_celaction_instances.py | 0 .../plugins/publish/collect_render_path.py | 0 .../plugins/publish/integrate_version_up.py | 0 .../resources/celaction_template_scene.scn | Bin .../client/ayon_celaction}/scripts/__init__.py | 0 .../client/ayon_celaction}/scripts/publish_cli.py | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/addon.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/hooks/pre_celaction_setup.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_celaction_cli_kwargs.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_celaction_instances.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_render_path.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/integrate_version_up.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/resources/celaction_template_scene.scn (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/scripts/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/scripts/publish_cli.py (100%) diff --git a/client/ayon_core/hosts/celaction/__init__.py b/server_addon/celaction/client/ayon_celaction/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/__init__.py rename to server_addon/celaction/client/ayon_celaction/__init__.py diff --git a/client/ayon_core/hosts/celaction/addon.py b/server_addon/celaction/client/ayon_celaction/addon.py similarity index 100% rename from client/ayon_core/hosts/celaction/addon.py rename to server_addon/celaction/client/ayon_celaction/addon.py diff --git a/client/ayon_core/hosts/celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py similarity index 100% rename from client/ayon_core/hosts/celaction/hooks/pre_celaction_setup.py rename to server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py diff --git a/client/ayon_core/hosts/celaction/plugins/__init__.py b/server_addon/celaction/client/ayon_celaction/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/__init__.py rename to server_addon/celaction/client/ayon_celaction/plugins/__init__.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_instances.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_instances.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_render_path.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/integrate_version_up.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/integrate_version_up.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py diff --git a/client/ayon_core/hosts/celaction/resources/celaction_template_scene.scn b/server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn similarity index 100% rename from client/ayon_core/hosts/celaction/resources/celaction_template_scene.scn rename to server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn diff --git a/client/ayon_core/hosts/celaction/scripts/__init__.py b/server_addon/celaction/client/ayon_celaction/scripts/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/scripts/__init__.py rename to server_addon/celaction/client/ayon_celaction/scripts/__init__.py diff --git a/client/ayon_core/hosts/celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py similarity index 100% rename from client/ayon_core/hosts/celaction/scripts/publish_cli.py rename to server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py From fb7dc5b07a6279f3668d9674c9d0344041b87fd3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:12:24 +0200 Subject: [PATCH 368/469] removed unnecessary __init__ file --- server_addon/celaction/client/ayon_celaction/plugins/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/__init__.py diff --git a/server_addon/celaction/client/ayon_celaction/plugins/__init__.py b/server_addon/celaction/client/ayon_celaction/plugins/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 0af0545f533f2112e8f352a374c81d67c673814f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:04 +0200 Subject: [PATCH 369/469] fix imports --- .../client/ayon_celaction/hooks/pre_celaction_setup.py | 2 +- .../celaction/client/ayon_celaction/scripts/publish_cli.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py index 8350c7b7c8..2b76b30015 100644 --- a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py +++ b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py @@ -4,7 +4,7 @@ import winreg import subprocess from ayon_core.lib import get_ayon_launcher_args from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.celaction import CELACTION_ROOT_DIR +from ayon_celaction import CELACTION_ROOT_DIR class CelactionPrelaunchHook(PreLaunchHook): diff --git a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py index 92019b8702..9888244d6f 100644 --- a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py +++ b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py @@ -4,7 +4,7 @@ import sys import pyblish.api import pyblish.util -import ayon_core.hosts.celaction +from ayon_celaction import CELACTION_ROOT_DIR from ayon_core.lib import Logger from ayon_core.tools.utils import host_tools from ayon_core.pipeline import install_ayon_plugins @@ -13,8 +13,7 @@ from ayon_core.pipeline import install_ayon_plugins log = Logger.get_logger("celaction") PUBLISH_HOST = "celaction" -HOST_DIR = os.path.dirname(os.path.abspath(ayon_core.hosts.celaction.__file__)) -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(CELACTION_ROOT_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") From 7bd81a83e649b3e02a11af592d0642e904355c58 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:17 +0200 Subject: [PATCH 370/469] added settings category --- .../ayon_celaction/plugins/publish/collect_render_path.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py index 1bb4d54831..36a033ebb0 100644 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py +++ b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py @@ -10,6 +10,8 @@ class CollectRenderPath(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.495 families = ["render.farm"] + settings_category = "celaction" + # Presets output_extension = "png" anatomy_template_key_render_files = None From 4267252a36f8ba0841e0cfe909dcb7538dd8295d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:27 +0200 Subject: [PATCH 371/469] formatting changes --- .../client/ayon_celaction/hooks/pre_celaction_setup.py | 8 +++----- .../ayon_celaction/plugins/publish/collect_render_path.py | 2 +- .../client/ayon_celaction/scripts/publish_cli.py | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py index 2b76b30015..52622d43b8 100644 --- a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py +++ b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py @@ -8,9 +8,7 @@ from ayon_celaction import CELACTION_ROOT_DIR class CelactionPrelaunchHook(PreLaunchHook): - """ - Bootstrap celacion with pype - """ + """Bootstrap celacion with AYON""" app_groups = {"celaction"} platforms = {"windows"} launch_types = {LaunchTypes.local} @@ -39,7 +37,7 @@ class CelactionPrelaunchHook(PreLaunchHook): CELACTION_ROOT_DIR, "scripts", "publish_cli.py" ) subprocess_args = get_ayon_launcher_args("run", path_to_cli) - openpype_executable = subprocess_args.pop(0) + executable = subprocess_args.pop(0) workfile_settings = self.get_workfile_settings() winreg.SetValueEx( @@ -47,7 +45,7 @@ class CelactionPrelaunchHook(PreLaunchHook): "SubmitAppTitle", 0, winreg.REG_SZ, - openpype_executable + executable ) # add required arguments for workfile path diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py index 36a033ebb0..3bcd1c69b3 100644 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py +++ b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py @@ -1,6 +1,6 @@ import os -import pyblish.api import copy +import pyblish.api class CollectRenderPath(pyblish.api.InstancePlugin): diff --git a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py index 9888244d6f..4e54aa253a 100644 --- a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py +++ b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py @@ -18,7 +18,7 @@ PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") def main(): - # Registers pype's Global pyblish plugins + # Registers global pyblish plugins install_ayon_plugins() if os.path.exists(PUBLISH_PATH): From 438230bf5cdcaccf5506eebee1bac8fec917825b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:33 +0200 Subject: [PATCH 372/469] update package.py --- server_addon/celaction/package.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server_addon/celaction/package.py b/server_addon/celaction/package.py index 2b11a8630f..8b9069d019 100644 --- a/server_addon/celaction/package.py +++ b/server_addon/celaction/package.py @@ -1,3 +1,12 @@ name = "celaction" title = "CelAction" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_celaction" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = { + "applications": ">=0.2.0", +} From 04126feff2919110755258aa141821ef625a7825 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:15:26 +0200 Subject: [PATCH 373/469] added milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 939fab68b8..865c6a56a3 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), From 6bd274df24f556837c7a6dbba17b66a363421920 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:20:52 +0200 Subject: [PATCH 374/469] moved flame integration next to server codebase --- .../flame => server_addon/flame/client/ayon_flame}/__init__.py | 0 .../hosts/flame => server_addon/flame/client/ayon_flame}/addon.py | 0 .../flame/client/ayon_flame}/api/__init__.py | 0 .../flame/client/ayon_flame}/api/batch_utils.py | 0 .../flame/client/ayon_flame}/api/constants.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/lib.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/menu.py | 0 .../flame/client/ayon_flame}/api/pipeline.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/plugin.py | 0 .../flame/client/ayon_flame}/api/render_utils.py | 0 .../flame/client/ayon_flame}/api/scripts/wiretap_com.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/utils.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/workio.py | 0 .../flame/client/ayon_flame}/hooks/pre_flame_setup.py | 0 .../flame/client/ayon_flame}/otio/__init__.py | 0 .../flame/client/ayon_flame}/otio/flame_export.py | 0 .../flame => server_addon/flame/client/ayon_flame}/otio/utils.py | 0 .../flame/client/ayon_flame}/plugins/create/create_shot_clip.py | 0 .../flame/client/ayon_flame}/plugins/load/load_clip.py | 0 .../flame/client/ayon_flame}/plugins/load/load_clip_batch.py | 0 .../client/ayon_flame}/plugins/publish/collect_test_selection.py | 0 .../ayon_flame}/plugins/publish/collect_timeline_instances.py | 0 .../client/ayon_flame}/plugins/publish/collect_timeline_otio.py | 0 .../flame/client/ayon_flame}/plugins/publish/extract_otio_file.py | 0 .../ayon_flame}/plugins/publish/extract_subset_resources.py | 0 .../client/ayon_flame}/plugins/publish/integrate_batch_group.py | 0 .../export_preset/openpype_seg_thumbnails_jpg.xml | 0 .../export_preset/openpype_seg_video_h264.xml | 0 .../startup/openpype_babypublisher/modules/__init__.py | 0 .../startup/openpype_babypublisher/modules/app_utils.py | 0 .../startup/openpype_babypublisher/modules/ftrack_lib.py | 0 .../startup/openpype_babypublisher/modules/panel_app.py | 0 .../startup/openpype_babypublisher/modules/uiwidgets.py | 0 .../startup/openpype_babypublisher/openpype_babypublisher.py | 0 .../flame/client/ayon_flame}/startup/openpype_in_flame.py | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/addon.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/batch_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/constants.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/lib.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/menu.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/pipeline.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/plugin.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/render_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/scripts/wiretap_com.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/workio.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/hooks/pre_flame_setup.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/flame_export.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/create/create_shot_clip.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/load/load_clip.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/load/load_clip_batch.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_test_selection.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_timeline_instances.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_timeline_otio.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/extract_otio_file.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/extract_subset_resources.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/integrate_batch_group.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/app_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/ftrack_lib.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/panel_app.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/uiwidgets.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/openpype_babypublisher.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_in_flame.py (100%) diff --git a/client/ayon_core/hosts/flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/__init__.py rename to server_addon/flame/client/ayon_flame/__init__.py diff --git a/client/ayon_core/hosts/flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py similarity index 100% rename from client/ayon_core/hosts/flame/addon.py rename to server_addon/flame/client/ayon_flame/addon.py diff --git a/client/ayon_core/hosts/flame/api/__init__.py b/server_addon/flame/client/ayon_flame/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/api/__init__.py rename to server_addon/flame/client/ayon_flame/api/__init__.py diff --git a/client/ayon_core/hosts/flame/api/batch_utils.py b/server_addon/flame/client/ayon_flame/api/batch_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/batch_utils.py rename to server_addon/flame/client/ayon_flame/api/batch_utils.py diff --git a/client/ayon_core/hosts/flame/api/constants.py b/server_addon/flame/client/ayon_flame/api/constants.py similarity index 100% rename from client/ayon_core/hosts/flame/api/constants.py rename to server_addon/flame/client/ayon_flame/api/constants.py diff --git a/client/ayon_core/hosts/flame/api/lib.py b/server_addon/flame/client/ayon_flame/api/lib.py similarity index 100% rename from client/ayon_core/hosts/flame/api/lib.py rename to server_addon/flame/client/ayon_flame/api/lib.py diff --git a/client/ayon_core/hosts/flame/api/menu.py b/server_addon/flame/client/ayon_flame/api/menu.py similarity index 100% rename from client/ayon_core/hosts/flame/api/menu.py rename to server_addon/flame/client/ayon_flame/api/menu.py diff --git a/client/ayon_core/hosts/flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/flame/api/pipeline.py rename to server_addon/flame/client/ayon_flame/api/pipeline.py diff --git a/client/ayon_core/hosts/flame/api/plugin.py b/server_addon/flame/client/ayon_flame/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/flame/api/plugin.py rename to server_addon/flame/client/ayon_flame/api/plugin.py diff --git a/client/ayon_core/hosts/flame/api/render_utils.py b/server_addon/flame/client/ayon_flame/api/render_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/render_utils.py rename to server_addon/flame/client/ayon_flame/api/render_utils.py diff --git a/client/ayon_core/hosts/flame/api/scripts/wiretap_com.py b/server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py similarity index 100% rename from client/ayon_core/hosts/flame/api/scripts/wiretap_com.py rename to server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py diff --git a/client/ayon_core/hosts/flame/api/utils.py b/server_addon/flame/client/ayon_flame/api/utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/utils.py rename to server_addon/flame/client/ayon_flame/api/utils.py diff --git a/client/ayon_core/hosts/flame/api/workio.py b/server_addon/flame/client/ayon_flame/api/workio.py similarity index 100% rename from client/ayon_core/hosts/flame/api/workio.py rename to server_addon/flame/client/ayon_flame/api/workio.py diff --git a/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py similarity index 100% rename from client/ayon_core/hosts/flame/hooks/pre_flame_setup.py rename to server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py diff --git a/client/ayon_core/hosts/flame/otio/__init__.py b/server_addon/flame/client/ayon_flame/otio/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/__init__.py rename to server_addon/flame/client/ayon_flame/otio/__init__.py diff --git a/client/ayon_core/hosts/flame/otio/flame_export.py b/server_addon/flame/client/ayon_flame/otio/flame_export.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/flame_export.py rename to server_addon/flame/client/ayon_flame/otio/flame_export.py diff --git a/client/ayon_core/hosts/flame/otio/utils.py b/server_addon/flame/client/ayon_flame/otio/utils.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/utils.py rename to server_addon/flame/client/ayon_flame/otio/utils.py diff --git a/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py rename to server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/load/load_clip.py rename to server_addon/flame/client/ayon_flame/plugins/load/load_clip.py diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py rename to server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/extract_otio_file.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/extract_otio_file.py rename to server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/extract_subset_resources.py rename to server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py rename to server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/__init__.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/__init__.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/app_utils.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/app_utils.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/ftrack_lib.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/ftrack_lib.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/panel_app.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/panel_app.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/uiwidgets.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/uiwidgets.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/openpype_babypublisher.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/openpype_babypublisher.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_in_flame.py b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_in_flame.py rename to server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py From 7ad67f57b907f5589e87591c315fb4cc793a09f1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:28:54 +0200 Subject: [PATCH 375/469] renamed 'HOST_DIR to 'FLAME_ADDON_ROOT' --- server_addon/flame/client/ayon_flame/__init__.py | 4 ++-- server_addon/flame/client/ayon_flame/addon.py | 6 +++--- server_addon/flame/client/ayon_flame/api/pipeline.py | 5 ++--- server_addon/flame/client/ayon_flame/api/utils.py | 5 +++-- .../flame/client/ayon_flame/hooks/pre_flame_setup.py | 5 +++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py index b45f107747..c7b4516c95 100644 --- a/server_addon/flame/client/ayon_flame/__init__.py +++ b/server_addon/flame/client/ayon_flame/__init__.py @@ -1,10 +1,10 @@ from .addon import ( - HOST_DIR, + FLAME_ADDON_ROOT, FlameAddon, ) __all__ = ( - "HOST_DIR", + "FLAME_ADDON_ROOT", "FlameAddon", ) diff --git a/server_addon/flame/client/ayon_flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py index f5560cde7a..2a9c57b24c 100644 --- a/server_addon/flame/client/ayon_flame/addon.py +++ b/server_addon/flame/client/ayon_flame/addon.py @@ -1,7 +1,7 @@ import os from ayon_core.addon import AYONAddon, IHostAddon -HOST_DIR = os.path.dirname(os.path.abspath(__file__)) +FLAME_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class FlameAddon(AYONAddon, IHostAddon): @@ -10,7 +10,7 @@ class FlameAddon(AYONAddon, IHostAddon): def add_implementation_envs(self, env, _app): # Add requirements to DL_PYTHON_HOOK_PATH - env["DL_PYTHON_HOOK_PATH"] = os.path.join(HOST_DIR, "startup") + env["DL_PYTHON_HOOK_PATH"] = os.path.join(FLAME_ADDON_ROOT, "startup") env.pop("QT_AUTO_SCREEN_SCALE_FACTOR", None) # Set default values if are not already set via settings @@ -25,7 +25,7 @@ class FlameAddon(AYONAddon, IHostAddon): if app.host_name != self.host_name: return [] return [ - os.path.join(HOST_DIR, "hooks") + os.path.join(FLAME_ADDON_ROOT, "hooks") ] def get_workfile_extensions(self): diff --git a/server_addon/flame/client/ayon_flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py index 4578d7bb4b..73baca87df 100644 --- a/server_addon/flame/client/ayon_flame/api/pipeline.py +++ b/server_addon/flame/client/ayon_flame/api/pipeline.py @@ -13,6 +13,7 @@ from ayon_core.pipeline import ( deregister_creator_plugin_path, AVALON_CONTAINER_ID, ) +from ayon_flame import FLAME_ADDON_ROOT from .lib import ( set_segment_data_marker, set_publish_attribute, @@ -20,10 +21,8 @@ from .lib import ( get_current_sequence, reset_segment_selection ) -from .. import HOST_DIR -API_DIR = os.path.join(HOST_DIR, "api") -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(FLAME_ADDON_ROOT, "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") diff --git a/server_addon/flame/client/ayon_flame/api/utils.py b/server_addon/flame/client/ayon_flame/api/utils.py index b76dd92ada..03a694c25c 100644 --- a/server_addon/flame/client/ayon_flame/api/utils.py +++ b/server_addon/flame/client/ayon_flame/api/utils.py @@ -5,6 +5,8 @@ Flame utils for syncing scripts import os import shutil from ayon_core.lib import Logger +from ayon_flame import FLAME_ADDON_ROOT + log = Logger.get_logger(__name__) @@ -16,7 +18,6 @@ def _sync_utility_scripts(env=None): `/opt/Autodesk/shared/python`. This will be always synchronizing those folders. """ - from .. import HOST_DIR env = env or os.environ @@ -26,7 +27,7 @@ def _sync_utility_scripts(env=None): flame_shared_dir = "/opt/Autodesk/shared/python" fsd_paths = [os.path.join( - HOST_DIR, + FLAME_ADDON_ROOT, "api", "utility_scripts" )] diff --git a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py index 77a9435205..e9e9aca3f4 100644 --- a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py +++ b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py @@ -10,7 +10,7 @@ from ayon_core.lib import ( run_subprocess, ) from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts import flame as opflame +from ayon_flame import FLAME_ADDON_ROOT class FlamePrelaunch(PreLaunchHook): @@ -23,7 +23,8 @@ class FlamePrelaunch(PreLaunchHook): permissions = 0o777 wtc_script_path = os.path.join( - opflame.HOST_DIR, "api", "scripts", "wiretap_com.py") + FLAME_ADDON_ROOT, "api", "scripts", "wiretap_com.py" + ) launch_types = {LaunchTypes.local} def __init__(self, *args, **kwargs): From 9ce468d15577bed0c3c2aa1cb4fd083bfbac4b4f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:22 +0200 Subject: [PATCH 376/469] fixed imports --- server_addon/flame/client/ayon_flame/api/menu.py | 2 +- server_addon/flame/client/ayon_flame/otio/flame_export.py | 2 +- .../client/ayon_flame/plugins/create/create_shot_clip.py | 2 +- .../flame/client/ayon_flame/plugins/load/load_clip.py | 2 +- .../flame/client/ayon_flame/plugins/load/load_clip_batch.py | 2 +- .../ayon_flame/plugins/publish/collect_test_selection.py | 4 ++-- .../ayon_flame/plugins/publish/collect_timeline_instances.py | 4 ++-- .../ayon_flame/plugins/publish/collect_timeline_otio.py | 4 ++-- .../ayon_flame/plugins/publish/extract_subset_resources.py | 4 ++-- .../ayon_flame/plugins/publish/integrate_batch_group.py | 2 +- .../flame/client/ayon_flame/startup/openpype_in_flame.py | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/api/menu.py b/server_addon/flame/client/ayon_flame/api/menu.py index 7e880483f5..83d75d18d3 100644 --- a/server_addon/flame/client/ayon_flame/api/menu.py +++ b/server_addon/flame/client/ayon_flame/api/menu.py @@ -28,7 +28,7 @@ default_flame_export_presets = { def callback_selection(selection, function): - import ayon_core.hosts.flame.api as opfapi + import ayon_flame.api as opfapi opfapi.CTX.selection = selection print("Hook Selection: \n\t{}".format( pformat({ diff --git a/server_addon/flame/client/ayon_flame/otio/flame_export.py b/server_addon/flame/client/ayon_flame/otio/flame_export.py index cb038f9e9a..bebe9be1c1 100644 --- a/server_addon/flame/client/ayon_flame/otio/flame_export.py +++ b/server_addon/flame/client/ayon_flame/otio/flame_export.py @@ -275,7 +275,7 @@ def create_otio_reference(clip_data, fps=None): def create_otio_clip(clip_data): - from ayon_core.hosts.flame.api import MediaInfoFile, TimeEffectMetadata + from ayon_flame.api import MediaInfoFile, TimeEffectMetadata segment = clip_data["PySegment"] diff --git a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py index 56f5319f21..120c8c559d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py +++ b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py @@ -1,5 +1,5 @@ from copy import deepcopy -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi class CreateShotClip(opfapi.Creator): diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py index 40ab9c038b..c8ec7b36c9 100644 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py +++ b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py @@ -2,7 +2,7 @@ from copy import deepcopy import os import flame from pprint import pformat -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.lib import StringTemplate from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py index 1b23a8b465..0d7a125af7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py +++ b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py @@ -2,7 +2,7 @@ from copy import deepcopy import os import flame from pprint import pformat -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.lib import StringTemplate from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py index 7442e7df48..dac2c862e6 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py @@ -1,8 +1,8 @@ import os import pyblish.api import tempfile -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export as otio_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export as otio_export import opentimelineio as otio from pprint import pformat reload(otio_export) # noqa diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py index ca5475824d..06108a37a7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py @@ -1,8 +1,8 @@ import re from types import NoneType import pyblish -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID from ayon_core.pipeline.editorial import ( is_overlapping_otio_ranges, diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py index 7609ea7879..139ac5b875 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py @@ -1,7 +1,7 @@ import pyblish.api -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py index cae08cd76b..51c0b280b7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py @@ -5,8 +5,8 @@ from copy import deepcopy import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.flame import api as opfapi -from ayon_core.hosts.flame.api import MediaInfoFile +from ayon_flame import api as opfapi +from ayon_flame.api import MediaInfoFile from ayon_core.pipeline.editorial import ( get_media_range_with_retimes ) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py index d8669f836d..776c89d38d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py @@ -3,7 +3,7 @@ import copy from collections import OrderedDict from pprint import pformat import pyblish -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi import ayon_core.pipeline as op_pipeline from ayon_core.pipeline.workfile import get_workdir diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py index b9cbf9700b..8f319a88eb 100644 --- a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py +++ b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py @@ -4,7 +4,7 @@ from qtpy import QtWidgets from pprint import pformat import atexit -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.pipeline import ( install_host, registered_host, From c349cc7015dafc9e534f379535189d2502eaee7b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:30 +0200 Subject: [PATCH 377/469] added settings category --- .../ayon_flame/plugins/publish/collect_timeline_instances.py | 2 ++ .../ayon_flame/plugins/publish/extract_subset_resources.py | 2 ++ .../client/ayon_flame/plugins/publish/integrate_batch_group.py | 2 ++ 3 files changed, 6 insertions(+) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py index 06108a37a7..35591f1a0d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py @@ -24,6 +24,8 @@ class CollectTimelineInstances(pyblish.api.ContextPlugin): label = "Collect timeline Instances" hosts = ["flame"] + settings_category = "flame" + audio_track_items = [] # settings diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py index 51c0b280b7..66c6181ffb 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py @@ -24,6 +24,8 @@ class ExtractProductResources(publish.Extractor): families = ["clip"] hosts = ["flame"] + settings_category = "flame" + # plugin defaults keep_original_representation = False diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py index 776c89d38d..f77c9e9116 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py @@ -16,6 +16,8 @@ class IntegrateBatchGroup(pyblish.api.InstancePlugin): hosts = ["flame"] families = ["clip"] + settings_category = "flame" + # settings default_loader = "LoadClip" From c5ca23ff0f098410c19a721e4f710ac98ea1ea8a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:38 +0200 Subject: [PATCH 378/469] removed resolve import --- server_addon/flame/client/ayon_flame/api/pipeline.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py index 73baca87df..121b925920 100644 --- a/server_addon/flame/client/ayon_flame/api/pipeline.py +++ b/server_addon/flame/client/ayon_flame/api/pipeline.py @@ -112,10 +112,6 @@ def on_pyblish_instance_toggled(instance, old_value, new_value): log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) - # from ayon_core.hosts.resolve import ( - # set_publish_attribute - # ) - # # Whether instances should be passthrough based on new value # timeline_item = instance.data["item"] # set_publish_attribute(timeline_item, new_value) From ded6f0b7beb98c58351a6e93b5699b6638b097f6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:30:57 +0200 Subject: [PATCH 379/469] added more information to package --- server_addon/flame/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/flame/package.py b/server_addon/flame/package.py index 8c077ed91d..f228e61f8e 100644 --- a/server_addon/flame/package.py +++ b/server_addon/flame/package.py @@ -1,3 +1,10 @@ name = "flame" title = "Flame" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_flame" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 7de260a0f6dc5141fd510beab84943b6eb1d6249 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:33:32 +0200 Subject: [PATCH 380/469] added version.py --- server_addon/flame/client/ayon_flame/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/flame/client/ayon_flame/version.py diff --git a/server_addon/flame/client/ayon_flame/version.py b/server_addon/flame/client/ayon_flame/version.py new file mode 100644 index 0000000000..0004797e59 --- /dev/null +++ b/server_addon/flame/client/ayon_flame/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'flame' version.""" +__version__ = "0.2.0" From 8df1cab5896543a6c5645398acd8192b6ef07bc3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:33:46 +0200 Subject: [PATCH 381/469] added flame to version milestones --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 939fab68b8..fa008778dd 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -52,6 +52,7 @@ IGNORED_MODULES_IN_AYON = set() MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), + "flame": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), From cfb06c9a9be33b6f472263200a5f9db26bd4a66a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:36:13 +0200 Subject: [PATCH 382/469] added version.py --- server_addon/celaction/client/ayon_celaction/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/celaction/client/ayon_celaction/version.py diff --git a/server_addon/celaction/client/ayon_celaction/version.py b/server_addon/celaction/client/ayon_celaction/version.py new file mode 100644 index 0000000000..ceed47c3a0 --- /dev/null +++ b/server_addon/celaction/client/ayon_celaction/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'celaction' version.""" +__version__ = "0.2.0" From ddb4da0e869ed00ed8ac09cf382431cc58e328cb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:36:59 +0200 Subject: [PATCH 383/469] added version to cealaction addon class --- server_addon/celaction/client/ayon_celaction/__init__.py | 3 +++ server_addon/celaction/client/ayon_celaction/addon.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/server_addon/celaction/client/ayon_celaction/__init__.py b/server_addon/celaction/client/ayon_celaction/__init__.py index 8983d48d7d..0df0224125 100644 --- a/server_addon/celaction/client/ayon_celaction/__init__.py +++ b/server_addon/celaction/client/ayon_celaction/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( CELACTION_ROOT_DIR, CelactionAddon, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "CELACTION_ROOT_DIR", "CelactionAddon", ) diff --git a/server_addon/celaction/client/ayon_celaction/addon.py b/server_addon/celaction/client/ayon_celaction/addon.py index d00401a2e0..ad04a54088 100644 --- a/server_addon/celaction/client/ayon_celaction/addon.py +++ b/server_addon/celaction/client/ayon_celaction/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + CELACTION_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) class CelactionAddon(AYONAddon, IHostAddon): name = "celaction" + version = __version__ host_name = "celaction" def get_launch_hook_paths(self, app): From 230a7c1ac34a64268c79a0d557402c69f236a3ca Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:37:46 +0200 Subject: [PATCH 384/469] added 'version' to addon class --- server_addon/flame/client/ayon_flame/__init__.py | 3 +++ server_addon/flame/client/ayon_flame/addon.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/server_addon/flame/client/ayon_flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py index c7b4516c95..d2d89bdb01 100644 --- a/server_addon/flame/client/ayon_flame/__init__.py +++ b/server_addon/flame/client/ayon_flame/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( FLAME_ADDON_ROOT, FlameAddon, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "FLAME_ADDON_ROOT", "FlameAddon", ) diff --git a/server_addon/flame/client/ayon_flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py index 2a9c57b24c..5a96a9332e 100644 --- a/server_addon/flame/client/ayon_flame/addon.py +++ b/server_addon/flame/client/ayon_flame/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + FLAME_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class FlameAddon(AYONAddon, IHostAddon): name = "flame" + version = __version__ host_name = "flame" def add_implementation_envs(self, env, _app): From 80966a5532eacbbf9b7d5aee6e4613180b072286 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:38:51 +0200 Subject: [PATCH 385/469] fix typo in product types label --- server/settings/publish_plugins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index ef531c8345..2640a3db37 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -558,7 +558,7 @@ class ExtractBurninProfile(BaseSettingsModel): _layout = "expanded" product_types: list[str] = SettingsField( default_factory=list, - title="Produt types" + title="Product types" ) hosts: list[str] = SettingsField( default_factory=list, From af26054c2b176b0bfe8e0576aae2b045eedc5fec Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:05:26 +0200 Subject: [PATCH 386/469] move harmony client code next to server codebase --- .../harmony/harmony/ayon_harmony}/__init__.py | 0 .../harmony/harmony/ayon_harmony}/addon.py | 0 .../harmony/harmony/ayon_harmony}/api/README.md | 0 .../harmony/ayon_harmony}/api/TB_sceneOpened.js | 0 .../harmony/harmony/ayon_harmony}/api/__init__.py | 0 .../harmony/ayon_harmony}/api/js/.eslintrc.json | 0 .../harmony/ayon_harmony}/api/js/AvalonHarmony.js | 0 .../harmony/ayon_harmony}/api/js/package.json | 0 .../harmony/ayon_harmony}/api/launch_script.py | 0 .../harmony/harmony/ayon_harmony}/api/lib.py | 0 .../harmony/harmony/ayon_harmony}/api/pipeline.py | 0 .../harmony/harmony/ayon_harmony}/api/plugin.py | 0 .../harmony/harmony/ayon_harmony}/api/server.py | 0 .../harmony/harmony/ayon_harmony}/api/temp.zip | Bin .../harmony/harmony/ayon_harmony}/api/workio.py | 0 .../harmony/ayon_harmony}/hooks/pre_launch_args.py | 0 .../harmony/harmony/ayon_harmony}/js/.eslintrc.json | 0 .../harmony/harmony/ayon_harmony}/js/PypeHarmony.js | 0 .../harmony/harmony/ayon_harmony}/js/README.md | 0 .../ayon_harmony}/js/creators/CreateRender.js | 0 .../ayon_harmony}/js/loaders/ImageSequenceLoader.js | 0 .../ayon_harmony}/js/loaders/TemplateLoader.js | 0 .../harmony/harmony/ayon_harmony}/js/package.json | 0 .../ayon_harmony}/js/publish/CollectCurrentFile.js | 0 .../ayon_harmony}/js/publish/CollectFarmRender.js | 0 .../ayon_harmony}/js/publish/CollectPalettes.js | 0 .../ayon_harmony}/js/publish/ExtractPalette.js | 0 .../ayon_harmony}/js/publish/ExtractTemplate.js | 0 .../harmony/ayon_harmony}/plugins/__init__.py | 0 .../plugins/create/create_farm_render.py | 0 .../ayon_harmony}/plugins/create/create_render.py | 0 .../ayon_harmony}/plugins/create/create_template.py | 0 .../ayon_harmony}/plugins/load/load_audio.py | 0 .../ayon_harmony}/plugins/load/load_background.py | 0 .../plugins/load/load_imagesequence.py | 0 .../ayon_harmony}/plugins/load/load_palette.py | 0 .../ayon_harmony}/plugins/load/load_template.py | 0 .../plugins/load/load_template_workfile.py | 0 .../ayon_harmony}/plugins/publish/collect_audio.py | 0 .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_farm_render.py | 0 .../plugins/publish/collect_instances.py | 0 .../plugins/publish/collect_palettes.py | 0 .../ayon_harmony}/plugins/publish/collect_scene.py | 0 .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/extract_palette.py | 0 .../ayon_harmony}/plugins/publish/extract_render.py | 0 .../plugins/publish/extract_save_scene.py | 0 .../plugins/publish/extract_template.py | 0 .../plugins/publish/extract_workfile.py | 0 .../plugins/publish/help/validate_audio.xml | 0 .../plugins/publish/help/validate_instances.xml | 0 .../publish/help/validate_scene_settings.xml | 0 .../plugins/publish/increment_workfile.py | 0 .../ayon_harmony}/plugins/publish/validate_audio.py | 0 .../plugins/publish/validate_instances.py | 0 .../plugins/publish/validate_scene_settings.py | 0 .../harmony/ayon_harmony}/vendor/.eslintrc.json | 0 .../ayon_harmony}/vendor/OpenHarmony/.gitattributes | 0 .../ayon_harmony}/vendor/OpenHarmony/.gitignore | 0 .../ayon_harmony}/vendor/OpenHarmony/Install.bat | 0 .../ayon_harmony}/vendor/OpenHarmony/LICENSE | 0 .../ayon_harmony}/vendor/OpenHarmony/README.md | 0 .../ayon_harmony}/vendor/OpenHarmony/build_doc.bat | 0 .../vendor/OpenHarmony/documentation.json | 0 .../ayon_harmony}/vendor/OpenHarmony/install.sh | 0 .../ayon_harmony}/vendor/OpenHarmony/oH_DOM.jpg | Bin .../ayon_harmony}/vendor/OpenHarmony/openHarmony.js | 0 .../OpenHarmony/openHarmony/openHarmony_actions.js | 0 .../openHarmony/openHarmony_application.js | 0 .../openHarmony/openHarmony_attribute.js | 0 .../OpenHarmony/openHarmony/openHarmony_backdrop.js | 0 .../OpenHarmony/openHarmony/openHarmony_color.js | 0 .../OpenHarmony/openHarmony/openHarmony_column.js | 0 .../OpenHarmony/openHarmony/openHarmony_database.js | 0 .../OpenHarmony/openHarmony/openHarmony_dialog.js | 0 .../OpenHarmony/openHarmony/openHarmony_drawing.js | 0 .../OpenHarmony/openHarmony/openHarmony_element.js | 0 .../OpenHarmony/openHarmony/openHarmony_file.js | 0 .../OpenHarmony/openHarmony/openHarmony_frame.js | 0 .../OpenHarmony/openHarmony/openHarmony_list.js | 0 .../OpenHarmony/openHarmony/openHarmony_math.js | 0 .../OpenHarmony/openHarmony/openHarmony_metadata.js | 0 .../OpenHarmony/openHarmony/openHarmony_misc.js | 0 .../OpenHarmony/openHarmony/openHarmony_network.js | 0 .../OpenHarmony/openHarmony/openHarmony_node.js | 0 .../openHarmony/openHarmony_nodeAttributes.js | 0 .../OpenHarmony/openHarmony/openHarmony_nodeLink.js | 0 .../OpenHarmony/openHarmony/openHarmony_palette.js | 0 .../OpenHarmony/openHarmony/openHarmony_path.js | 0 .../openHarmony/openHarmony_preferencedoc.js | 0 .../openHarmony/openHarmony_preferences.js | 0 .../OpenHarmony/openHarmony/openHarmony_scene.js | 0 .../openHarmony/openHarmony_threading.js | 0 .../OpenHarmony/openHarmony/openHarmony_timeline.js | 0 .../OpenHarmony/openHarmony/openHarmony_tool.js | 0 .../openHarmony/openHarmony_toolInstall.ui | 0 .../vendor/OpenHarmony/openHarmony_install.js | 0 .../vendor/OpenHarmony/openHarmony_tools.js | 0 .../ayon_harmony}/vendor/OpenHarmony/package.json | 0 .../Reference_view_currentToolManager().txt | 0 .../ayon_harmony}/vendor/OpenHarmony/tbpackage.json | 0 .../OpenHarmony/tools/OpenHarmony_basic/INSTALL | 0 .../OpenHarmony/tools/OpenHarmony_basic/README | 0 .../OpenHarmony_basic/openHarmony_anim_tools.js | 0 .../openHarmony_basic_backdropPicker.ui | 0 .../OpenHarmony_basic/openHarmony_rigging_tools.js | 0 107 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/__init__.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/addon.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/README.md (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/TB_sceneOpened.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/__init__.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/js/.eslintrc.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/js/AvalonHarmony.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/js/package.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/launch_script.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/lib.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/pipeline.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/plugin.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/server.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/temp.zip (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/api/workio.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/hooks/pre_launch_args.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/.eslintrc.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/PypeHarmony.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/README.md (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/creators/CreateRender.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/loaders/ImageSequenceLoader.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/loaders/TemplateLoader.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/package.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/publish/CollectCurrentFile.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/publish/CollectFarmRender.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/publish/CollectPalettes.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/publish/ExtractPalette.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/js/publish/ExtractTemplate.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/create/create_farm_render.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/create/create_render.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/create/create_template.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_audio.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_background.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_imagesequence.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_palette.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_template.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/load/load_template_workfile.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_audio.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_farm_render.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_instances.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_palettes.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_scene.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/extract_palette.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/extract_render.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/extract_save_scene.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/extract_template.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/extract_workfile.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/help/validate_audio.xml (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/help/validate_instances.xml (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/help/validate_scene_settings.xml (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/increment_workfile.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/validate_audio.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/validate_instances.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/plugins/publish/validate_scene_settings.py (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/.eslintrc.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/.gitattributes (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/.gitignore (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/Install.bat (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/LICENSE (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/README.md (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/build_doc.bat (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/documentation.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/install.sh (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/oH_DOM.jpg (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_actions.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_application.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_color.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_column.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_database.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_element.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_file.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_frame.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_list.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_math.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_misc.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_network.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_node.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_palette.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_path.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_scene.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_threading.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_tool.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony_install.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/openHarmony_tools.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/package.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tbpackage.json (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tools/OpenHarmony_basic/README (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui (100%) rename {client/ayon_core/hosts/harmony => server_addon/harmony/harmony/ayon_harmony}/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js (100%) diff --git a/client/ayon_core/hosts/harmony/__init__.py b/server_addon/harmony/harmony/ayon_harmony/__init__.py similarity index 100% rename from client/ayon_core/hosts/harmony/__init__.py rename to server_addon/harmony/harmony/ayon_harmony/__init__.py diff --git a/client/ayon_core/hosts/harmony/addon.py b/server_addon/harmony/harmony/ayon_harmony/addon.py similarity index 100% rename from client/ayon_core/hosts/harmony/addon.py rename to server_addon/harmony/harmony/ayon_harmony/addon.py diff --git a/client/ayon_core/hosts/harmony/api/README.md b/server_addon/harmony/harmony/ayon_harmony/api/README.md similarity index 100% rename from client/ayon_core/hosts/harmony/api/README.md rename to server_addon/harmony/harmony/ayon_harmony/api/README.md diff --git a/client/ayon_core/hosts/harmony/api/TB_sceneOpened.js b/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js similarity index 100% rename from client/ayon_core/hosts/harmony/api/TB_sceneOpened.js rename to server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js diff --git a/client/ayon_core/hosts/harmony/api/__init__.py b/server_addon/harmony/harmony/ayon_harmony/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/__init__.py rename to server_addon/harmony/harmony/ayon_harmony/api/__init__.py diff --git a/client/ayon_core/hosts/harmony/api/js/.eslintrc.json b/server_addon/harmony/harmony/ayon_harmony/api/js/.eslintrc.json similarity index 100% rename from client/ayon_core/hosts/harmony/api/js/.eslintrc.json rename to server_addon/harmony/harmony/ayon_harmony/api/js/.eslintrc.json diff --git a/client/ayon_core/hosts/harmony/api/js/AvalonHarmony.js b/server_addon/harmony/harmony/ayon_harmony/api/js/AvalonHarmony.js similarity index 100% rename from client/ayon_core/hosts/harmony/api/js/AvalonHarmony.js rename to server_addon/harmony/harmony/ayon_harmony/api/js/AvalonHarmony.js diff --git a/client/ayon_core/hosts/harmony/api/js/package.json b/server_addon/harmony/harmony/ayon_harmony/api/js/package.json similarity index 100% rename from client/ayon_core/hosts/harmony/api/js/package.json rename to server_addon/harmony/harmony/ayon_harmony/api/js/package.json diff --git a/client/ayon_core/hosts/harmony/api/launch_script.py b/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/launch_script.py rename to server_addon/harmony/harmony/ayon_harmony/api/launch_script.py diff --git a/client/ayon_core/hosts/harmony/api/lib.py b/server_addon/harmony/harmony/ayon_harmony/api/lib.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/lib.py rename to server_addon/harmony/harmony/ayon_harmony/api/lib.py diff --git a/client/ayon_core/hosts/harmony/api/pipeline.py b/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/pipeline.py rename to server_addon/harmony/harmony/ayon_harmony/api/pipeline.py diff --git a/client/ayon_core/hosts/harmony/api/plugin.py b/server_addon/harmony/harmony/ayon_harmony/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/plugin.py rename to server_addon/harmony/harmony/ayon_harmony/api/plugin.py diff --git a/client/ayon_core/hosts/harmony/api/server.py b/server_addon/harmony/harmony/ayon_harmony/api/server.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/server.py rename to server_addon/harmony/harmony/ayon_harmony/api/server.py diff --git a/client/ayon_core/hosts/harmony/api/temp.zip b/server_addon/harmony/harmony/ayon_harmony/api/temp.zip similarity index 100% rename from client/ayon_core/hosts/harmony/api/temp.zip rename to server_addon/harmony/harmony/ayon_harmony/api/temp.zip diff --git a/client/ayon_core/hosts/harmony/api/workio.py b/server_addon/harmony/harmony/ayon_harmony/api/workio.py similarity index 100% rename from client/ayon_core/hosts/harmony/api/workio.py rename to server_addon/harmony/harmony/ayon_harmony/api/workio.py diff --git a/client/ayon_core/hosts/harmony/hooks/pre_launch_args.py b/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py similarity index 100% rename from client/ayon_core/hosts/harmony/hooks/pre_launch_args.py rename to server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py diff --git a/client/ayon_core/hosts/harmony/js/.eslintrc.json b/server_addon/harmony/harmony/ayon_harmony/js/.eslintrc.json similarity index 100% rename from client/ayon_core/hosts/harmony/js/.eslintrc.json rename to server_addon/harmony/harmony/ayon_harmony/js/.eslintrc.json diff --git a/client/ayon_core/hosts/harmony/js/PypeHarmony.js b/server_addon/harmony/harmony/ayon_harmony/js/PypeHarmony.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/PypeHarmony.js rename to server_addon/harmony/harmony/ayon_harmony/js/PypeHarmony.js diff --git a/client/ayon_core/hosts/harmony/js/README.md b/server_addon/harmony/harmony/ayon_harmony/js/README.md similarity index 100% rename from client/ayon_core/hosts/harmony/js/README.md rename to server_addon/harmony/harmony/ayon_harmony/js/README.md diff --git a/client/ayon_core/hosts/harmony/js/creators/CreateRender.js b/server_addon/harmony/harmony/ayon_harmony/js/creators/CreateRender.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/creators/CreateRender.js rename to server_addon/harmony/harmony/ayon_harmony/js/creators/CreateRender.js diff --git a/client/ayon_core/hosts/harmony/js/loaders/ImageSequenceLoader.js b/server_addon/harmony/harmony/ayon_harmony/js/loaders/ImageSequenceLoader.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/loaders/ImageSequenceLoader.js rename to server_addon/harmony/harmony/ayon_harmony/js/loaders/ImageSequenceLoader.js diff --git a/client/ayon_core/hosts/harmony/js/loaders/TemplateLoader.js b/server_addon/harmony/harmony/ayon_harmony/js/loaders/TemplateLoader.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/loaders/TemplateLoader.js rename to server_addon/harmony/harmony/ayon_harmony/js/loaders/TemplateLoader.js diff --git a/client/ayon_core/hosts/harmony/js/package.json b/server_addon/harmony/harmony/ayon_harmony/js/package.json similarity index 100% rename from client/ayon_core/hosts/harmony/js/package.json rename to server_addon/harmony/harmony/ayon_harmony/js/package.json diff --git a/client/ayon_core/hosts/harmony/js/publish/CollectCurrentFile.js b/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectCurrentFile.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/publish/CollectCurrentFile.js rename to server_addon/harmony/harmony/ayon_harmony/js/publish/CollectCurrentFile.js diff --git a/client/ayon_core/hosts/harmony/js/publish/CollectFarmRender.js b/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectFarmRender.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/publish/CollectFarmRender.js rename to server_addon/harmony/harmony/ayon_harmony/js/publish/CollectFarmRender.js diff --git a/client/ayon_core/hosts/harmony/js/publish/CollectPalettes.js b/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectPalettes.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/publish/CollectPalettes.js rename to server_addon/harmony/harmony/ayon_harmony/js/publish/CollectPalettes.js diff --git a/client/ayon_core/hosts/harmony/js/publish/ExtractPalette.js b/server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractPalette.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/publish/ExtractPalette.js rename to server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractPalette.js diff --git a/client/ayon_core/hosts/harmony/js/publish/ExtractTemplate.js b/server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractTemplate.js similarity index 100% rename from client/ayon_core/hosts/harmony/js/publish/ExtractTemplate.js rename to server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractTemplate.js diff --git a/client/ayon_core/hosts/harmony/plugins/__init__.py b/server_addon/harmony/harmony/ayon_harmony/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/__init__.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/__init__.py diff --git a/client/ayon_core/hosts/harmony/plugins/create/create_farm_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/create/create_farm_render.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py diff --git a/client/ayon_core/hosts/harmony/plugins/create/create_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/create/create_render.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py diff --git a/client/ayon_core/hosts/harmony/plugins/create/create_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/create/create_template.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_audio.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_audio.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_background.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_background.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_imagesequence.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_imagesequence.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_palette.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_palette.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_template.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py diff --git a/client/ayon_core/hosts/harmony/plugins/load/load_template_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/load/load_template_workfile.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_audio.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_audio.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_audio.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_audio.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_current_file.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_current_file.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_farm_render.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_instances.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_instances.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_palettes.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_palettes.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_scene.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_scene.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/collect_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/collect_workfile.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/extract_palette.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/extract_palette.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/extract_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/extract_render.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/extract_save_scene.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/extract_save_scene.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/extract_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/extract_template.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/extract_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_workfile.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/extract_workfile.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_workfile.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/help/validate_audio.xml b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_audio.xml similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/help/validate_audio.xml rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_audio.xml diff --git a/client/ayon_core/hosts/harmony/plugins/publish/help/validate_instances.xml b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_instances.xml similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/help/validate_instances.xml rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_instances.xml diff --git a/client/ayon_core/hosts/harmony/plugins/publish/help/validate_scene_settings.xml b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_scene_settings.xml similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/help/validate_scene_settings.xml rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_scene_settings.xml diff --git a/client/ayon_core/hosts/harmony/plugins/publish/increment_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/increment_workfile.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/validate_audio.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/validate_audio.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/validate_instances.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/validate_instances.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py diff --git a/client/ayon_core/hosts/harmony/plugins/publish/validate_scene_settings.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py similarity index 100% rename from client/ayon_core/hosts/harmony/plugins/publish/validate_scene_settings.py rename to server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py diff --git a/client/ayon_core/hosts/harmony/vendor/.eslintrc.json b/server_addon/harmony/harmony/ayon_harmony/vendor/.eslintrc.json similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/.eslintrc.json rename to server_addon/harmony/harmony/ayon_harmony/vendor/.eslintrc.json diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/.gitattributes b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitattributes similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/.gitattributes rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitattributes diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/.gitignore b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitignore similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/.gitignore rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitignore diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/Install.bat b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/Install.bat similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/Install.bat rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/Install.bat diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/LICENSE b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/LICENSE similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/LICENSE rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/LICENSE diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/README.md b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/README.md similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/README.md rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/README.md diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/build_doc.bat b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/build_doc.bat similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/build_doc.bat rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/build_doc.bat diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/documentation.json b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/documentation.json similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/documentation.json rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/documentation.json diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/install.sh b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/install.sh similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/install.sh rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/install.sh diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/oH_DOM.jpg b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/oH_DOM.jpg rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony_install.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony_install.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony_tools.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/openHarmony_tools.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/package.json b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/package.json similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/package.json rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/package.json diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tbpackage.json b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tbpackage.json similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tbpackage.json rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tbpackage.json diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui diff --git a/client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js b/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js similarity index 100% rename from client/ayon_core/hosts/harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js rename to server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js From a0636eec089217c4240688dcfbd795893ea25e8b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:52:59 +0200 Subject: [PATCH 387/469] fix imports --- .../harmony/ayon_harmony/api/README.md | 22 +++++++++---------- .../ayon_harmony/api/TB_sceneOpened.js | 18 +++++++-------- .../harmony/ayon_harmony/api/launch_script.py | 2 +- .../harmony/harmony/ayon_harmony/api/lib.py | 4 ++-- .../harmony/ayon_harmony/api/pipeline.py | 6 ++--- .../harmony/ayon_harmony/api/plugin.py | 2 +- .../ayon_harmony/hooks/pre_launch_args.py | 2 +- .../plugins/create/create_farm_render.py | 4 ++-- .../plugins/create/create_render.py | 4 ++-- .../plugins/create/create_template.py | 2 +- .../ayon_harmony/plugins/load/load_audio.py | 2 +- .../plugins/load/load_background.py | 2 +- .../plugins/load/load_imagesequence.py | 2 +- .../ayon_harmony/plugins/load/load_palette.py | 2 +- .../plugins/load/load_template.py | 2 +- .../plugins/load/load_template_workfile.py | 2 +- .../plugins/publish/collect_current_file.py | 2 +- .../plugins/publish/collect_farm_render.py | 2 +- .../plugins/publish/collect_instances.py | 2 +- .../plugins/publish/collect_palettes.py | 2 +- .../plugins/publish/collect_scene.py | 2 +- .../plugins/publish/extract_palette.py | 2 +- .../plugins/publish/extract_render.py | 2 +- .../plugins/publish/extract_save_scene.py | 2 +- .../plugins/publish/extract_template.py | 2 +- .../plugins/publish/increment_workfile.py | 2 +- .../plugins/publish/validate_audio.py | 2 +- .../plugins/publish/validate_instances.py | 2 +- .../publish/validate_scene_settings.py | 2 +- 29 files changed, 52 insertions(+), 52 deletions(-) diff --git a/server_addon/harmony/harmony/ayon_harmony/api/README.md b/server_addon/harmony/harmony/ayon_harmony/api/README.md index b8d1dbc100..6666ede83c 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/README.md +++ b/server_addon/harmony/harmony/ayon_harmony/api/README.md @@ -5,7 +5,7 @@ The easiest way to setup for using Toon Boom Harmony is to use the built-in launch: ``` -python -c "import ayon_core.hosts.harmony.api as harmony;harmony.launch("path/to/harmony/executable")" +python -c "import ayon_harmony.api as harmony;harmony.launch("path/to/harmony/executable")" ``` Communication with Harmony happens with a server/client relationship where the server is in the Python process and the client is in the Harmony process. Messages between Python and Harmony are required to be dictionaries, which are serialized to strings: @@ -59,7 +59,7 @@ You can show the Workfiles app when Harmony launches by setting environment vari ### Low level messaging To send from Python to Harmony you can use the exposed method: ```python -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from uuid import uuid4 @@ -75,7 +75,7 @@ print(harmony.send({"function": func, "args": ["Python"]})["result"]) To send a function with multiple arguments its best to declare the arguments within the function: ```python -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from uuid import uuid4 signature = str(uuid4()).replace("-", "_") @@ -114,7 +114,7 @@ PypeHarmony.myAwesomeFunction = function() { Then you can call that javascript code from your Python like: ```Python -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony harmony.send({"function": "PypeHarmony.myAwesomeFunction"}); @@ -159,7 +159,7 @@ Now in python, just read all those files and send them to Harmony. ```python from pathlib import Path -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony path_to_js = Path('/path/to/my/js') script_to_send = "" @@ -178,7 +178,7 @@ harmony.send({"function": "Master.Boo.B"}) ### Scene Save Instead of sending a request to Harmony with `scene.saveAll` please use: ```python -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony harmony.save_scene() ``` @@ -195,7 +195,7 @@ These plugins were made with the [polly config](https://github.com/mindbender-st #### Creator Plugin ```python -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from uuid import uuid4 @@ -213,7 +213,7 @@ class CreateComposite(harmony.Creator): The creator plugin can be configured to use other node types. For example here is a write node creator: ```python from uuid import uuid4 -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CreateRender(harmony.Creator): @@ -244,7 +244,7 @@ class CreateRender(harmony.Creator): ```python import pyblish.api from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CollectInstances(pyblish.api.ContextPlugin): @@ -292,7 +292,7 @@ import os from uuid import uuid4 import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony import clique @@ -423,7 +423,7 @@ class ExtractImage(pyblish.api.InstancePlugin): import os from uuid import uuid4 -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony signature = str(uuid4()).replace("-", "_") copy_files = """function copyFile(srcFilename, dstFilename) diff --git a/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js b/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js index cdf60c1aa8..00858b6de1 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js +++ b/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js @@ -387,7 +387,7 @@ function start() { */ self.onCreator = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['creator'] }, false); @@ -402,7 +402,7 @@ function start() { */ self.onWorkfiles = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['workfiles'] }, false); @@ -417,7 +417,7 @@ function start() { */ self.onLoad = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['loader'] }, false); @@ -433,7 +433,7 @@ function start() { */ self.onPublish = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['publish'] }, false); @@ -449,7 +449,7 @@ function start() { */ self.onManage = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['sceneinventory'] }, false); @@ -465,7 +465,7 @@ function start() { */ self.onSubsetManage = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['subsetmanager'] }, false); @@ -482,7 +482,7 @@ function start() { self.onSetSceneSettings = function() { app.avalonClient.send( { - "module": "ayon_core.hosts.harmony.api", + "module": "ayon_harmony.api", "method": "ensure_scene_settings", "args": [] }, @@ -500,7 +500,7 @@ function start() { */ self.onExperimentalTools = function() { app.avalonClient.send({ - 'module': 'ayon_core.hosts.harmony.api.lib', + 'module': 'ayon_harmony.api.lib', 'method': 'show', 'args': ['experimental_tools'] }, false); @@ -550,7 +550,7 @@ function ensureSceneSettings() { var app = QCoreApplication.instance(); app.avalonClient.send( { - "module": "ayon_core.hosts.harmony.api", + "module": "ayon_harmony.api", "method": "ensure_scene_settings", "args": [] }, diff --git a/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py b/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py index 3c809e210f..6327682a43 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py @@ -8,7 +8,7 @@ workfile or others. import os import sys -from ayon_core.hosts.harmony.api.lib import main as host_main +from ayon_harmony.api.lib import main as host_main # Get current file to locate start point of sys.argv CURRENT_FILE = os.path.abspath(__file__) diff --git a/server_addon/harmony/harmony/ayon_harmony/api/lib.py b/server_addon/harmony/harmony/ayon_harmony/api/lib.py index f9980cb65e..900d66fa0c 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/lib.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/lib.py @@ -186,7 +186,7 @@ def launch(application_path, *args): """ from ayon_core.pipeline import install_host - from ayon_core.hosts.harmony import api as harmony + from ayon_harmony import api as harmony install_host(harmony) @@ -486,7 +486,7 @@ def imprint(node_id, data, remove=False): remove (bool): Removes the data from the scene. Example: - >>> from ayon_core.hosts.harmony.api import lib + >>> from ayon_harmony.api import lib >>> node = "Top/Display" >>> data = {"str": "something", "int": 1, "float": 0.32, "bool": True} >>> lib.imprint(layer, data) diff --git a/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py b/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py index 1e3ea0ba21..229dcf307e 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py @@ -15,11 +15,11 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.load import get_outdated_containers from ayon_core.pipeline.context_tools import get_current_folder_entity -from ayon_core.hosts.harmony import HARMONY_ADDON_ROOT -import ayon_core.hosts.harmony.api as harmony +from ayon_harmony import HARMONY_ADDON_ROOT +import ayon_harmony.api as harmony -log = logging.getLogger("ayon_core.hosts.harmony") +log = logging.getLogger("ayon_harmony") PLUGINS_DIR = os.path.join(HARMONY_ADDON_ROOT, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/server_addon/harmony/harmony/ayon_harmony/api/plugin.py b/server_addon/harmony/harmony/ayon_harmony/api/plugin.py index 29ebdb2b8d..6ec876af62 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/plugin.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/plugin.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import LegacyCreator -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class Creator(LegacyCreator): diff --git a/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py b/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py index 4d38cd09b3..2fdb5ae620 100644 --- a/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py +++ b/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py @@ -7,7 +7,7 @@ from ayon_core.lib import ( is_using_ayon_console, ) from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.harmony import get_launch_script_path +from ayon_harmony import get_launch_script_path def get_launch_kwargs(kwargs): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py index 3039d56ead..270acdd199 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create Composite node for render on farm.""" -import ayon_core.hosts.harmony.api as harmony -from ayon_core.hosts.harmony.api import plugin +import ayon_harmony.api as harmony +from ayon_harmony.api import plugin class CreateFarmRender(plugin.Creator): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py index 23e02bd8a5..d4622a3202 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create render node.""" -import ayon_core.hosts.harmony.api as harmony -from ayon_core.hosts.harmony.api import plugin +import ayon_harmony.api as harmony +from ayon_harmony.api import plugin class CreateRender(plugin.Creator): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py index c16e429436..79fd315998 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.harmony.api import plugin +from ayon_harmony.api import plugin class CreateTemplate(plugin.Creator): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py index d23f3ed034..3ba27d005f 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py @@ -2,7 +2,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony sig = harmony.signature() func = """ diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py index dad6ac2f22..7f0e5c5563 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py @@ -6,7 +6,7 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.context_tools import is_representation_from_latest -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony copy_files = """function copyFile(srcFilename, dstFilename) diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py index f81ebca9af..a1b890300c 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.context_tools import is_representation_from_latest -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class ImageSequenceLoader(load.LoaderPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py index 24f4b4e8d4..930792aacf 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class ImportPaletteLoader(load.LoaderPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py index 96dadb0375..1d183ed156 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.context_tools import is_representation_from_latest -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class TemplateLoader(load.LoaderPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py index fa5ffe5105..0967eb9a30 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py @@ -7,7 +7,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class ImportTemplateLoader(load.LoaderPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py index ebe123eacc..cfa14aaa05 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py @@ -3,7 +3,7 @@ import os import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CollectCurrentFile(pyblish.api.ContextPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py index c63eb114e5..4730821dd8 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py @@ -7,7 +7,7 @@ import attr from ayon_core.lib import get_formatted_current_time from ayon_core.pipeline import publish from ayon_core.pipeline.publish import RenderInstance -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony @attr.s diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py index 5aad7d4751..a98ee3e98b 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py @@ -3,7 +3,7 @@ import json import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CollectInstances(pyblish.api.ContextPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py index 9e0b500663..818d9afc8a 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py @@ -4,7 +4,7 @@ import json import re import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CollectPalettes(pyblish.api.ContextPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py index bc2ccca1be..48f8aa0d3b 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py @@ -3,7 +3,7 @@ import os import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class CollectScene(pyblish.api.ContextPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py index 9f12c78d9f..ad1d38e862 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py @@ -5,7 +5,7 @@ import csv from PIL import Image, ImageDraw, ImageFont -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from ayon_core.pipeline import publish diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py index 391661a118..407a44c81a 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py @@ -3,7 +3,7 @@ import tempfile import subprocess import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony import ayon_core.lib import clique diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py index 1be74ba3a4..77ebc5b5a6 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class ExtractSaveScene(pyblish.api.ContextPlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py index b2c7fa8174..650765771c 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py @@ -4,7 +4,7 @@ import os import shutil from ayon_core.pipeline import publish -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class ExtractTemplate(publish.Extractor): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py index 16332a5283..fa43455b0d 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline.publish import get_errored_plugins_from_context from ayon_core.lib import version_up -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony class IncrementWorkfile(pyblish.api.InstancePlugin): diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py index 808734a061..f2c1cfc9b4 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py @@ -2,7 +2,7 @@ import os import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from ayon_core.pipeline import PublishXmlValidationError diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py index 1200f6266b..8152aeeadf 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py @@ -1,6 +1,6 @@ import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from ayon_core.pipeline import get_current_folder_path from ayon_core.pipeline.publish import ( ValidateContentsOrder, diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py index dc3db3b544..3a4847d9fe 100644 --- a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py +++ b/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py @@ -6,7 +6,7 @@ import re import pyblish.api -import ayon_core.hosts.harmony.api as harmony +import ayon_harmony.api as harmony from ayon_core.pipeline import PublishXmlValidationError From 931b09cdcca8e0b17c781c16171e9bad4b5c66a3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:53:20 +0200 Subject: [PATCH 388/469] change stdout broker import --- .../ayon_core/tools/stdout_broker/__init__.py | 5 + client/ayon_core/tools/stdout_broker/app.py | 181 +----------------- .../ayon_core/tools/stdout_broker/broker.py | 174 +++++++++++++++++ .../harmony/harmony/ayon_harmony/api/lib.py | 2 +- 4 files changed, 190 insertions(+), 172 deletions(-) create mode 100644 client/ayon_core/tools/stdout_broker/broker.py diff --git a/client/ayon_core/tools/stdout_broker/__init__.py b/client/ayon_core/tools/stdout_broker/__init__.py index e69de29bb2..e104c60573 100644 --- a/client/ayon_core/tools/stdout_broker/__init__.py +++ b/client/ayon_core/tools/stdout_broker/__init__.py @@ -0,0 +1,5 @@ +from .broker import StdOutBroker + +__all__ = ( + "StdOutBroker", +) diff --git a/client/ayon_core/tools/stdout_broker/app.py b/client/ayon_core/tools/stdout_broker/app.py index 15447b608b..ae73db1bb9 100644 --- a/client/ayon_core/tools/stdout_broker/app.py +++ b/client/ayon_core/tools/stdout_broker/app.py @@ -1,173 +1,12 @@ -import os -import sys -import threading -import collections -import websocket -import json -from datetime import datetime +import warnings +from .broker import StdOutBroker -from ayon_core.lib import Logger -from openpype_modules.webserver.host_console_listener import MsgAction +warnings.warn( + ( + "Import of 'StdOutBroker' from 'ayon_core.tools.stdout_broker.app'" + " is deprecated. Please use 'ayon_core.tools.stdout_broker' instead." + ), + DeprecationWarning +) -log = Logger.get_logger(__name__) - - -class StdOutBroker: - """ - Application showing console in Services tray for non python hosts - instead of cmd window. - """ - MAX_LINES = 10000 - TIMER_TIMEOUT = 0.200 - - def __init__(self, host_name): - self.host_name = host_name - self.webserver_client = None - - self.original_stdout_write = None - self.original_stderr_write = None - self.log_queue = collections.deque() - - date_str = datetime.now().strftime("%d%m%Y%H%M%S") - self.host_id = "{}_{}".format(self.host_name, date_str) - - self._std_available = False - self._is_running = False - self._catch_std_outputs() - - self._timer = None - - @property - def send_to_tray(self): - """Checks if connected to tray and have access to logs.""" - return self.webserver_client and self._std_available - - def start(self): - """Start app, create and start timer""" - if not self._std_available or self._is_running: - return - self._is_running = True - self._create_timer() - self._connect_to_tray() - - def stop(self): - """Disconnect from Tray, process last logs""" - if not self._is_running: - return - self._is_running = False - self._process_queue() - self._disconnect_from_tray() - - def host_connected(self): - """Send to Tray console that host is ready - icon change. """ - log.info("Host {} connected".format(self.host_id)) - - payload = { - "host": self.host_id, - "action": MsgAction.INITIALIZED, - "text": "Integration with {}".format( - str.capitalize(self.host_name)) - } - self._send(payload) - - def _create_timer(self): - timer = threading.Timer(self.TIMER_TIMEOUT, self._timer_callback) - timer.start() - self._timer = timer - - def _timer_callback(self): - if not self._is_running: - return - self._process_queue() - self._create_timer() - - def _connect_to_tray(self): - """Connect to Tray webserver to pass console output. """ - if not self._std_available: # not content to log - return - ws = websocket.WebSocket() - webserver_url = os.environ.get("AYON_WEBSERVER_URL") - - if not webserver_url: - print("Unknown webserver url, cannot connect to pass log") - return - - webserver_url = webserver_url.replace("http", "ws") - ws.connect("{}/ws/host_listener".format(webserver_url)) - self.webserver_client = ws - - payload = { - "host": self.host_id, - "action": MsgAction.CONNECTING, - "text": "Integration with {}".format( - str.capitalize(self.host_name)) - } - self._send(payload) - - def _disconnect_from_tray(self): - """Send to Tray that host is closing - remove from Services. """ - print("Host {} closing".format(self.host_name)) - if not self.webserver_client: - return - - payload = { - "host": self.host_id, - "action": MsgAction.CLOSE, - "text": "Integration with {}".format( - str.capitalize(self.host_name)) - } - - self._send(payload) - self.webserver_client.close() - - def _catch_std_outputs(self): - """Redirects standard out and error to own functions""" - if sys.stdout: - self.original_stdout_write = sys.stdout.write - sys.stdout.write = self._my_stdout_write - self._std_available = True - - if sys.stderr: - self.original_stderr_write = sys.stderr.write - sys.stderr.write = self._my_stderr_write - self._std_available = True - - def _my_stdout_write(self, text): - """Appends outputted text to queue, keep writing to original stdout""" - if self.original_stdout_write is not None: - self.original_stdout_write(text) - if self.send_to_tray: - self.log_queue.append(text) - - def _my_stderr_write(self, text): - """Appends outputted text to queue, keep writing to original stderr""" - if self.original_stderr_write is not None: - self.original_stderr_write(text) - if self.send_to_tray: - self.log_queue.append(text) - - def _process_queue(self): - """Sends lines and purges queue""" - if not self.send_to_tray: - return - - lines = tuple(self.log_queue) - self.log_queue.clear() - if lines: - payload = { - "host": self.host_id, - "action": MsgAction.ADD, - "text": "\n".join(lines) - } - - self._send(payload) - - def _send(self, payload): - """Worker method to send to existing websocket connection.""" - if not self.send_to_tray: - return - - try: - self.webserver_client.send(json.dumps(payload)) - except ConnectionResetError: # Tray closed - self._connect_to_tray() +__all__ = ("StdOutBroker", ) diff --git a/client/ayon_core/tools/stdout_broker/broker.py b/client/ayon_core/tools/stdout_broker/broker.py new file mode 100644 index 0000000000..e31eb0057e --- /dev/null +++ b/client/ayon_core/tools/stdout_broker/broker.py @@ -0,0 +1,174 @@ +import os +import sys +import threading +import collections +import json +from datetime import datetime + +import websocket + +from ayon_core.lib import Logger +from ayon_core.modules.webserver.host_console_listener import MsgAction + +log = Logger.get_logger(__name__) + + +class StdOutBroker: + """ + Application showing console in Services tray for non python hosts + instead of cmd window. + """ + MAX_LINES = 10000 + TIMER_TIMEOUT = 0.200 + + def __init__(self, host_name): + self.host_name = host_name + self.webserver_client = None + + self.original_stdout_write = None + self.original_stderr_write = None + self.log_queue = collections.deque() + + date_str = datetime.now().strftime("%d%m%Y%H%M%S") + self.host_id = "{}_{}".format(self.host_name, date_str) + + self._std_available = False + self._is_running = False + self._catch_std_outputs() + + self._timer = None + + @property + def send_to_tray(self): + """Checks if connected to tray and have access to logs.""" + return self.webserver_client and self._std_available + + def start(self): + """Start app, create and start timer""" + if not self._std_available or self._is_running: + return + self._is_running = True + self._create_timer() + self._connect_to_tray() + + def stop(self): + """Disconnect from Tray, process last logs""" + if not self._is_running: + return + self._is_running = False + self._process_queue() + self._disconnect_from_tray() + + def host_connected(self): + """Send to Tray console that host is ready - icon change. """ + log.info("Host {} connected".format(self.host_id)) + + payload = { + "host": self.host_id, + "action": MsgAction.INITIALIZED, + "text": "Integration with {}".format( + str.capitalize(self.host_name)) + } + self._send(payload) + + def _create_timer(self): + timer = threading.Timer(self.TIMER_TIMEOUT, self._timer_callback) + timer.start() + self._timer = timer + + def _timer_callback(self): + if not self._is_running: + return + self._process_queue() + self._create_timer() + + def _connect_to_tray(self): + """Connect to Tray webserver to pass console output. """ + if not self._std_available: # not content to log + return + ws = websocket.WebSocket() + webserver_url = os.environ.get("AYON_WEBSERVER_URL") + + if not webserver_url: + print("Unknown webserver url, cannot connect to pass log") + return + + webserver_url = webserver_url.replace("http", "ws") + ws.connect("{}/ws/host_listener".format(webserver_url)) + self.webserver_client = ws + + payload = { + "host": self.host_id, + "action": MsgAction.CONNECTING, + "text": "Integration with {}".format( + str.capitalize(self.host_name)) + } + self._send(payload) + + def _disconnect_from_tray(self): + """Send to Tray that host is closing - remove from Services. """ + print("Host {} closing".format(self.host_name)) + if not self.webserver_client: + return + + payload = { + "host": self.host_id, + "action": MsgAction.CLOSE, + "text": "Integration with {}".format( + str.capitalize(self.host_name)) + } + + self._send(payload) + self.webserver_client.close() + + def _catch_std_outputs(self): + """Redirects standard out and error to own functions""" + if sys.stdout: + self.original_stdout_write = sys.stdout.write + sys.stdout.write = self._my_stdout_write + self._std_available = True + + if sys.stderr: + self.original_stderr_write = sys.stderr.write + sys.stderr.write = self._my_stderr_write + self._std_available = True + + def _my_stdout_write(self, text): + """Appends outputted text to queue, keep writing to original stdout""" + if self.original_stdout_write is not None: + self.original_stdout_write(text) + if self.send_to_tray: + self.log_queue.append(text) + + def _my_stderr_write(self, text): + """Appends outputted text to queue, keep writing to original stderr""" + if self.original_stderr_write is not None: + self.original_stderr_write(text) + if self.send_to_tray: + self.log_queue.append(text) + + def _process_queue(self): + """Sends lines and purges queue""" + if not self.send_to_tray: + return + + lines = tuple(self.log_queue) + self.log_queue.clear() + if lines: + payload = { + "host": self.host_id, + "action": MsgAction.ADD, + "text": "\n".join(lines) + } + + self._send(payload) + + def _send(self, payload): + """Worker method to send to existing websocket connection.""" + if not self.send_to_tray: + return + + try: + self.webserver_client.send(json.dumps(payload)) + except ConnectionResetError: # Tray closed + self._connect_to_tray() diff --git a/server_addon/harmony/harmony/ayon_harmony/api/lib.py b/server_addon/harmony/harmony/ayon_harmony/api/lib.py index 900d66fa0c..46a5318430 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/lib.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/lib.py @@ -20,7 +20,7 @@ import collections from qtpy import QtWidgets, QtCore, QtGui from ayon_core.lib import is_using_ayon_console -from ayon_core.tools.stdout_broker.app import StdOutBroker +from ayon_core.tools.stdout_broker import StdOutBroker from ayon_core.tools.utils import host_tools from ayon_core import style From 9a3bcec6732ac8ed8c837e16b4822aeb99e405c6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:55:39 +0200 Subject: [PATCH 389/469] added TODO --- server_addon/harmony/harmony/ayon_harmony/api/server.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server_addon/harmony/harmony/ayon_harmony/api/server.py b/server_addon/harmony/harmony/ayon_harmony/api/server.py index 04048e5c84..7e1e36c2ed 100644 --- a/server_addon/harmony/harmony/ayon_harmony/api/server.py +++ b/server_addon/harmony/harmony/ayon_harmony/api/server.py @@ -69,6 +69,8 @@ class Server(threading.Thread): self.log.debug( f"[{self.timestamp()}] Processing request:\n{pretty}") + # TODO javascript should not define which module is imported and + # which function is called. It should send predefined requests. try: module = importlib.import_module(request["module"]) method = getattr(module, request["method"]) From dcb85b0ac19a8b2725955686191fea7777c68a77 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:59:48 +0200 Subject: [PATCH 390/469] added more information to package.py --- server_addon/harmony/package.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server_addon/harmony/package.py b/server_addon/harmony/package.py index 00824cedef..af0006ec3b 100644 --- a/server_addon/harmony/package.py +++ b/server_addon/harmony/package.py @@ -1,3 +1,9 @@ name = "harmony" title = "Harmony" -version = "0.1.3" +version = "0.2.0" +client_dir = "ayon_harmony" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 9afb14d02d58caee83d3f0c4e0c237084dc6497d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 12:59:56 +0200 Subject: [PATCH 391/469] added version to client addon --- server_addon/harmony/harmony/ayon_harmony/__init__.py | 3 +++ server_addon/harmony/harmony/ayon_harmony/addon.py | 3 +++ server_addon/harmony/harmony/ayon_harmony/version.py | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 server_addon/harmony/harmony/ayon_harmony/version.py diff --git a/server_addon/harmony/harmony/ayon_harmony/__init__.py b/server_addon/harmony/harmony/ayon_harmony/__init__.py index 6454d6f9d7..425439a603 100644 --- a/server_addon/harmony/harmony/ayon_harmony/__init__.py +++ b/server_addon/harmony/harmony/ayon_harmony/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( HARMONY_ADDON_ROOT, HarmonyAddon, @@ -6,6 +7,8 @@ from .addon import ( __all__ = ( + "__version__", + "HARMONY_ADDON_ROOT", "HarmonyAddon", "get_launch_script_path", diff --git a/server_addon/harmony/harmony/ayon_harmony/addon.py b/server_addon/harmony/harmony/ayon_harmony/addon.py index 1915a7eb6f..ef96cf03f7 100644 --- a/server_addon/harmony/harmony/ayon_harmony/addon.py +++ b/server_addon/harmony/harmony/ayon_harmony/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + HARMONY_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class HarmonyAddon(AYONAddon, IHostAddon): name = "harmony" + version = __version__ host_name = "harmony" def add_implementation_envs(self, env, _app): diff --git a/server_addon/harmony/harmony/ayon_harmony/version.py b/server_addon/harmony/harmony/ayon_harmony/version.py new file mode 100644 index 0000000000..e2a19655e2 --- /dev/null +++ b/server_addon/harmony/harmony/ayon_harmony/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'harmony' version.""" +__version__ = "0.2.0" From 140b370b21ca811cc06340ada776223ea53f852a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 13:00:32 +0200 Subject: [PATCH 392/469] rename 'harmoy' to 'client' --- .../{harmony => client}/ayon_harmony/__init__.py | 0 .../{harmony => client}/ayon_harmony/addon.py | 0 .../{harmony => client}/ayon_harmony/api/README.md | 0 .../ayon_harmony/api/TB_sceneOpened.js | 0 .../ayon_harmony/api/__init__.py | 0 .../ayon_harmony/api/js/.eslintrc.json | 0 .../ayon_harmony/api/js/AvalonHarmony.js | 0 .../ayon_harmony/api/js/package.json | 0 .../ayon_harmony/api/launch_script.py | 0 .../{harmony => client}/ayon_harmony/api/lib.py | 0 .../ayon_harmony/api/pipeline.py | 0 .../{harmony => client}/ayon_harmony/api/plugin.py | 0 .../{harmony => client}/ayon_harmony/api/server.py | 0 .../{harmony => client}/ayon_harmony/api/temp.zip | Bin .../{harmony => client}/ayon_harmony/api/workio.py | 0 .../ayon_harmony/hooks/pre_launch_args.py | 0 .../ayon_harmony/js/.eslintrc.json | 0 .../ayon_harmony/js/PypeHarmony.js | 0 .../{harmony => client}/ayon_harmony/js/README.md | 0 .../ayon_harmony/js/creators/CreateRender.js | 0 .../ayon_harmony/js/loaders/ImageSequenceLoader.js | 0 .../ayon_harmony/js/loaders/TemplateLoader.js | 0 .../ayon_harmony/js/package.json | 0 .../ayon_harmony/js/publish/CollectCurrentFile.js | 0 .../ayon_harmony/js/publish/CollectFarmRender.js | 0 .../ayon_harmony/js/publish/CollectPalettes.js | 0 .../ayon_harmony/js/publish/ExtractPalette.js | 0 .../ayon_harmony/js/publish/ExtractTemplate.js | 0 .../ayon_harmony/plugins/__init__.py | 0 .../plugins/create/create_farm_render.py | 0 .../ayon_harmony/plugins/create/create_render.py | 0 .../ayon_harmony/plugins/create/create_template.py | 0 .../ayon_harmony/plugins/load/load_audio.py | 0 .../ayon_harmony/plugins/load/load_background.py | 0 .../ayon_harmony/plugins/load/load_imagesequence.py | 0 .../ayon_harmony/plugins/load/load_palette.py | 0 .../ayon_harmony/plugins/load/load_template.py | 0 .../plugins/load/load_template_workfile.py | 0 .../ayon_harmony/plugins/publish/collect_audio.py | 0 .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_farm_render.py | 0 .../plugins/publish/collect_instances.py | 0 .../plugins/publish/collect_palettes.py | 0 .../ayon_harmony/plugins/publish/collect_scene.py | 0 .../plugins/publish/collect_workfile.py | 0 .../ayon_harmony/plugins/publish/extract_palette.py | 0 .../ayon_harmony/plugins/publish/extract_render.py | 0 .../plugins/publish/extract_save_scene.py | 0 .../plugins/publish/extract_template.py | 0 .../plugins/publish/extract_workfile.py | 0 .../plugins/publish/help/validate_audio.xml | 0 .../plugins/publish/help/validate_instances.xml | 0 .../publish/help/validate_scene_settings.xml | 0 .../plugins/publish/increment_workfile.py | 0 .../ayon_harmony/plugins/publish/validate_audio.py | 0 .../plugins/publish/validate_instances.py | 0 .../plugins/publish/validate_scene_settings.py | 0 .../ayon_harmony/vendor/.eslintrc.json | 0 .../ayon_harmony/vendor/OpenHarmony/.gitattributes | 0 .../ayon_harmony/vendor/OpenHarmony/.gitignore | 0 .../ayon_harmony/vendor/OpenHarmony/Install.bat | 0 .../ayon_harmony/vendor/OpenHarmony/LICENSE | 0 .../ayon_harmony/vendor/OpenHarmony/README.md | 0 .../ayon_harmony/vendor/OpenHarmony/build_doc.bat | 0 .../vendor/OpenHarmony/documentation.json | 0 .../ayon_harmony/vendor/OpenHarmony/install.sh | 0 .../ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg | Bin .../ayon_harmony/vendor/OpenHarmony/openHarmony.js | 0 .../OpenHarmony/openHarmony/openHarmony_actions.js | 0 .../openHarmony/openHarmony_application.js | 0 .../openHarmony/openHarmony_attribute.js | 0 .../OpenHarmony/openHarmony/openHarmony_backdrop.js | 0 .../OpenHarmony/openHarmony/openHarmony_color.js | 0 .../OpenHarmony/openHarmony/openHarmony_column.js | 0 .../OpenHarmony/openHarmony/openHarmony_database.js | 0 .../OpenHarmony/openHarmony/openHarmony_dialog.js | 0 .../OpenHarmony/openHarmony/openHarmony_drawing.js | 0 .../OpenHarmony/openHarmony/openHarmony_element.js | 0 .../OpenHarmony/openHarmony/openHarmony_file.js | 0 .../OpenHarmony/openHarmony/openHarmony_frame.js | 0 .../OpenHarmony/openHarmony/openHarmony_list.js | 0 .../OpenHarmony/openHarmony/openHarmony_math.js | 0 .../OpenHarmony/openHarmony/openHarmony_metadata.js | 0 .../OpenHarmony/openHarmony/openHarmony_misc.js | 0 .../OpenHarmony/openHarmony/openHarmony_network.js | 0 .../OpenHarmony/openHarmony/openHarmony_node.js | 0 .../openHarmony/openHarmony_nodeAttributes.js | 0 .../OpenHarmony/openHarmony/openHarmony_nodeLink.js | 0 .../OpenHarmony/openHarmony/openHarmony_palette.js | 0 .../OpenHarmony/openHarmony/openHarmony_path.js | 0 .../openHarmony/openHarmony_preferencedoc.js | 0 .../openHarmony/openHarmony_preferences.js | 0 .../OpenHarmony/openHarmony/openHarmony_scene.js | 0 .../openHarmony/openHarmony_threading.js | 0 .../OpenHarmony/openHarmony/openHarmony_timeline.js | 0 .../OpenHarmony/openHarmony/openHarmony_tool.js | 0 .../openHarmony/openHarmony_toolInstall.ui | 0 .../vendor/OpenHarmony/openHarmony_install.js | 0 .../vendor/OpenHarmony/openHarmony_tools.js | 0 .../ayon_harmony/vendor/OpenHarmony/package.json | 0 .../Reference_view_currentToolManager().txt | 0 .../ayon_harmony/vendor/OpenHarmony/tbpackage.json | 0 .../OpenHarmony/tools/OpenHarmony_basic/INSTALL | 0 .../OpenHarmony/tools/OpenHarmony_basic/README | 0 .../OpenHarmony_basic/openHarmony_anim_tools.js | 0 .../openHarmony_basic_backdropPicker.ui | 0 .../OpenHarmony_basic/openHarmony_rigging_tools.js | 0 .../{harmony => client}/ayon_harmony/version.py | 0 108 files changed, 0 insertions(+), 0 deletions(-) rename server_addon/harmony/{harmony => client}/ayon_harmony/__init__.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/addon.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/README.md (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/TB_sceneOpened.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/__init__.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/js/.eslintrc.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/js/AvalonHarmony.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/js/package.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/launch_script.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/lib.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/pipeline.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/plugin.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/server.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/temp.zip (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/api/workio.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/hooks/pre_launch_args.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/.eslintrc.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/PypeHarmony.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/README.md (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/creators/CreateRender.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/loaders/ImageSequenceLoader.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/loaders/TemplateLoader.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/package.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/publish/CollectCurrentFile.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/publish/CollectFarmRender.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/publish/CollectPalettes.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/publish/ExtractPalette.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/js/publish/ExtractTemplate.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/__init__.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/create/create_farm_render.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/create/create_render.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/create/create_template.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_audio.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_background.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_imagesequence.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_palette.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_template.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/load/load_template_workfile.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_audio.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_current_file.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_farm_render.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_instances.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_palettes.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_scene.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/collect_workfile.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/extract_palette.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/extract_render.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/extract_save_scene.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/extract_template.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/extract_workfile.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/help/validate_audio.xml (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/help/validate_instances.xml (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/help/validate_scene_settings.xml (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/increment_workfile.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/validate_audio.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/validate_instances.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/plugins/publish/validate_scene_settings.py (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/.eslintrc.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/.gitattributes (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/.gitignore (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/Install.bat (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/LICENSE (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/README.md (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/build_doc.bat (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/documentation.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/install.sh (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/package.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tbpackage.json (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js (100%) rename server_addon/harmony/{harmony => client}/ayon_harmony/version.py (100%) diff --git a/server_addon/harmony/harmony/ayon_harmony/__init__.py b/server_addon/harmony/client/ayon_harmony/__init__.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/__init__.py rename to server_addon/harmony/client/ayon_harmony/__init__.py diff --git a/server_addon/harmony/harmony/ayon_harmony/addon.py b/server_addon/harmony/client/ayon_harmony/addon.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/addon.py rename to server_addon/harmony/client/ayon_harmony/addon.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/README.md b/server_addon/harmony/client/ayon_harmony/api/README.md similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/README.md rename to server_addon/harmony/client/ayon_harmony/api/README.md diff --git a/server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js b/server_addon/harmony/client/ayon_harmony/api/TB_sceneOpened.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/TB_sceneOpened.js rename to server_addon/harmony/client/ayon_harmony/api/TB_sceneOpened.js diff --git a/server_addon/harmony/harmony/ayon_harmony/api/__init__.py b/server_addon/harmony/client/ayon_harmony/api/__init__.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/__init__.py rename to server_addon/harmony/client/ayon_harmony/api/__init__.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/js/.eslintrc.json b/server_addon/harmony/client/ayon_harmony/api/js/.eslintrc.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/js/.eslintrc.json rename to server_addon/harmony/client/ayon_harmony/api/js/.eslintrc.json diff --git a/server_addon/harmony/harmony/ayon_harmony/api/js/AvalonHarmony.js b/server_addon/harmony/client/ayon_harmony/api/js/AvalonHarmony.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/js/AvalonHarmony.js rename to server_addon/harmony/client/ayon_harmony/api/js/AvalonHarmony.js diff --git a/server_addon/harmony/harmony/ayon_harmony/api/js/package.json b/server_addon/harmony/client/ayon_harmony/api/js/package.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/js/package.json rename to server_addon/harmony/client/ayon_harmony/api/js/package.json diff --git a/server_addon/harmony/harmony/ayon_harmony/api/launch_script.py b/server_addon/harmony/client/ayon_harmony/api/launch_script.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/launch_script.py rename to server_addon/harmony/client/ayon_harmony/api/launch_script.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/lib.py b/server_addon/harmony/client/ayon_harmony/api/lib.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/lib.py rename to server_addon/harmony/client/ayon_harmony/api/lib.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/pipeline.py b/server_addon/harmony/client/ayon_harmony/api/pipeline.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/pipeline.py rename to server_addon/harmony/client/ayon_harmony/api/pipeline.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/plugin.py b/server_addon/harmony/client/ayon_harmony/api/plugin.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/plugin.py rename to server_addon/harmony/client/ayon_harmony/api/plugin.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/server.py b/server_addon/harmony/client/ayon_harmony/api/server.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/server.py rename to server_addon/harmony/client/ayon_harmony/api/server.py diff --git a/server_addon/harmony/harmony/ayon_harmony/api/temp.zip b/server_addon/harmony/client/ayon_harmony/api/temp.zip similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/temp.zip rename to server_addon/harmony/client/ayon_harmony/api/temp.zip diff --git a/server_addon/harmony/harmony/ayon_harmony/api/workio.py b/server_addon/harmony/client/ayon_harmony/api/workio.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/api/workio.py rename to server_addon/harmony/client/ayon_harmony/api/workio.py diff --git a/server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py b/server_addon/harmony/client/ayon_harmony/hooks/pre_launch_args.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/hooks/pre_launch_args.py rename to server_addon/harmony/client/ayon_harmony/hooks/pre_launch_args.py diff --git a/server_addon/harmony/harmony/ayon_harmony/js/.eslintrc.json b/server_addon/harmony/client/ayon_harmony/js/.eslintrc.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/.eslintrc.json rename to server_addon/harmony/client/ayon_harmony/js/.eslintrc.json diff --git a/server_addon/harmony/harmony/ayon_harmony/js/PypeHarmony.js b/server_addon/harmony/client/ayon_harmony/js/PypeHarmony.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/PypeHarmony.js rename to server_addon/harmony/client/ayon_harmony/js/PypeHarmony.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/README.md b/server_addon/harmony/client/ayon_harmony/js/README.md similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/README.md rename to server_addon/harmony/client/ayon_harmony/js/README.md diff --git a/server_addon/harmony/harmony/ayon_harmony/js/creators/CreateRender.js b/server_addon/harmony/client/ayon_harmony/js/creators/CreateRender.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/creators/CreateRender.js rename to server_addon/harmony/client/ayon_harmony/js/creators/CreateRender.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/loaders/ImageSequenceLoader.js b/server_addon/harmony/client/ayon_harmony/js/loaders/ImageSequenceLoader.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/loaders/ImageSequenceLoader.js rename to server_addon/harmony/client/ayon_harmony/js/loaders/ImageSequenceLoader.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/loaders/TemplateLoader.js b/server_addon/harmony/client/ayon_harmony/js/loaders/TemplateLoader.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/loaders/TemplateLoader.js rename to server_addon/harmony/client/ayon_harmony/js/loaders/TemplateLoader.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/package.json b/server_addon/harmony/client/ayon_harmony/js/package.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/package.json rename to server_addon/harmony/client/ayon_harmony/js/package.json diff --git a/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectCurrentFile.js b/server_addon/harmony/client/ayon_harmony/js/publish/CollectCurrentFile.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/publish/CollectCurrentFile.js rename to server_addon/harmony/client/ayon_harmony/js/publish/CollectCurrentFile.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectFarmRender.js b/server_addon/harmony/client/ayon_harmony/js/publish/CollectFarmRender.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/publish/CollectFarmRender.js rename to server_addon/harmony/client/ayon_harmony/js/publish/CollectFarmRender.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/publish/CollectPalettes.js b/server_addon/harmony/client/ayon_harmony/js/publish/CollectPalettes.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/publish/CollectPalettes.js rename to server_addon/harmony/client/ayon_harmony/js/publish/CollectPalettes.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractPalette.js b/server_addon/harmony/client/ayon_harmony/js/publish/ExtractPalette.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractPalette.js rename to server_addon/harmony/client/ayon_harmony/js/publish/ExtractPalette.js diff --git a/server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractTemplate.js b/server_addon/harmony/client/ayon_harmony/js/publish/ExtractTemplate.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/js/publish/ExtractTemplate.js rename to server_addon/harmony/client/ayon_harmony/js/publish/ExtractTemplate.js diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/__init__.py b/server_addon/harmony/client/ayon_harmony/plugins/__init__.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/__init__.py rename to server_addon/harmony/client/ayon_harmony/plugins/__init__.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py b/server_addon/harmony/client/ayon_harmony/plugins/create/create_farm_render.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/create/create_farm_render.py rename to server_addon/harmony/client/ayon_harmony/plugins/create/create_farm_render.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py b/server_addon/harmony/client/ayon_harmony/plugins/create/create_render.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/create/create_render.py rename to server_addon/harmony/client/ayon_harmony/plugins/create/create_render.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py b/server_addon/harmony/client/ayon_harmony/plugins/create/create_template.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/create/create_template.py rename to server_addon/harmony/client/ayon_harmony/plugins/create/create_template.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_audio.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_audio.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_audio.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_background.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_background.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_background.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_imagesequence.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_palette.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_palette.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_palette.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_template.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_template.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_template_workfile.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/load/load_template_workfile.py rename to server_addon/harmony/client/ayon_harmony/plugins/load/load_template_workfile.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_audio.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_audio.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_audio.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_audio.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_current_file.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_current_file.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_current_file.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_farm_render.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_farm_render.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_farm_render.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_instances.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_instances.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_instances.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_palettes.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_scene.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_scene.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_scene.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_workfile.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_workfile.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/collect_workfile.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/collect_workfile.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/extract_palette.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_palette.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/extract_palette.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/extract_render.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_render.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/extract_render.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/extract_save_scene.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_save_scene.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/extract_save_scene.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/extract_template.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_template.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/extract_template.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_workfile.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/extract_workfile.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/extract_workfile.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/extract_workfile.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_audio.xml b/server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_audio.xml similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_audio.xml rename to server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_audio.xml diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_instances.xml b/server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_instances.xml similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_instances.xml rename to server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_instances.xml diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_scene_settings.xml b/server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_scene_settings.xml similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/help/validate_scene_settings.xml rename to server_addon/harmony/client/ayon_harmony/plugins/publish/help/validate_scene_settings.xml diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/increment_workfile.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/increment_workfile.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/increment_workfile.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_audio.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_instances.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_instances.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/validate_instances.py diff --git a/server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/plugins/publish/validate_scene_settings.py rename to server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/.eslintrc.json b/server_addon/harmony/client/ayon_harmony/vendor/.eslintrc.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/.eslintrc.json rename to server_addon/harmony/client/ayon_harmony/vendor/.eslintrc.json diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitattributes b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/.gitattributes similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitattributes rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/.gitattributes diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitignore b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/.gitignore similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/.gitignore rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/.gitignore diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/Install.bat b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/Install.bat similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/Install.bat rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/Install.bat diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/LICENSE b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/LICENSE similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/LICENSE rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/LICENSE diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/README.md b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/README.md similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/README.md rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/README.md diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/build_doc.bat b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/build_doc.bat similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/build_doc.bat rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/build_doc.bat diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/documentation.json b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/documentation.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/documentation.json rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/documentation.json diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/install.sh b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/install.sh similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/install.sh rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/install.sh diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/oH_DOM.jpg diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_actions.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_application.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_attribute.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_backdrop.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_color.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_column.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_database.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_dialog.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_drawing.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_element.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_file.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_frame.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_list.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_math.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_metadata.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_misc.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_network.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_node.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeAttributes.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_nodeLink.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_palette.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_path.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferencedoc.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_preferences.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_scene.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_threading.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_timeline.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_tool.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony/openHarmony_toolInstall.ui diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony_install.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/openHarmony_tools.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/package.json b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/package.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/package.json rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/package.json diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/reference/Reference_view_currentToolManager().txt diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tbpackage.json b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tbpackage.json similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tbpackage.json rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tbpackage.json diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/INSTALL diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/README diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_anim_tools.js diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_basic_backdropPicker.ui diff --git a/server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js b/server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js rename to server_addon/harmony/client/ayon_harmony/vendor/OpenHarmony/tools/OpenHarmony_basic/openHarmony_rigging_tools.js diff --git a/server_addon/harmony/harmony/ayon_harmony/version.py b/server_addon/harmony/client/ayon_harmony/version.py similarity index 100% rename from server_addon/harmony/harmony/ayon_harmony/version.py rename to server_addon/harmony/client/ayon_harmony/version.py From 3f3ab62b0a53cba82b19d9f0e3aa96c877e2d354 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 13:03:45 +0200 Subject: [PATCH 393/469] add settings category --- .../client/ayon_harmony/plugins/publish/collect_palettes.py | 2 ++ .../client/ayon_harmony/plugins/publish/validate_audio.py | 1 + .../ayon_harmony/plugins/publish/validate_scene_settings.py | 1 + 3 files changed, 4 insertions(+) diff --git a/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py index 818d9afc8a..fb40196510 100644 --- a/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py +++ b/server_addon/harmony/client/ayon_harmony/plugins/publish/collect_palettes.py @@ -14,6 +14,8 @@ class CollectPalettes(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder + 0.003 hosts = ["harmony"] + settings_category = "harmony" + # list of regexes for task names where collecting should happen allowed_tasks = [] diff --git a/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py index f2c1cfc9b4..6caa12c1e1 100644 --- a/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py +++ b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_audio.py @@ -18,6 +18,7 @@ class ValidateAudio(pyblish.api.InstancePlugin): label = "Validate Audio" families = ["render"] hosts = ["harmony"] + settings_category = "harmony" optional = True def process(self, instance): diff --git a/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py index 3a4847d9fe..082eb4f1dd 100644 --- a/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py +++ b/server_addon/harmony/client/ayon_harmony/plugins/publish/validate_scene_settings.py @@ -42,6 +42,7 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin): families = ["workfile"] hosts = ["harmony"] actions = [ValidateSceneSettingsRepair] + settings_category = "harmony" optional = True # skip frameEnd check if asset contains any of: From 770658dd3a32dcc66a6353e1b15efca2e7c2689c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 13:37:22 +0200 Subject: [PATCH 394/469] added harmony milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d60da05f44..203d135faa 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -54,6 +54,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), + "harmony": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), From 4b593e9273176255395b68d71cfd6373b9410d30 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 30 May 2024 19:54:22 +0800 Subject: [PATCH 395/469] Update server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py --- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 0bf451f0e2..b100e4189d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -16,7 +16,7 @@ import substance_painter.project class CreateWorkfile(AutoCreator): """Workfile auto-creator.""" - identifier = "io.ayon.creators.substancepainter.workfile" + identifier = "io.openpype.creators.substancepainter.workfile" label = "Workfile" product_type = "workfile" icon = "document" From 7259bd2f1deeaaaeab42581ad3d3f5a4ae61a7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 30 May 2024 14:12:21 +0200 Subject: [PATCH 396/469] :art: add settings category to plugin base class --- .../maya/client/ayon_maya/api/plugin.py | 59 ++++++++++++++----- .../plugins/load/load_arnold_standin.py | 16 ++--- .../plugins/load/load_as_template.py | 16 ++--- .../ayon_maya/plugins/load/load_assembly.py | 14 ++--- .../ayon_maya/plugins/load/load_audio.py | 13 ++-- .../ayon_maya/plugins/load/load_gpucache.py | 14 ++--- .../ayon_maya/plugins/load/load_image.py | 23 +++----- .../plugins/load/load_image_plane.py | 18 +++--- .../ayon_maya/plugins/load/load_look.py | 10 ++-- .../ayon_maya/plugins/load/load_matchmove.py | 5 +- .../ayon_maya/plugins/load/load_maya_usd.py | 14 ++--- .../plugins/load/load_multiverse_usd.py | 19 ++---- .../plugins/load/load_multiverse_usd_over.py | 17 ++---- .../plugins/load/load_redshift_proxy.py | 18 ++---- .../ayon_maya/plugins/load/load_reference.py | 9 ++- .../plugins/load/load_rendersetup.py | 15 ++--- .../plugins/load/load_vdb_to_arnold.py | 20 ++++--- .../plugins/load/load_vdb_to_redshift.py | 13 ++-- .../plugins/load/load_vdb_to_vray.py | 11 ++-- .../ayon_maya/plugins/load/load_vrayproxy.py | 18 ++---- .../ayon_maya/plugins/load/load_vrayscene.py | 15 ++--- .../ayon_maya/plugins/load/load_xgen.py | 20 +++---- .../ayon_maya/plugins/load/load_yeti_cache.py | 17 ++---- .../ayon_maya/plugins/load/load_yeti_rig.py | 5 +- .../plugins/publish/collect_animation.py | 7 +-- .../publish/collect_arnold_scene_source.py | 6 +- .../plugins/publish/collect_assembly.py | 12 +++- .../plugins/publish/collect_current_file.py | 6 +- .../plugins/publish/collect_fbx_animation.py | 6 +- .../plugins/publish/collect_fbx_camera.py | 5 +- .../publish/collect_file_dependencies.py | 5 +- .../ayon_maya/plugins/publish/collect_gltf.py | 3 +- .../plugins/publish/collect_history.py | 6 +- .../plugins/publish/collect_inputs.py | 4 +- .../plugins/publish/collect_instances.py | 3 +- .../ayon_maya/plugins/publish/collect_look.py | 11 ++-- .../publish/collect_maya_scene_time.py | 6 +- .../plugins/publish/collect_maya_units.py | 5 +- .../plugins/publish/collect_maya_workspace.py | 5 +- .../plugins/publish/collect_model.py | 6 +- .../publish/collect_multiverse_look.py | 5 +- .../plugins/publish/collect_pointcache.py | 7 +-- .../plugins/publish/collect_remove_marked.py | 3 +- .../plugins/publish/collect_render.py | 19 +++--- .../publish/collect_render_layer_aovs.py | 10 ++-- .../publish/collect_renderable_camera.py | 7 +-- .../plugins/publish/collect_review.py | 7 +-- .../plugins/publish/collect_rig_sets.py | 4 +- .../plugins/publish/collect_skeleton_mesh.py | 6 +- .../publish/collect_unreal_skeletalmesh.py | 3 +- .../publish/collect_unreal_staticmesh.py | 3 +- .../collect_user_defined_attributes.py | 5 +- .../plugins/publish/collect_vrayproxy.py | 3 +- .../plugins/publish/collect_vrayscene.py | 4 +- .../plugins/publish/collect_workfile.py | 4 +- .../plugins/publish/collect_workscene_fps.py | 4 +- .../ayon_maya/plugins/publish/collect_xgen.py | 6 +- .../plugins/publish/collect_yeti_cache.py | 9 +-- .../plugins/publish/collect_yeti_rig.py | 11 ++-- .../publish/determine_future_version.py | 4 +- .../publish/extract_active_view_thumbnail.py | 11 ++-- .../publish/extract_arnold_scene_source.py | 10 ++-- .../plugins/publish/extract_assembly.py | 8 +-- .../plugins/publish/extract_camera_alembic.py | 4 +- .../publish/extract_camera_mayaScene.py | 14 ++--- .../ayon_maya/plugins/publish/extract_fbx.py | 9 ++- .../plugins/publish/extract_fbx_animation.py | 12 ++-- .../ayon_maya/plugins/publish/extract_gltf.py | 8 +-- .../plugins/publish/extract_gpu_cache.py | 7 +-- .../publish/extract_import_reference.py | 11 ++-- .../plugins/publish/extract_layout.py | 10 ++-- .../ayon_maya/plugins/publish/extract_look.py | 26 ++++---- .../plugins/publish/extract_maya_scene_raw.py | 17 ++---- .../plugins/publish/extract_maya_usd.py | 14 ++--- .../plugins/publish/extract_model.py | 7 +-- .../publish/extract_multiverse_look.py | 5 +- .../plugins/publish/extract_multiverse_usd.py | 11 ++-- .../publish/extract_multiverse_usd_comp.py | 8 +-- .../publish/extract_multiverse_usd_over.py | 6 +- .../ayon_maya/plugins/publish/extract_obj.py | 7 +-- .../plugins/publish/extract_playblast.py | 7 +-- .../plugins/publish/extract_pointcache.py | 31 +++++----- .../plugins/publish/extract_proxy_abc.py | 12 ++-- .../plugins/publish/extract_redshift_proxy.py | 17 ++---- .../plugins/publish/extract_rendersetup.py | 7 +-- .../ayon_maya/plugins/publish/extract_rig.py | 8 +-- .../plugins/publish/extract_skeleton_mesh.py | 5 +- .../plugins/publish/extract_thumbnail.py | 7 +-- .../extract_unreal_skeletalmesh_abc.py | 13 ++-- .../extract_unreal_skeletalmesh_fbx.py | 8 +-- .../publish/extract_unreal_staticmesh.py | 15 ++--- .../publish/extract_unreal_yeticache.py | 6 +- .../plugins/publish/extract_vrayproxy.py | 8 +-- .../plugins/publish/extract_vrayscene.py | 8 +-- .../plugins/publish/extract_workfile_xgen.py | 10 ++-- .../ayon_maya/plugins/publish/extract_xgen.py | 15 ++--- .../plugins/publish/extract_yeti_cache.py | 8 +-- .../plugins/publish/extract_yeti_rig.py | 12 ++-- .../increment_current_file_deadline.py | 6 +- .../plugins/publish/reset_xgen_attributes.py | 6 +- .../ayon_maya/plugins/publish/save_scene.py | 10 ++-- .../validate_alembic_options_defaults.py | 8 +-- .../publish/validate_animation_content.py | 7 +-- ...date_animation_out_set_related_node_ids.py | 15 +++-- .../publish/validate_arnold_scene_source.py | 11 ++-- .../validate_arnold_scene_source_cbid.py | 11 ++-- .../publish/validate_ass_relative_paths.py | 5 +- .../plugins/publish/validate_assembly_name.py | 9 +-- .../publish/validate_assembly_namespaces.py | 10 ++-- .../publish/validate_assembly_transforms.py | 13 ++-- .../plugins/publish/validate_attributes.py | 17 +++--- .../publish/validate_camera_attributes.py | 9 ++- .../publish/validate_camera_contents.py | 5 +- .../plugins/publish/validate_color_sets.py | 12 ++-- ...validate_current_renderlayer_renderable.py | 11 ++-- .../plugins/publish/validate_cycle_error.py | 16 ++--- .../plugins/publish/validate_frame_range.py | 16 ++--- .../plugins/publish/validate_glsl_material.py | 17 +++--- .../plugins/publish/validate_glsl_plugin.py | 6 +- .../publish/validate_instance_has_members.py | 7 +-- .../publish/validate_instance_in_context.py | 9 ++- .../publish/validate_instance_subset.py | 6 +- .../plugins/publish/validate_loaded_plugin.py | 4 +- .../plugins/publish/validate_look_contents.py | 9 +-- ...lidate_look_default_shaders_connections.py | 9 ++- .../validate_look_id_reference_edits.py | 9 ++- .../validate_look_no_default_shaders.py | 10 ++-- .../plugins/publish/validate_look_sets.py | 5 +- .../publish/validate_look_shading_group.py | 12 ++-- .../publish/validate_look_single_shader.py | 12 ++-- .../plugins/publish/validate_maya_units.py | 13 ++-- .../validate_mesh_arnold_attributes.py | 23 ++++---- .../plugins/publish/validate_mesh_empty.py | 10 ++-- .../plugins/publish/validate_mesh_has_uv.py | 12 ++-- .../publish/validate_mesh_lamina_faces.py | 12 ++-- .../plugins/publish/validate_mesh_ngons.py | 20 +++---- .../validate_mesh_no_negative_scale.py | 12 ++-- .../publish/validate_mesh_non_manifold.py | 12 ++-- .../publish/validate_mesh_non_zero_edge.py | 20 +++---- .../publish/validate_mesh_normals_unlocked.py | 14 ++--- .../publish/validate_mesh_overlapping_uvs.py | 16 +++-- .../validate_mesh_shader_connections.py | 12 ++-- .../publish/validate_mesh_single_uv_set.py | 14 ++--- .../publish/validate_mesh_uv_set_map1.py | 12 ++-- .../validate_mesh_vertices_have_edges.py | 12 ++-- .../plugins/publish/validate_model_content.py | 20 +++---- .../publish/validate_mvlook_contents.py | 10 ++-- .../plugins/publish/validate_no_animation.py | 11 ++-- .../publish/validate_no_default_camera.py | 12 ++-- .../plugins/publish/validate_no_namespace.py | 13 ++-- .../publish/validate_no_null_transforms.py | 12 ++-- .../publish/validate_no_unknown_nodes.py | 11 ++-- .../plugins/publish/validate_no_vraymesh.py | 8 ++- .../plugins/publish/validate_node_ids.py | 6 +- .../validate_node_ids_deformed_shapes.py | 17 +++--- .../publish/validate_node_ids_in_database.py | 12 ++-- .../publish/validate_node_ids_related.py | 14 +++-- .../publish/validate_node_ids_unique.py | 14 ++--- .../publish/validate_node_no_ghosting.py | 13 ++-- .../validate_plugin_path_attributes.py | 21 +++---- .../publish/validate_render_image_rule.py | 11 ++-- .../validate_render_no_default_cameras.py | 13 ++-- .../publish/validate_render_single_camera.py | 16 +++-- .../publish/validate_renderlayer_aovs.py | 10 ++-- .../publish/validate_rendersettings.py | 11 ++-- .../plugins/publish/validate_resolution.py | 8 +-- .../plugins/publish/validate_resources.py | 6 +- .../plugins/publish/validate_review.py | 5 +- .../plugins/publish/validate_rig_contents.py | 9 ++- .../publish/validate_rig_controllers.py | 23 ++++---- ...idate_rig_controllers_arnold_attributes.py | 24 ++++---- .../publish/validate_rig_joints_hidden.py | 15 ++--- .../publish/validate_rig_out_set_node_ids.py | 17 +++--- .../publish/validate_rig_output_ids.py | 13 ++-- .../publish/validate_scene_set_workspace.py | 10 ++-- .../plugins/publish/validate_setdress_root.py | 7 +-- .../plugins/publish/validate_shader_name.py | 13 ++-- .../publish/validate_shape_default_names.py | 14 ++--- .../publish/validate_shape_render_stats.py | 13 ++-- .../plugins/publish/validate_shape_zero.py | 23 ++++---- .../publish/validate_single_assembly.py | 7 +-- .../validate_skeletalmesh_hierarchy.py | 10 ++-- .../validate_skeletalmesh_triangulated.py | 13 ++-- .../validate_skeleton_top_group_hierarchy.py | 16 +++-- .../validate_skinCluster_deformer_set.py | 6 +- .../plugins/publish/validate_step_size.py | 7 +-- .../validate_transform_naming_suffix.py | 12 ++-- .../publish/validate_transform_zero.py | 12 ++-- .../plugins/publish/validate_unique_names.py | 12 ++-- .../validate_unreal_mesh_triangulated.py | 19 +++--- .../validate_unreal_staticmesh_naming.py | 10 ++-- .../publish/validate_unreal_up_axis.py | 15 ++--- .../plugins/publish/validate_visible_only.py | 12 ++-- .../plugins/publish/validate_vray.py | 7 +-- .../validate_vray_distributed_rendering.py | 11 ++-- .../publish/validate_vray_referenced_aovs.py | 18 +++--- .../validate_vray_translator_settings.py | 11 ++-- .../plugins/publish/validate_vrayproxy.py | 7 +-- .../publish/validate_vrayproxy_members.py | 17 +++--- .../plugins/publish/validate_xgen.py | 7 +-- .../validate_yeti_renderscript_callbacks.py | 16 +++-- .../publish/validate_yeti_rig_cache_state.py | 12 ++-- .../validate_yeti_rig_input_in_instance.py | 13 ++-- .../publish/validate_yeti_rig_settings.py | 6 +- 204 files changed, 991 insertions(+), 1287 deletions(-) diff --git a/server_addon/maya/client/ayon_maya/api/plugin.py b/server_addon/maya/client/ayon_maya/api/plugin.py index 0eb998cb36..b8d9748ef1 100644 --- a/server_addon/maya/client/ayon_maya/api/plugin.py +++ b/server_addon/maya/client/ayon_maya/api/plugin.py @@ -2,40 +2,41 @@ import json import os from abc import ABCMeta +import ayon_api import qargparse import six -import ayon_api -from maya import cmds -from maya.app.renderSetup.model import renderSetup from ayon_core.lib import BoolDef, Logger -from ayon_core.settings import get_project_settings from ayon_core.pipeline import ( - AYON_INSTANCE_ID, - AYON_CONTAINER_ID, - AVALON_INSTANCE_ID, AVALON_CONTAINER_ID, + AVALON_INSTANCE_ID, + AYON_CONTAINER_ID, + AYON_INSTANCE_ID, Anatomy, - + AutoCreator, CreatedInstance, Creator as NewCreator, - AutoCreator, - HiddenCreator, - CreatorError, + HiddenCreator, LegacyCreator, LoaderPlugin, - get_representation_path, get_current_project_name, + get_representation_path, + publish, ) -from ayon_core.pipeline.load import LoadError from ayon_core.pipeline.create import get_product_name +from ayon_core.pipeline.load import LoadError +from ayon_core.settings import get_project_settings +from maya import cmds +from maya.app.renderSetup.model import renderSetup +from pyblish.api import ContextPlugin, InstancePlugin from . import lib from .lib import imprint, read from .pipeline import containerise log = Logger.get_logger() +SETTINGS_CATEGORY = "maya" def _get_attr(node, attr, default=None): @@ -652,7 +653,7 @@ def get_load_color_for_product_type(product_type, settings=None): class Loader(LoaderPlugin): hosts = ["maya"] - + settings_category = SETTINGS_CATEGORY load_settings = {} # defined in settings @classmethod @@ -807,9 +808,8 @@ class ReferenceLoader(Loader): raise NotImplementedError("Must be implemented by subclass") def update(self, container, context): - from maya import cmds - from ayon_maya.api.lib import get_container_members + from maya import cmds node = container["objectName"] @@ -1025,3 +1025,30 @@ class ReferenceLoader(Loader): AYON_CONTAINER_ID, AVALON_CONTAINER_ID }: cmds.sets(node, forceElement=container) + + +class MayaLoader(LoaderPlugin): + """Base class for loader plugins.""" + + settings_category = SETTINGS_CATEGORY + + +class MayaInstancePlugin(InstancePlugin): + """Base class for instance publish plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] + + +class MayaContextPlugin(ContextPlugin): + """Base class for context publish plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] + + +class MayaExtractorPlugin(publish.Extractor): + """Base class for extract plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index db81199ed6..087a0a488b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -1,21 +1,17 @@ import os + import clique - import maya.cmds as cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) from ayon_maya.api.lib import ( - unique_namespace, get_attribute_input, + get_fps_for_current_context, maintained_selection, - get_fps_for_current_context + unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type def is_sequence(files): @@ -26,7 +22,7 @@ def is_sequence(files): return sequence -class ArnoldStandinLoader(load.LoaderPlugin): +class ArnoldStandinLoader(Loader): """Load as Arnold standin""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index 2a29faa77d..8ad3e526d1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -1,16 +1,10 @@ -from ayon_core.lib import ( - BoolDef -) -from ayon_core.pipeline import ( - load, - registered_host -) -from ayon_maya.api.workfile_template_builder import ( - MayaTemplateBuilder -) +from ayon_core.lib import BoolDef +from ayon_core.pipeline import registered_host +from ayon_maya.api.plugin import Loader +from ayon_maya.api.workfile_template_builder import MayaTemplateBuilder -class LoadAsTemplate(load.LoaderPlugin): +class LoadAsTemplate(Loader): """Load workfile as a template """ product_types = {"workfile", "mayaScene"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index b37bf14101..8c6edf3aac 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -1,16 +1,12 @@ import maya.cmds as cmds - -from ayon_core.pipeline import ( - load, - remove_container -) - -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace +from ayon_core.pipeline import remove_container from ayon_maya.api import setdress +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader -class AssemblyLoader(load.LoaderPlugin): +class AssemblyLoader(Loader): product_types = {"assembly"} representations = {"json"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 81e49c616e..5ad3993e57 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -1,14 +1,11 @@ +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import get_container_members, unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader from maya import cmds, mel -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace, get_container_members - -class AudioLoader(load.LoaderPlugin): +class AudioLoader(Loader): """Specific loader of audio.""" product_types = {"audio"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index fb6db94cee..d40b31e885 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -1,16 +1,12 @@ import maya.cmds as cmds - -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace -from ayon_core.pipeline import ( - load, - get_representation_path -) +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class GpuCacheLoader(load.LoaderPlugin): +class GpuCacheLoader(Loader): """Load Alembic as gpuCache""" product_types = {"model", "animation", "proxyAbc", "pointcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 28b44ac99c..3a32237729 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -1,24 +1,17 @@ import copy from ayon_core.lib import EnumDef -from ayon_core.pipeline import ( - load, - get_current_host_name, +from ayon_core.pipeline import get_current_host_name +from ayon_core.pipeline.colorspace import ( + get_current_context_imageio_config_preset, + get_imageio_file_rules, + get_imageio_file_rules_colorspace_from_filepath, ) from ayon_core.pipeline.load.utils import get_representation_path_from_context -from ayon_core.pipeline.colorspace import ( - get_imageio_file_rules_colorspace_from_filepath, - get_current_context_imageio_config_preset, - get_imageio_file_rules -) from ayon_core.settings import get_project_settings - +from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import ( - unique_namespace, - namespaced -) - +from ayon_maya.api.plugin import Loader from maya import cmds @@ -88,7 +81,7 @@ def create_stencil(): return file, place, stencil, place_stencil -class FileNodeLoader(load.LoaderPlugin): +class FileNodeLoader(Loader): """File node loader.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 2740f106d6..21625affca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -1,18 +1,14 @@ -from qtpy import QtWidgets, QtCore - -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.pipeline import containerise +from ayon_core.pipeline import get_representation_path from ayon_maya.api.lib import ( - unique_namespace, + get_container_members, namespaced, pairwise, - get_container_members + unique_namespace, ) - +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader from maya import cmds +from qtpy import QtCore, QtWidgets def disconnect_inputs(plug): @@ -84,7 +80,7 @@ class CameraWindow(QtWidgets.QDialog): self.close() -class ImagePlaneLoader(load.LoaderPlugin): +class ImagePlaneLoader(Loader): """Specific loader of plate for image planes on selected camera.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_look.py b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py index f61d0e9c35..da7b3691fd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py @@ -3,15 +3,13 @@ import json from collections import defaultdict -from qtpy import QtWidgets -from ayon_api import get_representation_by_name - -from ayon_core.pipeline import get_representation_path import ayon_maya.api.plugin +from ayon_api import get_representation_by_name +from ayon_core.pipeline import get_representation_path +from ayon_core.tools.utils import ScrollMessageBox from ayon_maya.api import lib from ayon_maya.api.lib import get_reference_node - -from ayon_core.tools.utils import ScrollMessageBox +from qtpy import QtWidgets class LookLoader(ayon_maya.api.plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py index b19b14b1aa..f4aaca6a4d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py @@ -1,7 +1,8 @@ +from ayon_maya.api.plugin import Loader from maya import mel -from ayon_core.pipeline import load -class MatchmoveLoader(load.LoaderPlugin): + +class MatchmoveLoader(Loader): """ This will run matchmove script to create track in scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index 6c2945f4a8..b3bd2475fd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -1,19 +1,13 @@ # -*- coding: utf-8 -*- import maya.cmds as cmds - -from ayon_core.pipeline import ( - load, - get_representation_path, -) +from ayon_core.pipeline import get_representation_path from ayon_core.pipeline.load import get_representation_path_from_context -from ayon_maya.api.lib import ( - namespaced, - unique_namespace -) +from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader -class MayaUsdLoader(load.LoaderPlugin): +class MayaUsdLoader(Loader): """Read USD data in a Maya USD Proxy""" product_types = {"model", "usd", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index 93bb95092e..ca347697ab 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -1,23 +1,16 @@ # -*- coding: utf-8 -*- -import maya.cmds as cmds -from maya import mel import os +import maya.cmds as cmds from ayon_api import get_representation_by_id - -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader +from maya import mel -class MultiverseUsdLoader(load.LoaderPlugin): +class MultiverseUsdLoader(Loader): """Read USD data in a Multiverse Compound""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index e51353887e..bdcb771109 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -1,22 +1,17 @@ # -*- coding: utf-8 -*- -import maya.cmds as cmds -from maya import mel import os +import maya.cmds as cmds import qargparse from ayon_api import get_representation_by_id - -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection -) +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import maintained_selection from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader +from maya import mel -class MultiverseUsdOverLoader(load.LoaderPlugin): +class MultiverseUsdOverLoader(Loader): """Reference file""" product_types = {"mvUsdOverride"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index fba6314fec..996d77856d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -1,25 +1,17 @@ # -*- coding: utf-8 -*- """Loader for Redshift proxy.""" import os + import clique - import maya.cmds as cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - namespaced, - maintained_selection, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class RedshiftProxyLoader(load.LoaderPlugin): +class RedshiftProxyLoader(Loader): """Load Redshift proxy""" product_types = {"redshiftproxy"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py index 4aad3ddb22..f8e1062e38 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py @@ -1,17 +1,16 @@ -import difflib import contextlib +import difflib -from maya import cmds import qargparse - from ayon_core.settings import get_project_settings from ayon_maya.api import plugin from ayon_maya.api.lib import ( - maintained_selection, + create_rig_animation_instance, get_container_members, + maintained_selection, parent_nodes, - create_rig_animation_instance ) +from maya import cmds @contextlib.contextmanager diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index 96f38ba1ce..09fda5d2f4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -6,21 +6,18 @@ When this json is loaded, it will overwrite all settings on RenderSetup instance. """ +import contextlib import json import sys -import six -import contextlib +import maya.app.renderSetup.model.renderSetup as renderSetup +import six from ayon_core.lib import BoolDef, EnumDef -from ayon_core.pipeline import ( - load, - get_representation_path -) +from ayon_core.pipeline import get_representation_path from ayon_maya.api import lib from ayon_maya.api.pipeline import containerise - +from ayon_maya.api.plugin import Loader from maya import cmds -import maya.app.renderSetup.model.renderSetup as renderSetup @contextlib.contextmanager @@ -48,7 +45,7 @@ def mark_all_imported(enabled): cmds.deleteAttr(plug) -class RenderSetupLoader(load.LoaderPlugin): +class RenderSetupLoader(Loader): """Load json preset for RenderSetup overwriting current one.""" product_types = {"rendersetup"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index d326c224bf..832562971f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -1,15 +1,17 @@ +"""Load OpenVDB for Arnold in aiVolume. + +TODO: + `aiVolume` doesn't automatically set velocity fps correctly, set manual? + +""" import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type -# TODO aiVolume doesn't automatically set velocity fps correctly, set manual? +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class LoadVDBtoArnold(load.LoaderPlugin): +class LoadVDBtoArnold(Loader): """Load OpenVDB for Arnold in aiVolume""" product_types = {"vdbcache"} @@ -21,9 +23,9 @@ class LoadVDBtoArnold(load.LoaderPlugin): def load(self, context, name, namespace, data): - from maya import cmds - from ayon_maya.api.pipeline import containerise from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from maya import cmds product_type = context["product"]["productType"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index 5ac8dfa05e..1ea82cbf28 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -1,14 +1,11 @@ import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class LoadVDBtoRedShift(load.LoaderPlugin): +class LoadVDBtoRedShift(Loader): """Load OpenVDB in a Redshift Volume Shape Note that the RedshiftVolumeShape is created without a RedshiftVolume @@ -27,9 +24,9 @@ class LoadVDBtoRedShift(load.LoaderPlugin): def load(self, context, name=None, namespace=None, data=None): - from maya import cmds - from ayon_maya.api.pipeline import containerise from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from maya import cmds product_type = context["product"]["productType"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index 7a3129dfe7..fefbea0e88 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -1,12 +1,8 @@ import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type - +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type from maya import cmds # List of 3rd Party Channels Mapping names for VRayVolumeGrid @@ -74,7 +70,7 @@ def _fix_duplicate_vvg_callbacks(): matched.add(callback) -class LoadVDBtoVRay(load.LoaderPlugin): +class LoadVDBtoVRay(Loader): """Load OpenVDB in a V-Ray Volume Grid""" product_types = {"vdbcache"} @@ -175,6 +171,7 @@ class LoadVDBtoVRay(load.LoaderPlugin): else: # Sequence import clique + # todo: check support for negative frames as input collections, remainder = clique.assemble(files) assert len(collections) == 1, ( diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 014c8fea48..53995f877b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -7,24 +7,16 @@ loader will use them instead of native vray vrmesh format. """ import os -import maya.cmds as cmds - import ayon_api +import maya.cmds as cmds +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class VRayProxyLoader(load.LoaderPlugin): +class VRayProxyLoader(Loader): """Load VRay Proxy with Alembic or VrayMesh.""" product_types = {"vrayproxy", "model", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index 17b0c2cd44..acea6cdd63 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -1,20 +1,13 @@ # -*- coding: utf-8 -*- import maya.cmds as cmds # noqa +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class VRaySceneLoader(load.LoaderPlugin): +class VRaySceneLoader(Loader): """Load Vray scene""" product_types = {"vrayscene_layer"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index f1f25640bd..6f053cd1e6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -1,20 +1,18 @@ import os import shutil +import ayon_maya.api.plugin import maya.cmds as cmds import xgenm - -from qtpy import QtWidgets - -import ayon_maya.api.plugin -from ayon_maya.api.lib import ( - maintained_selection, - get_container_members, - attribute_values, - write_xgen_file -) -from ayon_maya.api import current_file from ayon_core.pipeline import get_representation_path +from ayon_maya.api import current_file +from ayon_maya.api.lib import ( + attribute_values, + get_container_members, + maintained_selection, + write_xgen_file, +) +from qtpy import QtWidgets class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index bb7d2792c5..b2b5c7c710 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -1,21 +1,16 @@ -import os import json +import os import re from collections import defaultdict import clique -from maya import cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) from ayon_maya.api import lib -from ayon_maya.api.yeti import create_yeti_variable from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type - +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.yeti import create_yeti_variable +from maya import cmds # Do not reset these values on update but only apply on first load # to preserve any potential local overrides @@ -45,7 +40,7 @@ def set_attribute(node, attr, value): lib.set_attribute(node, attr, value) -class YetiCacheLoader(load.LoaderPlugin): +class YetiCacheLoader(Loader): """Load Yeti Cache with one or more Yeti nodes""" product_types = {"yeticache", "yetiRig"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py index 41129b0245..a45e5c63ef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py @@ -1,12 +1,9 @@ from typing import List import maya.cmds as cmds - -from ayon_maya.api import plugin -from ayon_maya.api import lib - from ayon_core.pipeline import registered_host from ayon_core.pipeline.create import CreateContext +from ayon_maya.api import lib, plugin class YetiRigLoader(plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py index 391c80c84e..7996602c37 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py @@ -1,9 +1,9 @@ -import pyblish.api - import maya.cmds as cmds +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectAnimationOutputGeometry(pyblish.api.InstancePlugin): +class CollectAnimationOutputGeometry(MayaInstancePlugin): """Collect out hierarchy data for instance. Collect all hierarchy nodes which reside in the out_SET of the animation @@ -18,7 +18,6 @@ class CollectAnimationOutputGeometry(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.4 families = ["animation"] label = "Collect Animation Output Geometry" - hosts = ["maya"] ignore_type = ["constraints"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index cdeadd9036..55f332e4b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,10 +1,10 @@ -from maya import cmds - import pyblish.api from ayon_maya.api.lib import get_all_children +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectArnoldSceneSource(pyblish.api.InstancePlugin): +class CollectArnoldSceneSource(MayaInstancePlugin): """Collect Arnold Scene Source data.""" # Offset to be after renderable camera collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index affb22c530..57b3443dd3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -1,14 +1,20 @@ +"""Collect all relevant assembly items. + +Todo: + Publish of assembly need unique namespace for all assets, we should + create validator for this. + +""" from collections import defaultdict import pyblish.api from maya import cmds, mel from ayon_maya import api from ayon_maya.api import lib - -# TODO : Publish of assembly: -unique namespace for all assets, VALIDATOR! +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectAssembly(pyblish.api.InstancePlugin): +class CollectAssembly(MayaInstancePlugin): """Collect all relevant assembly items Collected data: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py index c7105a7f3c..27c9dc130e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py @@ -1,15 +1,13 @@ - import pyblish.api - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class CollectCurrentFile(pyblish.api.ContextPlugin): +class CollectCurrentFile(MayaContextPlugin): """Inject the current working file.""" order = pyblish.api.CollectorOrder - 0.4 label = "Maya Current File" - hosts = ['maya'] def process(self, context): """Inject the current working file""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py index d8fd7a16e8..687b93211b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectFbxAnimation(pyblish.api.InstancePlugin, +class CollectFbxAnimation(MayaInstancePlugin, OptionalPyblishPluginMixin): """Collect Animated Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 label = "Collect Fbx Animation" - hosts = ["maya"] families = ["animation"] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py index bfa5bccbb9..eabc1237a3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectFbxCamera(pyblish.api.InstancePlugin): +class CollectFbxCamera(MayaInstancePlugin): """Collect Camera for FBX export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py index 60853bd1ee..ca4c617fa9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py @@ -1,14 +1,13 @@ from maya import cmds - +from ayon_maya.api.plugin import MayaContextPlugin import pyblish.api -class CollectFileDependencies(pyblish.api.ContextPlugin): +class CollectFileDependencies(MayaContextPlugin): """Gather all files referenced in this scene.""" label = "Collect File Dependencies" order = pyblish.api.CollectorOrder - 0.49 - hosts = ["maya"] families = ["renderlayer"] @classmethod diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py index bb37fe3a7e..c34505597c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectGLTF(pyblish.api.InstancePlugin): +class CollectGLTF(MayaInstancePlugin): """Collect Assets for GLTF/GLB export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py index 2da74991c0..b649628a36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectMayaHistory(pyblish.api.InstancePlugin): +class CollectMayaHistory(MayaInstancePlugin): """Collect history for instances from the Maya scene Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index 28788ac50d..bebd765c1b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -7,6 +7,7 @@ import pyblish.api from ayon_core.pipeline import registered_host from ayon_maya.api.lib import get_container_members from ayon_maya.api.lib_rendersetup import get_shader_in_layer +from ayon_maya.api.plugin import MayaInstancePlugin def iter_history(nodes, @@ -93,7 +94,7 @@ def collect_input_containers(containers, nodes): if any(node in container["_members"] for node in nodes)] -class CollectUpstreamInputs(pyblish.api.InstancePlugin): +class CollectUpstreamInputs(MayaInstancePlugin): """Collect input source inputs for this publish. This will include `inputs` data of which loaded publishes were used in the @@ -104,7 +105,6 @@ class CollectUpstreamInputs(pyblish.api.InstancePlugin): label = "Collect Inputs" order = pyblish.api.CollectorOrder + 0.34 - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 758b977c8d..89b490febc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -2,9 +2,10 @@ from maya import cmds import pyblish.api from ayon_maya.api.lib import get_all_children +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectNewInstances(pyblish.api.InstancePlugin): +class CollectNewInstances(MayaInstancePlugin): """Gather members for instances and pre-defined attribute This collector takes into account assets that are associated with diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index f4bc26506b..27fb409777 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- """Maya look collector.""" -import re -import os import glob +import os +import re -from maya import cmds # noqa import pyblish.api from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa SHAPE_ATTRS = {"castsShadows", "receiveShadows", @@ -265,7 +266,7 @@ def get_file_node_files(node): return result -class CollectLook(pyblish.api.InstancePlugin): +class CollectLook(MayaInstancePlugin): """Collect look data for instance. For the shapes/transforms of the referenced object to collect look for @@ -286,7 +287,6 @@ class CollectLook(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.2 families = ["look"] label = "Collect Look" - hosts = ["maya"] def process(self, instance): """Collect the Look in the instance with the correct layer settings""" @@ -644,7 +644,6 @@ class CollectModelRenderSets(CollectLook): order = pyblish.api.CollectorOrder + 0.21 families = ["model"] label = "Collect Model Render Sets" - hosts = ["maya"] def collect_sets(self, instance): """Collect all related objectSets except shadingEngines diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py index 6a20cb151f..b6a15a637f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectMayaSceneTime(pyblish.api.InstancePlugin): +class CollectMayaSceneTime(MayaInstancePlugin): """Collect Maya Scene playback range This allows to reproduce the playback range for the content to be loaded. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py index 2421641d26..2224037b1f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py @@ -1,15 +1,16 @@ import maya.cmds as cmds import maya.mel as mel +from ayon_maya.api.plugin import MayaContextPlugin + import pyblish.api -class CollectMayaUnits(pyblish.api.ContextPlugin): +class CollectMayaUnits(MayaContextPlugin): """Collect Maya's scene units.""" label = "Maya Units" order = pyblish.api.CollectorOrder - hosts = ["maya"] def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py index 122fabe8a1..bdcd232348 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py @@ -1,17 +1,16 @@ import os import pyblish.api - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class CollectMayaWorkspace(pyblish.api.ContextPlugin): +class CollectMayaWorkspace(MayaContextPlugin): """Inject the current workspace into context""" order = pyblish.api.CollectorOrder - 0.5 label = "Maya Workspace" - hosts = ['maya'] def process(self, context): workspace = cmds.workspace(rootDirectory=True, query=True) diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py index 9d45ed63bc..c239f1c118 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectModelData(pyblish.api.InstancePlugin): +class CollectModelData(MayaInstancePlugin): """Collect model data Ensures always only a single frame is extracted (current frame). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index 9910936e7d..fff35d32f5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -2,9 +2,10 @@ import glob import os import re -from maya import cmds import pyblish.api from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds SHAPE_ATTRS = ["castsShadows", "receiveShadows", @@ -251,7 +252,7 @@ def is_mipmap(fname): return False -class CollectMultiverseLookData(pyblish.api.InstancePlugin): +class CollectMultiverseLookData(MayaInstancePlugin): """Collect Multiverse Look Searches through the overrides finding all material overrides. From there diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py index 5578a57f31..0c3cccc8ec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py @@ -1,15 +1,14 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectPointcache(pyblish.api.InstancePlugin): +class CollectPointcache(MayaInstancePlugin): """Collect pointcache data for instance.""" order = pyblish.api.CollectorOrder + 0.4 families = ["pointcache"] label = "Collect Pointcache" - hosts = ["maya"] def process(self, instance): if instance.data.get("farm"): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py index 69e69f6630..97c5dc67d4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin -class CollectRemoveMarked(pyblish.api.ContextPlugin): +class CollectRemoveMarked(MayaContextPlugin): """Remove marked data Remove instances that have 'remove' in their instance.data diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index cacde15561..143d1c08e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -32,24 +32,23 @@ Provides: instance -> pixelAspect """ +import json import os import platform -import json - -from maya import cmds import pyblish.api - -from ayon_core.pipeline import KnownPublishError from ayon_core.lib import get_formatted_current_time -from ayon_maya.api.lib_renderproducts import ( - get as get_layer_render_products, - UnsupportedRendererException -) +from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.lib_renderproducts import ( + UnsupportedRendererException, + get as get_layer_render_products, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectMayaRender(pyblish.api.InstancePlugin): +class CollectMayaRender(MayaInstancePlugin): """Gather all publishable render layers from renderSetup.""" order = pyblish.api.CollectorOrder + 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index d23a4edb4d..7e1d531541 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -1,11 +1,10 @@ +import pyblish.api +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_maya.api import lib - - -class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): +class CollectRenderLayerAOVS(MayaInstancePlugin): """Collect all render layer's AOVs / Render Elements that will render. This collector is important to be able to Extend Frames. @@ -26,7 +25,6 @@ class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.02 label = "Render Elements / AOVs" - hosts = ["maya"] families = ["renderlayer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index d2d05971e9..4ac16eb714 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -1,11 +1,10 @@ import pyblish.api - +from ayon_maya.api.lib_rendersetup import get_attr_in_layer +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_maya.api.lib_rendersetup import get_attr_in_layer - -class CollectRenderableCamera(pyblish.api.InstancePlugin): +class CollectRenderableCamera(MayaInstancePlugin): """Collect the renderable camera(s) for the render layer""" # Offset to be after renderlayer collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 490e197ce0..90620771e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -1,13 +1,12 @@ -from maya import cmds, mel - import ayon_api import pyblish.api - from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel -class CollectReview(pyblish.api.InstancePlugin): +class CollectReview(MayaInstancePlugin): """Collect Review data """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py index 34ff26a8b8..dfa4fc2d9a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py @@ -1,8 +1,9 @@ import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class CollectRigSets(pyblish.api.InstancePlugin): +class CollectRigSets(MayaInstancePlugin): """Ensure rig contains pipeline-critical content Every rig must contain at least two object sets: @@ -13,7 +14,6 @@ class CollectRigSets(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.05 label = "Collect Rig Sets" - hosts = ["maya"] families = ["rig"] accepted_output = ["mesh", "transform"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py index 31f0eca88c..a8783018c9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectSkeletonMesh(pyblish.api.InstancePlugin): +class CollectSkeletonMesh(MayaInstancePlugin): """Collect Static Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 label = "Collect Skeleton Mesh" - hosts = ["maya"] families = ["rig"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py index 79693bb35e..a7900a2085 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectUnrealSkeletalMesh(pyblish.api.InstancePlugin): +class CollectUnrealSkeletalMesh(MayaInstancePlugin): """Collect Unreal Skeletal Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py index 03b6c4a188..762c7daa4a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from pprint import pformat -class CollectUnrealStaticMesh(pyblish.api.InstancePlugin): +class CollectUnrealStaticMesh(MayaInstancePlugin): """Collect Unreal Static Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py index 3d586d48fb..b7ef70c874 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py @@ -1,15 +1,14 @@ from maya import cmds - +from ayon_maya.api.plugin import MayaInstancePlugin import pyblish.api -class CollectUserDefinedAttributes(pyblish.api.InstancePlugin): +class CollectUserDefinedAttributes(MayaInstancePlugin): """Collect user defined attributes for nodes in instance.""" order = pyblish.api.CollectorOrder + 0.45 families = ["pointcache", "animation", "usd"] label = "Collect User Defined Attributes" - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py index 8630f56e58..8710858150 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- """Collect Vray Proxy.""" import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectVrayProxy(pyblish.api.InstancePlugin): +class CollectVrayProxy(MayaInstancePlugin): """Collect Vray Proxy instance. Add `pointcache` family for it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index ea7064292b..86538450b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- """Collect Vray Scene and prepare it for extraction and publishing.""" - import pyblish.api from ayon_core.lib import get_formatted_current_time from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectVrayScene(pyblish.api.InstancePlugin): +class CollectVrayScene(MayaInstancePlugin): """Collect Vray Scene. If export on farm is checked, job is created to export it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py index e2b64f1ebd..d7cea61a2c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py @@ -1,13 +1,13 @@ import os import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectWorkfileData(pyblish.api.InstancePlugin): +class CollectWorkfileData(MayaInstancePlugin): """Inject data into Workfile instance""" order = pyblish.api.CollectorOrder - 0.01 label = "Maya Workfile" - hosts = ['maya'] families = ["workfile"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py index 41d6ffea33..5c1b021799 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py @@ -1,13 +1,13 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin from maya import mel -class CollectWorksceneFPS(pyblish.api.ContextPlugin): +class CollectWorksceneFPS(MayaContextPlugin): """Get the FPS of the work scene""" label = "Workscene FPS" order = pyblish.api.CollectorOrder - hosts = ["maya"] def process(self, context): fps = mel.eval('currentTimeUnitToFPS()') diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index d09f60c827..784c0a4b83 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -1,12 +1,12 @@ import os -from maya import cmds - import pyblish.api from ayon_maya.api.lib import get_attribute_input +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectXgen(pyblish.api.InstancePlugin): +class CollectXgen(MayaInstancePlugin): """Collect Xgen""" order = pyblish.api.CollectorOrder + 0.499999 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index fa9670820f..10883074d3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -1,10 +1,8 @@ -from maya import cmds - import pyblish.api - from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from ayon_maya.api.yeti import get_yeti_user_variables - +from maya import cmds SETTINGS = { # Preview @@ -24,7 +22,7 @@ SETTINGS = { } -class CollectYetiCache(pyblish.api.InstancePlugin): +class CollectYetiCache(MayaInstancePlugin): """Collect all information of the Yeti caches The information contains the following attributes per Yeti node @@ -41,7 +39,6 @@ class CollectYetiCache(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.45 label = "Collect Yeti Cache" families = ["yetiRig", "yeticache", "yeticacheUE"] - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 95e6afdb01..25bc5ec172 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -1,13 +1,11 @@ import os import re -from maya import cmds - import pyblish.api - -from ayon_maya.api import lib from ayon_core.pipeline.publish import KnownPublishError - +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds SETTINGS = {"renderDensity", "renderWidth", @@ -17,13 +15,12 @@ SETTINGS = {"renderDensity", "cbId"} -class CollectYetiRig(pyblish.api.InstancePlugin): +class CollectYetiRig(MayaInstancePlugin): """Collect all information of the Yeti Rig""" order = pyblish.api.CollectorOrder + 0.4 label = "Collect Yeti Rig" families = ["yetiRig"] - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py index 5b597f2707..a09489d4ae 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py @@ -1,13 +1,13 @@ import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class DetermineFutureVersion(pyblish.api.InstancePlugin): +class DetermineFutureVersion(MayaInstancePlugin): """ This will determine version of product if we want render to be attached to. """ label = "Determine Product Version" order = pyblish.api.IntegratorOrder - hosts = ["maya"] families = ["renderlayer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index 777bc2000a..221da82d36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -1,13 +1,13 @@ -import maya.api.OpenMaya as om -import maya.api.OpenMayaUI as omui - -import pyblish.api import tempfile +import maya.api.OpenMaya as om +import maya.api.OpenMayaUI as omui +import pyblish.api from ayon_maya.api.lib import IS_HEADLESS +from ayon_maya.api.plugin import MayaInstancePlugin -class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): +class ExtractActiveViewThumbnail(MayaInstancePlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that @@ -18,7 +18,6 @@ class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): order = pyblish.api.ExtractorOrder + 0.49 label = "Active View Thumbnail" families = ["workfile"] - hosts = ["maya"] def process(self, instance): if IS_HEADLESS: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index 2829420ae1..fb79094aec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -1,19 +1,17 @@ +import json import os from collections import defaultdict -import json -from maya import cmds import arnold - -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractArnoldSceneSource(publish.Extractor): +class ExtractArnoldSceneSource(MayaExtractorPlugin): """Extract the content of the instance to an Arnold Scene Source file.""" label = "Extract Arnold Scene Source" - hosts = ["maya"] families = ["ass"] asciiAss = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index df390c0798..ecbf21dfb9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -1,13 +1,12 @@ -import os import json +import os -from ayon_core.pipeline import publish from ayon_maya.api.alembic import extract_alembic - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractAssembly(publish.Extractor): +class ExtractAssembly(MayaExtractorPlugin): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, @@ -16,7 +15,6 @@ class ExtractAssembly(publish.Extractor): """ label = "Extract Assembly" - hosts = ["maya"] families = ["assembly"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index e36f964abd..2c38110913 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -2,12 +2,12 @@ import os import json from maya import cmds - +from ayon_maya.api.plugin import MayaExtractorPlugin from ayon_core.pipeline import publish from ayon_maya.api import lib -class ExtractCameraAlembic(publish.Extractor, +class ExtractCameraAlembic(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Alembic. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index 62ce0a1806..5f6260c794 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -1,16 +1,14 @@ # -*- coding: utf-8 -*- """Extract camera as Maya Scene.""" -import os -import itertools import contextlib +import itertools +import os -from maya import cmds - +from ayon_core.lib import BoolDef from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_core.lib import ( - BoolDef -) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds def massage_ma_file(path): @@ -82,7 +80,7 @@ def unlock(plug): cmds.disconnectAttr(source, destination) -class ExtractCameraMayaScene(publish.Extractor, +class ExtractCameraMayaScene(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Maya Scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index d6a1de8455..cd1fe1f7e8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -1,16 +1,15 @@ # -*- coding: utf-8 -*- import os -from maya import cmds # noqa import maya.mel as mel # noqa import pyblish.api - -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection from ayon_maya.api import fbx +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa -class ExtractFBX(publish.Extractor): +class ExtractFBX(MayaExtractorPlugin): """Extract FBX from Maya. This extracts reproducible FBX exports ignoring any of the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 92ba0be953..186486c153 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -1,17 +1,14 @@ # -*- coding: utf-8 -*- import os -from maya import cmds # noqa import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import fbx -from ayon_maya.api.lib import ( - namespaced, get_namespace, strip_namespace -) +from ayon_maya.api.lib import get_namespace, namespaced, strip_namespace +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa -class ExtractFBXAnimation(publish.Extractor): +class ExtractFBXAnimation(MayaExtractorPlugin): """Extract Rig in FBX format from Maya. This extracts the rig in fbx with the constraints @@ -22,7 +19,6 @@ class ExtractFBXAnimation(publish.Extractor): """ order = pyblish.api.ExtractorOrder label = "Extract Animation (FBX)" - hosts = ["maya"] families = ["animation.fbx"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index 1472454af7..450764a9f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -1,17 +1,15 @@ import os -from maya import cmds, mel import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import lib from ayon_maya.api.gltf import extract_gltf +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds, mel -class ExtractGLB(publish.Extractor): +class ExtractGLB(MayaExtractorPlugin): order = pyblish.api.ExtractorOrder - hosts = ["maya"] label = "Extract GLB" families = ["gltf"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py index 4b293b5785..2d177bda96 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py @@ -1,16 +1,15 @@ import json +from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractGPUCache(publish.Extractor, +class ExtractGPUCache(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract the content of the instance to a GPU cache file.""" label = "GPU Cache" - hosts = ["maya"] families = ["model", "animation", "pointcache"] step = 1.0 stepSave = 1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index e461499d88..6c76e8173c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -1,18 +1,16 @@ import os import sys - -from maya import cmds - -import pyblish.api import tempfile +import pyblish.api from ayon_core.lib import run_subprocess -from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractImportReference(publish.Extractor, +class ExtractImportReference(MayaExtractorPlugin, OptionalPyblishPluginMixin): """ @@ -24,7 +22,6 @@ class ExtractImportReference(publish.Extractor, label = "Extract Import Reference" order = pyblish.api.ExtractorOrder - 0.48 - hosts = ["maya"] families = ["renderlayer", "workfile"] optional = True tmp_format = "_tmp" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py index b025a1605a..5f398e2fd5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py @@ -1,19 +1,17 @@ +import json import math import os -import json +from ayon_api import get_representation_by_id +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds from maya.api import OpenMaya as om -from ayon_api import get_representation_by_id - -from ayon_core.pipeline import publish -class ExtractLayout(publish.Extractor): +class ExtractLayout(MayaExtractorPlugin): """Extract a layout.""" label = "Extract Layout" - hosts = ["maya"] families = ["layout"] project_container = "AVALON_CONTAINERS" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index f6b5e7d5a8..ec27e762b5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -1,31 +1,29 @@ # -*- coding: utf-8 -*- """Maya look extractor.""" -import os -import sys import contextlib import json import logging -import tempfile +import os import platform +import sys +import tempfile from abc import ABCMeta, abstractmethod from collections import OrderedDict -import six import attr import pyblish.api - -from maya import cmds # noqa - +import six from ayon_core.lib import ( - find_executable, - source_hash, - run_subprocess, - get_oiio_tool_args, ToolNotFoundError, + find_executable, + get_oiio_tool_args, + run_subprocess, + source_hash, ) - -from ayon_core.pipeline import publish, KnownPublishError +from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa # Modes for transfer COPY = 1 @@ -407,7 +405,7 @@ class MakeTX(TextureProcessor): return False -class ExtractLook(publish.Extractor): +class ExtractLook(MayaExtractorPlugin): """Extract Look (Maya Scene + JSON) Only extracts the sets (shadingEngines and alike) alongside a .json file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index bc0a9afd97..473a26ce8f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -2,26 +2,21 @@ """Extract data as Maya scene (raw).""" import os +from ayon_core.lib import BoolDef +from ayon_core.pipeline import AVALON_CONTAINER_ID, AYON_CONTAINER_ID +from ayon_core.pipeline.publish import AYONPyblishPluginMixin +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_maya.api.lib import maintained_selection -from ayon_core.pipeline import ( - AYON_CONTAINER_ID, - AVALON_CONTAINER_ID, - publish, -) -from ayon_core.pipeline.publish import AYONPyblishPluginMixin -from ayon_core.lib import BoolDef - -class ExtractMayaSceneRaw(publish.Extractor, AYONPyblishPluginMixin): +class ExtractMayaSceneRaw(MayaExtractorPlugin, AYONPyblishPluginMixin): """Extract as Maya Scene (raw). This will preserve all references, construction history, etc. """ label = "Maya Scene (Raw)" - hosts = ["maya"] families = ["mayaAscii", "mayaScene", "setdress", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index b6f6529ca5..4ae0445055 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -1,13 +1,12 @@ -import os -import six -import json import contextlib - -from maya import cmds +import json +import os import pyblish.api -from ayon_core.pipeline import publish +import six from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds @contextlib.contextmanager @@ -112,14 +111,13 @@ def usd_export_attributes(nodes, attrs=None, attr_prefixes=None, mapping=None): dg_mod.undoIt() -class ExtractMayaUsd(publish.Extractor): +class ExtractMayaUsd(MayaExtractorPlugin): """Extractor for Maya USD Asset data. Upon publish a .usd (or .usdz) asset file will typically be written. """ label = "Extract Maya USD Asset" - hosts = ["maya"] families = ["mayaUsd"] @property diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index b439d05a1a..950e09fb29 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -2,13 +2,13 @@ """Extract model as Maya Scene.""" import os -from maya import cmds - from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractModel(publish.Extractor, +class ExtractModel(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract as Model (Maya Scene). @@ -25,7 +25,6 @@ class ExtractModel(publish.Extractor, """ label = "Model (Maya Scene)" - hosts = ["maya"] families = ["model"] scene_type = "ma" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index d69c179712..f951f255b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -2,11 +2,11 @@ import os from maya import cmds -from ayon_core.pipeline import publish from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractMultiverseLook(publish.Extractor): +class ExtractMultiverseLook(MayaExtractorPlugin): """Extractor for Multiverse USD look data. This will extract: @@ -34,7 +34,6 @@ class ExtractMultiverseLook(publish.Extractor): """ label = "Extract Multiverse USD Look" - hosts = ["maya"] families = ["mvLook"] scene_type = "usda" file_formats = ["usda", "usd"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index a787093648..3f86f23ee3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -1,15 +1,13 @@ import os -import six - -from maya import cmds -from maya import mel import pyblish.api -from ayon_core.pipeline import publish +import six from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds, mel -class ExtractMultiverseUsd(publish.Extractor): +class ExtractMultiverseUsd(MayaExtractorPlugin): """Extractor for Multiverse USD Asset data. This will extract settings for a Multiverse Write Asset operation: @@ -27,7 +25,6 @@ class ExtractMultiverseUsd(publish.Extractor): """ label = "Extract Multiverse USD Asset" - hosts = ["maya"] families = ["mvUsd"] scene_type = "usd" file_formats = ["usd", "usda", "usdz"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index eac150ec1a..648b5b3cc7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -1,12 +1,11 @@ import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractMultiverseUsdComposition(publish.Extractor): +class ExtractMultiverseUsdComposition(MayaExtractorPlugin): """Extractor of Multiverse USD Composition data. This will extract settings for a Multiverse Write Composition operation: @@ -24,7 +23,6 @@ class ExtractMultiverseUsdComposition(publish.Extractor): """ label = "Extract Multiverse USD Composition" - hosts = ["maya"] families = ["mvUsdComposition"] scene_type = "usd" # Order of `fileFormat` must match create_multiverse_usd_comp.py diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index d1e806da9f..b7469d3627 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,12 +1,11 @@ import os -from ayon_core.pipeline import publish from ayon_maya.api.lib import maintained_selection - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractMultiverseUsdOverride(publish.Extractor): +class ExtractMultiverseUsdOverride(MayaExtractorPlugin): """Extractor for Multiverse USD Override data. This will extract settings for a Multiverse Write Override operation: @@ -22,7 +21,6 @@ class ExtractMultiverseUsdOverride(publish.Extractor): """ label = "Extract Multiverse USD Override" - hosts = ["maya"] families = ["mvUsdOverride"] scene_type = "usd" # Order of `fileFormat` must match create_multiverse_usd_over.py diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 16204b6008..1daf37afde 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import os -from maya import cmds import pyblish.api -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractObj(publish.Extractor): +class ExtractObj(MayaExtractorPlugin): """Extract OBJ from Maya. This extracts reproducible OBJ exports ignoring any of the settings @@ -15,7 +15,6 @@ class ExtractObj(publish.Extractor): """ order = pyblish.api.ExtractorOrder - hosts = ["maya"] label = "Extract OBJ" families = ["model"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index 8a94b24e3a..f4388827a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -1,14 +1,12 @@ import os import clique - -from ayon_core.pipeline import publish from ayon_maya.api import lib - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractPlayblast(publish.Extractor): +class ExtractPlayblast(MayaExtractorPlugin): """Extract viewport playblast. Takes review camera and creates review Quicktime video based on viewport @@ -17,7 +15,6 @@ class ExtractPlayblast(publish.Extractor): """ label = "Extract Playblast" - hosts = ["maya"] families = ["review"] optional = True capture_preset = {} diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index 04a895ff41..cdbcb7c9f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -1,29 +1,28 @@ import os from collections import OrderedDict -from maya import cmds - -from ayon_core.pipeline import publish +from ayon_core.lib import ( + BoolDef, + EnumDef, + NumberDef, + TextDef, + UILabelDef, + UISeparatorDef, +) +from ayon_core.pipeline import KnownPublishError +from ayon_core.pipeline.publish import AYONPyblishPluginMixin from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import ( get_all_children, - suspended_refresh, + iter_visible_nodes_in_range, maintained_selection, - iter_visible_nodes_in_range + suspended_refresh, ) -from ayon_core.lib import ( - BoolDef, - TextDef, - NumberDef, - EnumDef, - UISeparatorDef, - UILabelDef, -) -from ayon_core.pipeline.publish import AYONPyblishPluginMixin -from ayon_core.pipeline import KnownPublishError +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractAlembic(publish.Extractor, AYONPyblishPluginMixin): +class ExtractAlembic(MayaExtractorPlugin, AYONPyblishPluginMixin): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index dd15622f5f..fb17768eb2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -1,22 +1,20 @@ import os -from maya import cmds - -from ayon_core.pipeline import publish from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import ( - suspended_refresh, + iter_visible_nodes_in_range, maintained_selection, - iter_visible_nodes_in_range + suspended_refresh, ) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractProxyAlembic(publish.Extractor): +class ExtractProxyAlembic(MayaExtractorPlugin): """Produce an alembic for bounding box geometry """ label = "Extract Proxy (Alembic)" - hosts = ["maya"] families = ["proxyAbc"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 9d0f4085a3..18b0282e83 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -2,23 +2,18 @@ """Redshift Proxy extractor.""" import os +from ayon_maya.api.lib import maintained_selection, renderlayer +from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api.render_setup_tools import ( + allow_export_from_render_setup_layer, +) from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import ( - maintained_selection, - renderlayer -) -from ayon_maya.api.render_setup_tools import ( - allow_export_from_render_setup_layer -) - -class ExtractRedshiftProxy(publish.Extractor): +class ExtractRedshiftProxy(MayaExtractorPlugin): """Extract the content of the instance to a redshift proxy file.""" label = "Redshift Proxy (.rs)" - hosts = ["maya"] families = ["redshiftproxy"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py index 4815033777..c8043e435e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py @@ -1,11 +1,11 @@ -import os import json +import os import maya.app.renderSetup.model.renderSetup as renderSetup -from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractRenderSetup(publish.Extractor): +class ExtractRenderSetup(MayaExtractorPlugin): """ Produce renderSetup template file @@ -13,7 +13,6 @@ class ExtractRenderSetup(publish.Extractor): """ label = "Extract RenderSetup" - hosts = ["maya"] families = ["rendersetup"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 58e4373d74..7568ee9b5b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -2,17 +2,15 @@ """Extract rig as Maya Scene.""" import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractRig(publish.Extractor): +class ExtractRig(MayaExtractorPlugin): """Extract rig as Maya Scene.""" label = "Extract Rig (Maya Scene)" - hosts = ["maya"] families = ["rig"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index 76e49d1588..549327d8a2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -4,12 +4,12 @@ import os from maya import cmds # noqa import pyblish.api -from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import fbx +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractSkeletonMesh(publish.Extractor, +class ExtractSkeletonMesh(MayaExtractorPlugin, OptionalPyblishPluginMixin): """Extract Rig in FBX format from Maya. @@ -21,7 +21,6 @@ class ExtractSkeletonMesh(publish.Extractor, """ order = pyblish.api.ExtractorOrder label = "Extract Skeleton Mesh" - hosts = ["maya"] families = ["rig.fbx"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index 2863e4460b..d2ecf7f158 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -1,12 +1,12 @@ -import os import glob +import os import tempfile -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractThumbnail(publish.Extractor): +class ExtractThumbnail(MayaExtractorPlugin): """Extract viewport thumbnail. Takes review camera and creates a thumbnail based on viewport @@ -15,7 +15,6 @@ class ExtractThumbnail(publish.Extractor): """ label = "Thumbnail" - hosts = ["maya"] families = ["review"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index f0096e37e3..66ea4b1b6c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -2,21 +2,16 @@ """Create Unreal Skeletal Mesh data to be extracted as FBX.""" import os +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import maintained_selection, suspended_refresh +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds # noqa -from ayon_core.pipeline import publish -from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.lib import ( - suspended_refresh, - maintained_selection -) - -class ExtractUnrealSkeletalMeshAbc(publish.Extractor): +class ExtractUnrealSkeletalMeshAbc(MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ label = "Extract Unreal Skeletal Mesh - Alembic" - hosts = ["maya"] families = ["skeletalMesh"] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 95e12795de..81135bbb92 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -3,12 +3,10 @@ import os from contextlib import contextmanager -from maya import cmds # noqa - import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import fbx +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa @contextmanager @@ -21,7 +19,7 @@ def renamed(original_name, renamed_name): cmds.rename(renamed_name, original_name) -class ExtractUnrealSkeletalMeshFbx(publish.Extractor): +class ExtractUnrealSkeletalMeshFbx(MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index 140a4e4147..b4ee55b9e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -2,19 +2,14 @@ """Create Unreal Static Mesh data to be extracted as FBX.""" import os +import pyblish.api +from ayon_maya.api import fbx +from ayon_maya.api.lib import maintained_selection, parent_nodes +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds # noqa -import pyblish.api -from ayon_core.pipeline import publish -from ayon_maya.api.lib import ( - parent_nodes, - maintained_selection -) -from ayon_maya.api import fbx - - -class ExtractUnrealStaticMesh(publish.Extractor): +class ExtractUnrealStaticMesh(MayaExtractorPlugin): """Extract Unreal Static Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py index 9a6b4ebaed..fb90e9ee2b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py @@ -1,18 +1,16 @@ import os +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractUnrealYetiCache(publish.Extractor): +class ExtractUnrealYetiCache(MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. """ label = "Extract Yeti Cache (Unreal)" - hosts = ["maya"] families = ["yeticacheUE"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index 581195c5da..04b037ef03 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -1,12 +1,11 @@ import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractVRayProxy(publish.Extractor): +class ExtractVRayProxy(MayaExtractorPlugin): """Extract the content of the instance to a vrmesh file Things to pay attention to: @@ -15,7 +14,6 @@ class ExtractVRayProxy(publish.Extractor): """ label = "VRay Proxy (.vrmesh)" - hosts = ["maya"] families = ["vrayproxy.vrmesh"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index d55c0ddef6..00c3f2b158 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -3,18 +3,16 @@ import os import re -from ayon_core.pipeline import publish -from ayon_maya.api.render_setup_tools import export_in_rs_layer from ayon_maya.api.lib import maintained_selection - +from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api.render_setup_tools import export_in_rs_layer from maya import cmds -class ExtractVrayscene(publish.Extractor): +class ExtractVrayscene(MayaExtractorPlugin): """Extractor for vrscene.""" label = "VRay Scene (.vrscene)" - hosts = ["maya"] families = ["vrayscene_layer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index 227c16d62a..c93da91207 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -1,15 +1,14 @@ +import copy import os import shutil -import copy - -from maya import cmds import pyblish.api from ayon_maya.api.alembic import extract_alembic -from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractWorkfileXgen(publish.Extractor): +class ExtractWorkfileXgen(MayaExtractorPlugin): """Extract Workfile Xgen. When submitting a render, we need to prep Xgen side car files. @@ -19,7 +18,6 @@ class ExtractWorkfileXgen(publish.Extractor): order = pyblish.api.ExtractorOrder - 0.499 label = "Extract Workfile Xgen" families = ["workfile"] - hosts = ["maya"] def get_render_max_frame_range(self, context): """Return start to end frame range including all renderlayers in diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index 61cad1dc33..47a8140ef6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -1,17 +1,19 @@ -import os import copy +import os import tempfile -from maya import cmds import xgenm - -from ayon_core.pipeline import publish from ayon_maya.api.lib import ( - maintained_selection, attribute_values, write_xgen_file, delete_after + attribute_values, + delete_after, + maintained_selection, + write_xgen_file, ) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractXgen(publish.Extractor): +class ExtractXgen(MayaExtractorPlugin): """Extract Xgen Workflow: @@ -23,7 +25,6 @@ class ExtractXgen(publish.Extractor): """ label = "Extract Xgen" - hosts = ["maya"] families = ["xgen"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py index b9cd7a1be5..e3e9a76d72 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py @@ -1,19 +1,17 @@ -import os import json +import os +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractYetiCache(publish.Extractor): +class ExtractYetiCache(MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. """ label = "Extract Yeti Cache" - hosts = ["maya"] families = ["yetiRig", "yeticache"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 8ef43fbf13..0c21118b22 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- """Extract Yeti rig.""" -import os -import json import contextlib +import json +import os -from maya import cmds - -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds @contextlib.contextmanager @@ -90,11 +89,10 @@ def yetigraph_attribute_values(assumed_destination, resources): pass -class ExtractYetiRig(publish.Extractor): +class ExtractYetiRig(MayaExtractorPlugin): """Extract the Yeti rig to a Maya Scene and write the Yeti rig data.""" label = "Extract Yeti Rig" - hosts = ["maya"] families = ["yetiRig"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py index a9378df8e1..62c5e9a8b2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin -class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): +class IncrementCurrentFileDeadline(MayaContextPlugin): """Increment the current file. Saves the current maya scene with an increased version number. @@ -10,15 +11,14 @@ class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 - hosts = ["maya"] families = ["workfile"] optional = True def process(self, context): - from maya import cmds from ayon_core.lib import version_up from ayon_core.pipeline.publish import get_errored_plugins_from_context + from maya import cmds errored_plugins = get_errored_plugins_from_context(context) if any(plugin.__name__ == "MayaSubmitDeadline" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py index 759aa23258..923614c8d1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class ResetXgenAttributes(pyblish.api.InstancePlugin): +class ResetXgenAttributes(MayaInstancePlugin): """Reset Xgen attributes. When the incremental save of the workfile triggers, the Xgen attributes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py index eb7c06a113..f062f0d947 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py @@ -1,18 +1,16 @@ import pyblish.api from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_lock_enabled, - remove_workfile_lock + remove_workfile_lock, ) +from ayon_maya.api.plugin import MayaContextPlugin -class SaveCurrentScene(pyblish.api.ContextPlugin): - """Save current scene - - """ +class SaveCurrentScene(MayaContextPlugin): + """Save current scene.""" label = "Save current file" order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["maya"] families = ["renderlayer", "workfile"] def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index bd69e7a3cd..f68418770b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -1,12 +1,13 @@ import inspect -import pyblish.api +import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin -from ayon_core.pipeline.publish import RepairAction, PublishValidationError +from ayon_core.pipeline.publish import PublishValidationError, RepairAction +from ayon_maya.api.plugin import MayaInstancePlugin class ValidateAlembicDefaultsPointcache( - pyblish.api.InstancePlugin, OptionalPyblishPluginMixin + MayaInstancePlugin, OptionalPyblishPluginMixin ): """Validate the attributes on the instance are defaults. @@ -15,7 +16,6 @@ class ValidateAlembicDefaultsPointcache( order = pyblish.api.ValidatorOrder families = ["pointcache"] - hosts = ["maya"] label = "Validate Alembic Options Defaults" actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index 17b9bf4e85..b11e6ec930 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -1,13 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAnimationContent(pyblish.api.InstancePlugin, +class ValidateAnimationContent(MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'animation' product type @@ -17,7 +17,6 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["animation"] label = "Animation Content" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index 6d53608fb2..ba8a50ea40 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -1,19 +1,18 @@ -import maya.cmds as cmds - -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairAction, ValidateContentsOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin, + apply_plugin_settings_automatically, get_plugin_settings, - apply_plugin_settings_automatically ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin, +class ValidateOutRelatedNodeIds(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 43c7b99ece..7f8015443d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -1,21 +1,20 @@ -from maya import cmds - import pyblish.api - from ayon_core.pipeline.publish import ( - ValidateContentsOrder, PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) from ayon_maya.api.lib import is_visible +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateArnoldSceneSource(pyblish.api.InstancePlugin): +class ValidateArnoldSceneSource(MayaInstancePlugin): """Validate Arnold Scene Source. Ensure no nodes are hidden. """ order = ValidateContentsOrder - hosts = ["maya"] families = ["ass", "assProxy"] label = "Validate Arnold Scene Source" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index 546d65e84c..0da1a26293 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -1,14 +1,14 @@ -import pyblish.api -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateArnoldSceneSourceCbid(pyblish.api.InstancePlugin, +class ValidateArnoldSceneSourceCbid(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Arnold Scene Source Cbid. @@ -16,7 +16,6 @@ class ValidateArnoldSceneSourceCbid(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["assProxy"] label = "Validate Arnold Scene Source CBID" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py index 6e65eee592..030e2fb950 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py @@ -4,21 +4,20 @@ import types import maya.cmds as cmds from mtoa.core import createOptions -import pyblish.api from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssRelativePaths(pyblish.api.InstancePlugin, +class ValidateAssRelativePaths(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure exporting ass file has set relative texture paths""" order = ValidateContentsOrder - hosts = ['maya'] families = ['ass'] label = "ASS has relative texture paths" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index c5ac22dd84..468f9aee9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -1,13 +1,14 @@ -import pyblish.api -import maya.cmds as cmds import ayon_maya.api.action +import maya.cmds as cmds +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssemblyName(pyblish.api.InstancePlugin, +class ValidateAssemblyName(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Ensure Assembly name ends with `GRP` diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 51b9485999..15119fa3c2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -1,13 +1,15 @@ -import pyblish.api import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin, + +class ValidateAssemblyNamespaces(MayaInstancePlugin, OptionalPyblishPluginMixin): - """Ensure namespaces are not nested + """Ensure namespaces are not nested. In the outliner an item in a normal namespace looks as following: props_desk_01_:modelDefault diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index c5f0b6fd65..9d2aa98c24 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -1,15 +1,15 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, +class ValidateAssemblyModelTransforms(MayaInstancePlugin, OptionalPyblishPluginMixin): """Verify only root nodes of the loaded asset have transformations. @@ -98,9 +98,8 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, """ - from qtpy import QtWidgets - from ayon_maya.api import lib + from qtpy import QtWidgets # Store namespace in variable, cosmetics thingy choice = QtWidgets.QMessageBox.warning( diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 08620e22bf..2f52c92200 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -1,16 +1,18 @@ import json from collections import defaultdict -import pyblish.api +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api.lib import set_attribute +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_maya.api.lib import set_attribute -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - ValidateContentsOrder) - -class ValidateAttributes(pyblish.api.InstancePlugin, +class ValidateAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure attributes are consistent. @@ -25,7 +27,6 @@ class ValidateAttributes(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Validate Attributes" - hosts = ["maya"] actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 95d1e76b83..1922b22109 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -1,15 +1,14 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateCameraAttributes(pyblish.api.InstancePlugin, +class ValidateCameraAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera has no invalid attribute keys or values. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 3ce512aebc..988b16cec2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -1,4 +1,3 @@ -import pyblish.api from maya import cmds import ayon_maya.api.action @@ -6,9 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, OptionalPyblishPluginMixin) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateCameraContents(pyblish.api.InstancePlugin, +class ValidateCameraContents(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera instance contents. @@ -21,7 +21,6 @@ class ValidateCameraContents(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ['camera'] - hosts = ['maya'] label = 'Camera Contents' actions = [ayon_maya.api.action.SelectInvalidAction] validate_shapes = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index 40d7297444..d89244b5f7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, PublishValidationError, - RepairAction + RepairAction, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateColorSets(pyblish.api.InstancePlugin, +class ValidateColorSets(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals @@ -20,7 +19,6 @@ class ValidateColorSets(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh ColorSets' actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py index 045e22545c..c863778e07 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py @@ -1,16 +1,16 @@ import inspect import pyblish.api - -from maya import cmds from ayon_core.pipeline.publish import ( - context_plugin_should_run, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + context_plugin_should_run, ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateCurrentRenderLayerIsRenderable(pyblish.api.ContextPlugin, +class ValidateCurrentRenderLayerIsRenderable(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if current render layer has a renderable camera. @@ -25,7 +25,6 @@ class ValidateCurrentRenderLayerIsRenderable(pyblish.api.ContextPlugin, label = "Current Render Layer Has Renderable Camera" order = pyblish.api.ValidatorOrder - hosts = ["maya"] families = ["renderlayer"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index ac773a586a..62aafa9f53 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -1,13 +1,15 @@ -import pyblish.api +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_maya.api.lib import maintained_selection -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) - -class ValidateCycleError(pyblish.api.InstancePlugin, +class ValidateCycleError(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes produce no cycle errors.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index 20feee8756..a5834d9bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -1,20 +1,16 @@ -import pyblish.api - -from maya import cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) -from ayon_maya.api.lib_rendersetup import ( - get_attr_overrides, - get_attr_in_layer, ) +from ayon_maya.api.lib_rendersetup import get_attr_in_layer, get_attr_overrides +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds from maya.app.renderSetup.model.override import AbsOverride -class ValidateFrameRange(pyblish.api.InstancePlugin, +class ValidateFrameRange(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the frame ranges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py index 3735dbb74c..d620de49c1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py @@ -1,15 +1,15 @@ import os + +from ayon_core.pipeline import ( + OptionalPyblishPluginMixin, + PublishValidationError, +) +from ayon_core.pipeline.publish import RepairAction, ValidateContentsOrder +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - RepairAction, - ValidateContentsOrder -) -from ayon_core.pipeline import PublishValidationError, OptionalPyblishPluginMixin - -class ValidateGLSLMaterial(pyblish.api.InstancePlugin, +class ValidateGLSLMaterial(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader @@ -17,7 +17,6 @@ class ValidateGLSLMaterial(pyblish.api.InstancePlugin, order = ValidateContentsOrder + 0.1 families = ['gltf'] - hosts = ['maya'] label = 'GLSL Shader for GLTF' actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py index d783da8b5c..588c86e297 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py @@ -1,16 +1,15 @@ - from maya import cmds -import pyblish.api from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateGLSLPlugin(pyblish.api.InstancePlugin, +class ValidateGLSLPlugin(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader @@ -18,7 +17,6 @@ class ValidateGLSLPlugin(pyblish.api.InstancePlugin, order = ValidateContentsOrder + 0.15 families = ['gltf'] - hosts = ['maya'] label = 'maya2glTF plugin' actions = [RepairAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index de20a7c150..2fc5a3910f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -1,16 +1,15 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): +class ValidateInstanceHasMembers(MayaInstancePlugin): """Validates instance objectSet has *any* members.""" order = ValidateContentsOrder - hosts = ["maya"] label = 'Instance has members' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index f67845bcd5..3d1d051484 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -2,17 +2,17 @@ """Validate if instance asset is the same as context asset.""" from __future__ import absolute_import -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateInstanceInContext(pyblish.api.InstancePlugin, +class ValidateInstanceInContext(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validator to check if instance asset match context asset. @@ -26,7 +26,6 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Instance in same Context" optional = True - hosts = ["maya"] actions = [ ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py index df9ca0bf13..fe18d9359e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py @@ -1,11 +1,11 @@ -import pyblish.api import string import six from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin # Allow only characters, numbers and underscore allowed = set(string.ascii_lowercase + @@ -18,7 +18,7 @@ def validate_name(product_name): return all(x in allowed for x in product_name) -class ValidateSubsetName(pyblish.api.InstancePlugin): +class ValidateSubsetName(MayaInstancePlugin): """Validates product name has only valid characters""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py index a05920a21e..b83f411681 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py @@ -7,15 +7,15 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateLoadedPlugin(pyblish.api.ContextPlugin, +class ValidateLoadedPlugin(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure there are no unauthorized loaded plugins""" label = "Loaded Plugin" order = pyblish.api.ValidatorOrder - host = ["maya"] actions = [RepairContextAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index 4709a7bb1e..31e4073807 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -1,15 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, - ValidateContentsOrder + ValidateContentsOrder, ) - - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds # noqa -class ValidateLookContents(pyblish.api.InstancePlugin): +class ValidateLookContents(MayaInstancePlugin): """Validate look instance contents Rules: @@ -25,7 +23,6 @@ class ValidateLookContents(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Data Contents' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py index cfd4156124..2dca5a4a90 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py @@ -1,13 +1,13 @@ -from maya import cmds - import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, RepairContextAction, - PublishValidationError ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateLookDefaultShadersConnections(pyblish.api.ContextPlugin): +class ValidateLookDefaultShadersConnections(MayaContextPlugin): """Validate default shaders in the scene have their default connections. For example the standardSurface1 or lambert1 (maya 2023 and before) could @@ -22,7 +22,6 @@ class ValidateLookDefaultShadersConnections(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder - 0.4999 families = ['look'] - hosts = ['maya'] label = 'Look Default Shader Connections' actions = [RepairContextAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index 5a4ccc16ca..e1d956e060 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -1,16 +1,16 @@ from collections import defaultdict -from maya import cmds -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): +class ValidateLookIdReferenceEdits(MayaInstancePlugin): """Validate nodes in look have no reference edits to cbId. Note: @@ -22,7 +22,6 @@ class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Id Reference Edits' actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index 21a056c81c..a93815f275 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -1,14 +1,13 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): +class ValidateLookNoDefaultShaders(MayaInstancePlugin): """Validate if any node has a connection to a default shader. This checks whether the look has any members of: @@ -28,7 +27,6 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): order = ValidateContentsOrder + 0.01 families = ['look'] - hosts = ['maya'] label = 'Look No Default Shaders' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index 97c790c8c6..21de06b061 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -1,13 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateLookSets(pyblish.api.InstancePlugin): +class ValidateLookSets(MayaInstancePlugin): """Validate if any sets relationships are not being collected. A shader can be assigned to a node that is missing a Colorbleed ID. @@ -42,7 +42,6 @@ class ValidateLookSets(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Sets' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 25e4eb046d..8c0a92b012 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShadingEngine(pyblish.api.InstancePlugin, +class ValidateShadingEngine(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all shading engines are named after the surface material. @@ -19,7 +18,6 @@ class ValidateShadingEngine(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ["look"] - hosts = ["maya"] label = "Look Shading Engine Naming" actions = [ ayon_maya.api.action.SelectInvalidAction, RepairAction diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index de0a9619b4..0cfb18df96 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -1,12 +1,13 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - PublishValidationError, ValidateContentsOrder) + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateSingleShader(pyblish.api.InstancePlugin): +class ValidateSingleShader(MayaInstancePlugin): """Validate all nurbsSurfaces and meshes have exactly one shader assigned. This will error if a shape has no shaders or more than one shader. @@ -15,7 +16,6 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Single Shader Per Shape' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 8171e7e8fa..16c7920642 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -1,23 +1,20 @@ -import maya.cmds as cmds - -import pyblish.api - import ayon_maya.api.lib as mayalib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairContextAction, ValidateSceneOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaContextPlugin -class ValidateMayaUnits(pyblish.api.ContextPlugin, +class ValidateMayaUnits(MayaContextPlugin, OptionalPyblishPluginMixin): """Check if the Maya units are set correct""" order = ValidateSceneOrder label = "Maya Units" - hosts = ['maya'] actions = [RepairContextAction] validate_linear_units = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index 5a9841b6c0..26aac9c944 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -1,23 +1,22 @@ -from maya import cmds -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api.lib import ( - maintained_selection, - delete_after, - undo_chunk, - get_attribute, - set_attribute -) from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError ) +from ayon_maya.api.lib import ( + delete_after, + get_attribute, + maintained_selection, + set_attribute, + undo_chunk, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshArnoldAttributes(pyblish.api.InstancePlugin, +class ValidateMeshArnoldAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the mesh has default Arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index ad2b08ba19..419ca3c3c3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshEmpty(pyblish.api.InstancePlugin): +class ValidateMeshEmpty(MayaInstancePlugin): """Validate meshes have some vertices. Its possible to have meshes without any vertices. To replicate @@ -17,7 +16,6 @@ class ValidateMeshEmpty(pyblish.api.InstancePlugin): """ order = ValidateMeshOrder - hosts = ["maya"] families = ["model"] label = "Mesh Empty" actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 25da24db1c..6f45cba973 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshHasUVs(pyblish.api.InstancePlugin, +class ValidateMeshHasUVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the current mesh has UVs. @@ -21,7 +20,6 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Has UVs' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index ee6acd1685..23a38aedd8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, +class ValidateMeshLaminaFaces(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have lamina faces. @@ -18,7 +17,6 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Lamina Faces' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index f4d907636c..f1d347df97 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -1,16 +1,15 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateMeshNgons(pyblish.api.InstancePlugin, +class ValidateMeshNgons(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have ngons @@ -22,7 +21,6 @@ class ValidateMeshNgons(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Mesh ngons" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index 7868015a30..58c3a9bc0f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, +class ValidateMeshNoNegativeScale(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have a negative scale. @@ -30,7 +29,6 @@ class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh No Negative Scale' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index dc561be981..9e7461772e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -1,13 +1,12 @@ -from maya import cmds, mel - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, + OptionalPyblishPluginMixin, PublishXmlValidationError, RepairAction, - OptionalPyblishPluginMixin + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel def poly_cleanup(version=4, @@ -101,7 +100,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNonManifold(pyblish.api.InstancePlugin, +class ValidateMeshNonManifold(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have non-manifold edges or vertices @@ -111,7 +110,6 @@ class ValidateMeshNonManifold(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Non-Manifold Edges/Vertices' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index 7830e10f2a..f891a4f7de 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -1,16 +1,15 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateMeshOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, +class ValidateMeshNonZeroEdgeLength(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have edges with a zero length. @@ -23,7 +22,6 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, order = ValidateMeshOrder families = ['model'] - hosts = ['maya'] label = 'Mesh Edge Length Non Zero' actions = [ayon_maya.api.action.SelectInvalidAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index 2d8370166b..c6b6786f24 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -1,14 +1,13 @@ -from maya import cmds -import maya.api.OpenMaya as om2 - -import pyblish.api import ayon_maya.api.action +import maya.api.OpenMaya as om2 from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -18,7 +17,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, +class ValidateMeshNormalsUnlocked(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals @@ -28,7 +27,6 @@ class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Normals Unlocked' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index 9606ec3202..5e9a4c3b60 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -1,16 +1,15 @@ import math -from six.moves import xrange - -from maya import cmds -import maya.api.OpenMaya as om -import pyblish.api import ayon_maya.api.action +import maya.api.OpenMaya as om from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds +from six.moves import xrange def _as_report_list(values, prefix="- ", suffix="\n"): @@ -236,7 +235,7 @@ class GetOverlappingUVs(object): return faces -class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, +class ValidateMeshHasOverlappingUVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate the current mesh overlapping UVs. @@ -245,7 +244,6 @@ class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Has Overlapping UVs' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 2e91df87a3..9f9ca0c0d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -1,13 +1,12 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def pairs(iterable): @@ -80,7 +79,7 @@ def disconnect(node_a, node_b): cmds.disconnectAttr(source, input) -class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, +class ValidateMeshShaderConnections(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure mesh shading engine connections are valid. @@ -93,7 +92,6 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = "Mesh Shader Connections" actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index d807833a77..e7fb6d9ae0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -1,17 +1,16 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, +class ValidateMeshSingleUVSet(MayaInstancePlugin, OptionalPyblishPluginMixin): """Warn on multiple UV sets existing for each polygon mesh. @@ -22,7 +21,6 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model', 'pointcache'] optional = True label = "Mesh Single UV Set" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index c4d3abc624..bce69c8279 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -1,18 +1,17 @@ import inspect -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, +class ValidateMeshUVSetMap1(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate model's default set exists and is named 'map1'. @@ -24,7 +23,6 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] optional = True label = "Mesh has map1 UV Set" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index 9dbdc8fd2b..a63e9a0727 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -1,17 +1,16 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action -from ayon_maya.api.lib import len_flattened from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.lib import len_flattened +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, +class ValidateMeshVerticesHaveEdges(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes have only vertices that are connected to edges. @@ -32,7 +31,6 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Vertices Have Edges' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index b06b45db81..32435e9d86 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -1,18 +1,17 @@ import inspect +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - -class ValidateModelContent(pyblish.api.InstancePlugin, +class ValidateModelContent(MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'model' product type @@ -21,7 +20,6 @@ class ValidateModelContent(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Model Content" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 980565afad..602c4ff371 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -1,18 +1,18 @@ import os -import pyblish.api + import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) - +from ayon_maya.api.plugin import MayaInstancePlugin COLOUR_SPACES = ['sRGB', 'linear', 'auto'] MIPMAP_EXTENSIONS = ['tdl'] -class ValidateMvLookContents(pyblish.api.InstancePlugin, +class ValidateMvLookContents(MayaInstancePlugin, OptionalPyblishPluginMixin): order = ValidateContentsOrder families = ['mvLook'] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index 0e1f179483..6e6b04bfea 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoAnimation(pyblish.api.InstancePlugin, +class ValidateNoAnimation(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no keyframes on nodes in the Instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index be469cd4df..e5d938e337 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, +class ValidateNoDefaultCameras(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are in the instance. @@ -26,7 +25,6 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['camera'] label = "No Default Cameras" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index 0d7b67e179..a357b9cdec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -1,14 +1,12 @@ +import ayon_maya.api.action import maya.cmds as cmds - -import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) - -import ayon_maya.api.action +from ayon_maya.api.plugin import MayaInstancePlugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -25,12 +23,11 @@ def get_namespace(node_name): return node_name.rpartition(":")[0] -class ValidateNoNamespace(pyblish.api.InstancePlugin, +class ValidateNoNamespace(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure the nodes don't have a namespace""" order = ValidateContentsOrder - hosts = ['maya'] families = ['model'] label = 'No Namespaces' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 876be073a0..581b304f60 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -1,13 +1,12 @@ -import maya.cmds as cmds - -import pyblish.api import ayon_maya.api.action +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -33,7 +32,7 @@ def has_shape_children(node): return True -class ValidateNoNullTransforms(pyblish.api.InstancePlugin, +class ValidateNoNullTransforms(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no null transforms are in the scene. @@ -46,7 +45,6 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['model'] label = 'No Empty/Null Transforms' actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 8b4d873014..4f55f5f64f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoUnknownNodes(pyblish.api.InstancePlugin, +class ValidateNoUnknownNodes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Checks to see if there are any unknown nodes in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py index 2d59608e11..f54e0ddcd1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py @@ -1,9 +1,11 @@ import pyblish.api -from maya import cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds + def _as_report_list(values, prefix="- ", suffix="\n"): """Return list as bullet point list for a report""" @@ -12,7 +14,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoVRayMesh(pyblish.api.InstancePlugin, +class ValidateNoVRayMesh(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate there are no VRayMesh objects in the instance""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index 810dbc4fa1..a5b1f50044 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -1,14 +1,13 @@ -import pyblish.api - from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishXmlValidationError ) import ayon_maya.api.action from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateNodeIDs(pyblish.api.InstancePlugin): +class ValidateNodeIDs(MayaInstancePlugin): """Validate nodes have a Colorbleed Id. When IDs are missing from nodes *save your scene* and they should be @@ -19,7 +18,6 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Instance Nodes Have ID' - hosts = ['maya'] families = ["model", "look", "rig", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 4fc8f776ef..28e6bf29b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -1,13 +1,15 @@ -import pyblish.api +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - PublishValidationError, RepairAction, ValidateContentsOrder) - -class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): +class ValidateNodeIdsDeformedShape(MayaInstancePlugin): """Validate if deformed shapes have related IDs to the original shapes. When a deformer is applied in the scene on a referenced mesh that already @@ -19,7 +21,6 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Deformed shape ids' actions = [ ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index a1fde89fc3..6465878889 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -1,13 +1,14 @@ -import pyblish.api import ayon_api - import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( - PublishValidationError, ValidatePipelineOrder) + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): +class ValidateNodeIdsInDatabase(MayaInstancePlugin): """Validate if the CB Id is related to an folder in the database All nodes with the `cbId` attribute will be validated to ensure that @@ -20,7 +21,6 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Node Ids in Database' - hosts = ['maya'] families = ["*"] actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index 0ad497d119..eaf1d8a250 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -1,13 +1,16 @@ import inspect import uuid from collections import defaultdict -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidatePipelineOrder) from ayon_api import get_folders +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin def is_valid_uuid(value) -> bool: @@ -19,13 +22,12 @@ def is_valid_uuid(value) -> bool: return True -class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, +class ValidateNodeIDsRelated(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes have a related `cbId` to the instance.data[folderPath]""" order = ValidatePipelineOrder label = 'Node Ids Related (ID)' - hosts = ['maya'] families = ["model", "look", "rig"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index ae04a48678..ee32b1decc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -1,17 +1,16 @@ from collections import defaultdict -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidatePipelineOrder, - PublishValidationError -) import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + PublishValidationError, + ValidatePipelineOrder, +) from ayon_maya.api import lib - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): +class ValidateNodeIdsUnique(MayaInstancePlugin): """Validate the nodes in the instance have a unique Colorbleed Id Here we ensure that what has been added to the instance is unique @@ -19,7 +18,6 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Non Duplicate Instance Members (ID)' - hosts = ['maya'] families = ["model", "look", "rig", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 1220282d0c..735b98dfe9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -1,16 +1,14 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, +class ValidateNodeNoGhosting(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure nodes do not have ghosting enabled. @@ -24,7 +22,6 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['model', 'rig'] label = "No Ghosting" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index ef6f97371f..4ab03f19c8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -1,26 +1,23 @@ import os +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.action import SelectInvalidAction +from ayon_maya.api.lib import pairwise +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_maya.api.lib import pairwise -from ayon_maya.api.action import SelectInvalidAction -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidatePluginPathAttributes(pyblish.api.InstancePlugin, +class ValidatePluginPathAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate plug-in path attributes point to existing file paths. """ order = ValidateContentsOrder - hosts = ['maya'] families = ["workfile"] label = "Plug-in Path Attributes" actions = [SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py index 117f7df822..72a69302a8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py @@ -1,18 +1,16 @@ import os -import pyblish.api - -from maya import cmds - from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderImageRule(pyblish.api.InstancePlugin, +class ValidateRenderImageRule(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Maya Workpace "images" file rule matches project settings. @@ -24,7 +22,6 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Images File Rule (Workspace)" - hosts = ["maya"] families = ["renderlayer"] actions = [RepairAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 1692b90993..85c304e0cd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -1,21 +1,18 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin, +class ValidateRenderNoDefaultCameras(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are to be rendered.""" order = ValidateContentsOrder - hosts = ['maya'] families = ['renderlayer'] label = "No Default Cameras Renderable" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index cb03e68642..a50f4eeab5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -1,19 +1,18 @@ -import re import inspect - -import pyblish.api -from maya import cmds +import re import ayon_maya.api.action -from ayon_maya.api.lib_rendersettings import RenderSettings from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, +class ValidateRenderSingleCamera(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate renderable camera count for layer and token. @@ -23,7 +22,6 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Render Single Camera" - hosts = ['maya'] families = ["renderlayer", "vrayscene"] actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index 92d97776e1..dd9cca19a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -1,13 +1,14 @@ import ayon_api -import pyblish.api - import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, + +class ValidateRenderLayerAOVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate created AOVs / RenderElement is registered in the database @@ -26,7 +27,6 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder + 0.1 label = "Render Passes / AOVs Are Registered" - hosts = ["maya"] families = ["renderlayer"] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index d5a9ea778c..5e3b6c541f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -3,17 +3,16 @@ import re from collections import OrderedDict -from maya import cmds, mel - -import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) from ayon_maya.api import lib from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel def convert_to_int_or_float(string_value): @@ -38,7 +37,7 @@ def get_redshift_image_format_labels(): return mel.eval("{0}={0}".format(var)) -class ValidateRenderSettings(pyblish.api.InstancePlugin, +class ValidateRenderSettings(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the global render settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index aae3940e02..63c0b9dab1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -1,21 +1,21 @@ import pyblish.api from ayon_core.pipeline import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) -from maya import cmds from ayon_core.pipeline.publish import RepairAction from ayon_maya.api import lib from ayon_maya.api.lib import reset_scene_resolution +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateResolution(pyblish.api.InstancePlugin, +class ValidateResolution(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the render resolution setting aligned with DB""" order = pyblish.api.ValidatorOrder families = ["renderlayer"] - hosts = ["maya"] label = "Validate Resolution" actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py index 725e86450d..e3c7d65000 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py @@ -1,14 +1,14 @@ import os from collections import defaultdict -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateResources(pyblish.api.InstancePlugin): +class ValidateResources(MayaInstancePlugin): """Validates mapped resources. These are external files to the current application, for example diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py index fcfd851368..c38c132347 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py @@ -1,11 +1,10 @@ -import pyblish.api - from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateReview(pyblish.api.InstancePlugin): +class ValidateReview(MayaInstancePlugin): """Validate review.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index b8b8728888..ad642c34b2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -1,14 +1,14 @@ -import pyblish.api -from maya import cmds import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRigContents(pyblish.api.InstancePlugin, +class ValidateRigContents(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure rig contains pipeline-critical content @@ -20,7 +20,6 @@ class ValidateRigContents(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Rig Contents" - hosts = ["maya"] families = ["rig"] action = [ayon_maya.api.action.SelectInvalidAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index aed0800160..0bbbecc73d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -1,18 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api.lib import undo_chunk +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) -import ayon_maya.api.action -from ayon_maya.api.lib import undo_chunk - - -class ValidateRigControllers(pyblish.api.InstancePlugin, +class ValidateRigControllers(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig controllers. @@ -33,7 +31,6 @@ class ValidateRigControllers(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Rig Controllers" - hosts = ["maya"] families = ["rig"] optional = True actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index 4bc47c5949..4589603bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -1,19 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) - -from ayon_maya.api import lib -import ayon_maya.api.action - - -class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, +class ValidateRigControllersArnoldAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig control curves have no keyable arnold attributes. @@ -35,7 +32,6 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Rig Controllers (Arnold Attributes)" - hosts = ["maya"] families = ["rig"] optional = False actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index d45af574ab..e9e43a9902 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -1,18 +1,16 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRigJointsHidden(pyblish.api.InstancePlugin, +class ValidateRigJointsHidden(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all joints are hidden visually. @@ -25,7 +23,6 @@ class ValidateRigJointsHidden(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['rig'] label = "Joints Hidden" actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index e5404aae7e..163e2007dd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -1,20 +1,18 @@ -import maya.cmds as cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api import lib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairAction, ValidateContentsOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin, + apply_plugin_settings_automatically, get_plugin_settings, - apply_plugin_settings_automatically ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, +class ValidateRigOutSetNodeIds(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes. @@ -27,7 +25,6 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ["rig"] - hosts = ['maya'] label = 'Rig Out Set Node Ids' actions = [ ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index c5fee5ddc6..2a965173fa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -1,16 +1,14 @@ from collections import defaultdict -from maya import cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api.lib import get_id, set_id from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.lib import get_id, set_id +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def get_basename(node): @@ -18,7 +16,7 @@ def get_basename(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateRigOutputIds(pyblish.api.InstancePlugin): +class ValidateRigOutputIds(MayaInstancePlugin): """Validate rig output ids. Ids must share the same id as similarly named nodes in the scene. This is @@ -27,7 +25,6 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin): """ order = ValidateContentsOrder + 0.05 label = "Rig Output Ids" - hosts = ["maya"] families = ["rig"] actions = [RepairAction, ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py index c7d5de2050..d8885cc530 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py @@ -1,10 +1,11 @@ import os import maya.cmds as cmds -import pyblish.api - from ayon_core.pipeline.publish import ( - PublishValidationError, ValidatePipelineOrder) + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api.plugin import MayaContextPlugin def is_subdir(path, root_dir): @@ -26,11 +27,10 @@ def is_subdir(path, root_dir): return True -class ValidateSceneSetWorkspace(pyblish.api.ContextPlugin): +class ValidateSceneSetWorkspace(MayaContextPlugin): """Validate the scene is inside the currently set Maya workspace""" order = ValidatePipelineOrder - hosts = ['maya'] label = 'Maya Workspace Set' def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py index f88e33fdfb..ae5493ffe4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py @@ -1,16 +1,15 @@ -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSetdressRoot(pyblish.api.InstancePlugin): +class ValidateSetdressRoot(MayaInstancePlugin): """Validate if set dress top root node is published.""" order = ValidateContentsOrder label = "SetDress Root" - hosts = ["maya"] families = ["setdress"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index ed1ea17966..77dc24d1a4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -1,14 +1,16 @@ import re -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShaderName(pyblish.api.InstancePlugin, +class ValidateShaderName(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate shader name assigned. @@ -18,7 +20,6 @@ class ValidateShaderName(pyblish.api.InstancePlugin, optional = True order = ValidateContentsOrder families = ["look"] - hosts = ['maya'] label = 'Validate Shaders Name' actions = [ayon_maya.api.action.SelectInvalidAction] regex = r'(?P.*)_(.*)_SHD' diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index 5355cd9cfd..bd9f0cf1d7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -1,23 +1,21 @@ import re -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + RepairAction, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def short_name(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateShapeDefaultNames(pyblish.api.InstancePlugin, +class ValidateShapeDefaultNames(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that Shape names are using Maya's default format. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index e6e2f963e9..646c12f331 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -1,22 +1,19 @@ -import pyblish.api - -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShapeRenderStats(pyblish.api.InstancePlugin, +class ValidateShapeRenderStats(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure all render stats are set to the default values.""" order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Shape Default Render Stats' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 6d39e26408..8f58e646f0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -1,18 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidateShapeZero(pyblish.api.InstancePlugin, +class ValidateShapeZero(MayaInstancePlugin, OptionalPyblishPluginMixin): """Shape components may not have any "tweak" values @@ -21,7 +19,6 @@ class ValidateShapeZero(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Shape Zero (Freeze)" actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py index f5d73553d3..02f3973149 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py @@ -1,11 +1,11 @@ -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSingleAssembly(pyblish.api.InstancePlugin): +class ValidateSingleAssembly(MayaInstancePlugin): """Ensure the content of the instance is grouped in a single hierarchy The instance must have a single root node containing all the content. @@ -21,7 +21,6 @@ class ValidateSingleAssembly(pyblish.api.InstancePlugin): """ order = ValidateContentsOrder - hosts = ['maya'] families = ['rig'] label = 'Single Assembly' diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py index 172453f1ef..be71eebac2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py @@ -1,21 +1,19 @@ # -*- coding: utf-8 -*- -import pyblish.api from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishXmlValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateSkeletalMeshHierarchy(pyblish.api.InstancePlugin, +class ValidateSkeletalMeshHierarchy(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that nodes has common root.""" order = ValidateContentsOrder - hosts = ["maya"] families = ["skeletalMesh"] label = "Skeletal Mesh Top Node" optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index 7e63ed2ae3..db93b8cbc5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -1,24 +1,19 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_maya.api.action import ( - SelectInvalidAction, -) from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) - - +from ayon_maya.api.action import SelectInvalidAction +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateSkeletalMeshTriangulated(pyblish.api.InstancePlugin): +class ValidateSkeletalMeshTriangulated(MayaInstancePlugin): """Validates that the geometry has been triangulated.""" order = ValidateContentsOrder - hosts = ["maya"] families = ["skeletalMesh"] label = "Skeletal Mesh Triangulated" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py index 9fbe0f440b..57418324c9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py @@ -1,17 +1,15 @@ # -*- coding: utf-8 -*- """Plugin for validating naming conventions.""" +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - - -class ValidateSkeletonTopGroupHierarchy(pyblish.api.InstancePlugin, +class ValidateSkeletonTopGroupHierarchy(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates top group hierarchy in the SETs Make sure the object inside the SETs are always top diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index 7a7b6a9048..ee99b432aa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -1,16 +1,15 @@ from maya import cmds -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, +class ValidateSkinclusterDeformerSet(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate skinClusters on meshes have valid member relationships. @@ -21,7 +20,6 @@ class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['fbx'] label = "Skincluster Deformer Relationships" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index 1373048cc2..445388efc1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -1,14 +1,13 @@ -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateStepSize(pyblish.api.InstancePlugin, +class ValidateStepSize(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the step size for the instance is in a valid range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index 846fc86650..1d6a29d446 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -1,19 +1,18 @@ # -*- coding: utf-8 -*- """Plugin for validating naming conventions.""" import json -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, +class ValidateTransformNamingSuffix(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates transform suffix based on the type of its children shapes. @@ -36,7 +35,6 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] optional = True label = "Suffix Naming Conventions" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index 51fa7938ef..621a7dd6bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -1,17 +1,16 @@ import inspect -from maya import cmds -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateTransformZero(pyblish.api.InstancePlugin, +class ValidateTransformZero(MayaInstancePlugin, OptionalPyblishPluginMixin): """Transforms can't have any values @@ -22,7 +21,6 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Transform Zero (Freeze)" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 74f2292680..59540b659a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateUniqueNames(pyblish.api.InstancePlugin, +class ValidateUniqueNames(MayaInstancePlugin, OptionalPyblishPluginMixin): """transform names should be unique @@ -18,7 +17,6 @@ class ValidateUniqueNames(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Unique transform name" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index f6207797a7..e8fc3fc095 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -1,22 +1,19 @@ # -*- coding: utf-8 -*- - -from maya import cmds -import pyblish.api - -from ayon_core.pipeline.publish import ( - ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateMeshOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, +class ValidateUnrealMeshTriangulated(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if mesh is made of triangles for Unreal Engine""" order = ValidateMeshOrder - hosts = ["maya"] families = ["staticMesh"] label = "Mesh is Triangulated" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index eff980843e..054f9aa3a0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -2,17 +2,16 @@ """Validator for correct naming of Static Meshes.""" import re -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, +class ValidateUnrealStaticMeshName(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate name of Unreal Static Mesh @@ -55,7 +54,6 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, """ optional = True order = ValidateContentsOrder - hosts = ["maya"] families = ["staticMesh"] label = "Unreal Static Mesh Name" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py index f7acd41cea..fad0eff5f8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py @@ -1,24 +1,21 @@ # -*- coding: utf-8 -*- - -from maya import cmds -import pyblish.api - from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + RepairAction, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateUnrealUpAxis(pyblish.api.ContextPlugin, +class ValidateUnrealUpAxis(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if Z is set as up axis in Maya""" optional = True active = False order = ValidateContentsOrder - hosts = ["maya"] families = ["staticMesh"] label = "Unreal Up-Axis check" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 4252585324..431cf2f229 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -1,15 +1,14 @@ -import pyblish.api - -from ayon_maya.api.lib import iter_visible_nodes_in_range import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.lib import iter_visible_nodes_in_range +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, +class ValidateAlembicVisibleOnly(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates at least a single node is visible in frame range. @@ -19,7 +18,6 @@ class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Alembic Visible Only" - hosts = ["maya"] families = ["pointcache", "animation"] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py index db78212658..65a01886b6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py @@ -1,15 +1,14 @@ -from maya import cmds - import pyblish.api from ayon_core.pipeline.publish import PublishValidationError +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateVray(pyblish.api.InstancePlugin): +class ValidateVray(MayaInstancePlugin): """Validate general Vray setup.""" order = pyblish.api.ValidatorOrder label = 'VRay' - hosts = ["maya"] families = ["vrayproxy"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index 76c87f3e8b..d58c01c1e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -1,17 +1,16 @@ -import pyblish.api -from maya import cmds - -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( KnownPublishError, + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateVRayDistributedRendering(pyblish.api.InstancePlugin, +class ValidateVRayDistributedRendering(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate V-Ray Distributed Rendering is ignored in batch mode. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py index 9df5fb8488..9cc3290853 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py @@ -1,17 +1,18 @@ # -*- coding: utf-8 -*- """Validate if there are AOVs pulled from references.""" -import pyblish.api import types + +import pyblish.api +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairContextAction, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_core.pipeline.publish import ( - RepairContextAction, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateVrayReferencedAOVs(pyblish.api.InstancePlugin, +class ValidateVrayReferencedAOVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Render Elements (AOVs) include references. @@ -23,7 +24,6 @@ class ValidateVrayReferencedAOVs(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder label = 'VRay Referenced AOVs' - hosts = ['maya'] families = ['renderlayer'] actions = [RepairContextAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py index a3d93dd9c0..546fd480a9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py @@ -1,18 +1,17 @@ # -*- coding: utf-8 -*- """Validate VRay Translator settings.""" -import pyblish.api from ayon_core.pipeline.publish import ( - context_plugin_should_run, + OptionalPyblishPluginMixin, + PublishValidationError, RepairContextAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin + context_plugin_should_run, ) - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class ValidateVRayTranslatorEnabled(pyblish.api.ContextPlugin, +class ValidateVRayTranslatorEnabled(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate VRay Translator settings for extracting vrscenes.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py index 0288d4b865..06b717be03 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py @@ -1,17 +1,16 @@ import pyblish.api - from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateVrayProxy(pyblish.api.InstancePlugin, +class ValidateVrayProxy(MayaInstancePlugin, OptionalPyblishPluginMixin): order = pyblish.api.ValidatorOrder label = "VRay Proxy Settings" - hosts = ["maya"] families = ["vrayproxy"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 40315a1e40..60d4fe4d8c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -1,22 +1,19 @@ +import ayon_maya.api.action import pyblish.api - +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_core.pipeline.publish import ( - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidateVrayProxyMembers(pyblish.api.InstancePlugin, +class ValidateVrayProxyMembers(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Proxy instance has shape members""" order = pyblish.api.ValidatorOrder label = 'VRay Proxy Members' - hosts = ['maya'] families = ['vrayproxy'] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py index 7e0f01c482..036da2c1e6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py @@ -1,18 +1,17 @@ import json import maya.cmds as cmds -import xgenm - import pyblish.api +import xgenm from ayon_core.pipeline.publish import PublishValidationError +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateXgen(pyblish.api.InstancePlugin): +class ValidateXgen(MayaInstancePlugin): """Validate Xgen data.""" label = "Validate Xgen" order = pyblish.api.ValidatorOrder - host = ["maya"] families = ["xgen"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py index 086cb7b1f5..c185838028 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py @@ -1,14 +1,13 @@ +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - -class ValidateYetiRenderScriptCallbacks(pyblish.api.InstancePlugin, +class ValidateYetiRenderScriptCallbacks(MayaInstancePlugin, OptionalPyblishPluginMixin): """Check if the render script callbacks will be used during the rendering @@ -27,7 +26,6 @@ class ValidateYetiRenderScriptCallbacks(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Yeti Render Script Callbacks" - hosts = ["maya"] families = ["renderlayer"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 87887b7d36..64478d4c50 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -1,16 +1,17 @@ import inspect -import pyblish.api -import maya.cmds as cmds import ayon_maya.api.action +import maya.cmds as cmds +import pyblish.api from ayon_core.pipeline.publish import ( - RepairAction, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + RepairAction, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, +class ValidateYetiRigCacheState(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the I/O attributes of the node @@ -22,7 +23,6 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder label = "Yeti Rig Cache State" - hosts = ["maya"] families = ["yetiRig"] actions = [RepairAction, ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index 59a6867c17..cf637e55cb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -1,21 +1,18 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateYetiRigInputShapesInInstance(pyblish.api.InstancePlugin, +class ValidateYetiRigInputShapesInInstance(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if all input nodes are part of the instance's hierarchy""" order = ValidateContentsOrder - hosts = ["maya"] families = ["yetiRig"] label = "Yeti Rig Input Shapes In Instance" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py index 6bd2ebb753..4258fb8feb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py @@ -1,12 +1,12 @@ import pyblish.api - from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateYetiRigSettings(pyblish.api.InstancePlugin, +class ValidateYetiRigSettings(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Yeti Rig Settings have collected input connections. From c5f385092f218c3847b5763a700601a41da1279d Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 30 May 2024 20:54:32 +0800 Subject: [PATCH 397/469] add the missing addon milestone versions --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 01f80267d8..5a2c1d353e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -54,6 +54,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), + "max": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), From 1132da882fb0145141fc591995686d0afcb81882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 30 May 2024 16:43:16 +0200 Subject: [PATCH 398/469] :bug: fix imports workaround for discovery --- .../plugins/load/load_arnold_standin.py | 5 +++-- .../plugins/load/load_as_template.py | 4 ++-- .../ayon_maya/plugins/load/load_assembly.py | 4 ++-- .../ayon_maya/plugins/load/load_audio.py | 4 ++-- .../ayon_maya/plugins/load/load_gpucache.py | 5 +++-- .../ayon_maya/plugins/load/load_image.py | 4 ++-- .../plugins/load/load_image_plane.py | 4 ++-- .../ayon_maya/plugins/load/load_matchmove.py | 4 ++-- .../ayon_maya/plugins/load/load_maya_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd_over.py | 4 ++-- .../plugins/load/load_redshift_proxy.py | 5 +++-- .../plugins/load/load_rendersetup.py | 4 ++-- .../plugins/load/load_vdb_to_arnold.py | 5 +++-- .../plugins/load/load_vdb_to_redshift.py | 5 +++-- .../plugins/load/load_vdb_to_vray.py | 5 +++-- .../ayon_maya/plugins/load/load_vrayproxy.py | 5 +++-- .../ayon_maya/plugins/load/load_vrayscene.py | 5 +++-- .../ayon_maya/plugins/load/load_xgen.py | 4 ++-- .../ayon_maya/plugins/load/load_yeti_cache.py | 5 +++-- .../plugins/publish/collect_animation.py | 4 ++-- .../publish/collect_arnold_scene_source.py | 4 ++-- .../plugins/publish/collect_assembly.py | 4 ++-- .../plugins/publish/collect_current_file.py | 4 ++-- .../plugins/publish/collect_fbx_animation.py | 4 ++-- .../plugins/publish/collect_fbx_camera.py | 4 ++-- .../publish/collect_file_dependencies.py | 4 ++-- .../ayon_maya/plugins/publish/collect_gltf.py | 4 ++-- .../plugins/publish/collect_history.py | 4 ++-- .../plugins/publish/collect_inputs.py | 4 ++-- .../plugins/publish/collect_instances.py | 4 ++-- .../ayon_maya/plugins/publish/collect_look.py | 4 ++-- .../publish/collect_maya_scene_time.py | 4 ++-- .../plugins/publish/collect_maya_units.py | 4 ++-- .../plugins/publish/collect_maya_workspace.py | 4 ++-- .../plugins/publish/collect_model.py | 4 ++-- .../publish/collect_multiverse_look.py | 4 ++-- .../plugins/publish/collect_pointcache.py | 4 ++-- .../plugins/publish/collect_remove_marked.py | 4 ++-- .../plugins/publish/collect_render.py | 4 ++-- .../publish/collect_render_layer_aovs.py | 4 ++-- .../publish/collect_renderable_camera.py | 4 ++-- .../plugins/publish/collect_review.py | 4 ++-- .../plugins/publish/collect_rig_sets.py | 4 ++-- .../plugins/publish/collect_skeleton_mesh.py | 4 ++-- .../publish/collect_unreal_skeletalmesh.py | 4 ++-- .../publish/collect_unreal_staticmesh.py | 4 ++-- .../collect_user_defined_attributes.py | 4 ++-- .../plugins/publish/collect_vrayproxy.py | 4 ++-- .../plugins/publish/collect_vrayscene.py | 4 ++-- .../plugins/publish/collect_workfile.py | 4 ++-- .../plugins/publish/collect_workscene_fps.py | 4 ++-- .../ayon_maya/plugins/publish/collect_xgen.py | 4 ++-- .../plugins/publish/collect_yeti_cache.py | 4 ++-- .../plugins/publish/collect_yeti_rig.py | 4 ++-- .../publish/determine_future_version.py | 4 ++-- .../publish/extract_active_view_thumbnail.py | 4 ++-- .../publish/extract_arnold_scene_source.py | 5 ++--- .../plugins/publish/extract_assembly.py | 4 ++-- .../plugins/publish/extract_camera_alembic.py | 4 ++-- .../publish/extract_camera_mayaScene.py | 4 ++-- .../ayon_maya/plugins/publish/extract_fbx.py | 4 ++-- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../ayon_maya/plugins/publish/extract_gltf.py | 4 ++-- .../plugins/publish/extract_gpu_cache.py | 4 ++-- .../publish/extract_import_reference.py | 4 ++-- .../plugins/publish/extract_layout.py | 4 ++-- .../ayon_maya/plugins/publish/extract_look.py | 4 ++-- .../plugins/publish/extract_maya_scene_raw.py | 4 ++-- .../plugins/publish/extract_maya_usd.py | 4 ++-- .../plugins/publish/extract_model.py | 4 ++-- .../publish/extract_multiverse_look.py | 4 ++-- .../plugins/publish/extract_multiverse_usd.py | 4 ++-- .../publish/extract_multiverse_usd_comp.py | 4 ++-- .../publish/extract_multiverse_usd_over.py | 4 ++-- .../ayon_maya/plugins/publish/extract_obj.py | 4 ++-- .../plugins/publish/extract_playblast.py | 4 ++-- .../plugins/publish/extract_pointcache.py | 4 ++-- .../plugins/publish/extract_proxy_abc.py | 4 ++-- .../plugins/publish/extract_redshift_proxy.py | 4 ++-- .../plugins/publish/extract_rendersetup.py | 4 ++-- .../ayon_maya/plugins/publish/extract_rig.py | 4 ++-- .../plugins/publish/extract_skeleton_mesh.py | 4 ++-- .../plugins/publish/extract_thumbnail.py | 4 ++-- .../extract_unreal_skeletalmesh_abc.py | 4 ++-- .../extract_unreal_skeletalmesh_fbx.py | 4 ++-- .../publish/extract_unreal_staticmesh.py | 4 ++-- .../publish/extract_unreal_yeticache.py | 4 ++-- .../plugins/publish/extract_vrayproxy.py | 4 ++-- .../plugins/publish/extract_vrayscene.py | 4 ++-- .../plugins/publish/extract_workfile_xgen.py | 4 ++-- .../ayon_maya/plugins/publish/extract_xgen.py | 4 ++-- .../plugins/publish/extract_yeti_cache.py | 4 ++-- .../plugins/publish/extract_yeti_rig.py | 4 ++-- .../increment_current_file_deadline.py | 4 ++-- .../plugins/publish/reset_xgen_attributes.py | 4 ++-- .../ayon_maya/plugins/publish/save_scene.py | 4 ++-- .../validate_alembic_options_defaults.py | 4 ++-- .../publish/validate_animation_content.py | 4 ++-- ...date_animation_out_set_related_node_ids.py | 4 ++-- .../publish/validate_arnold_scene_source.py | 4 ++-- .../validate_arnold_scene_source_cbid.py | 4 ++-- .../publish/validate_ass_relative_paths.py | 4 ++-- .../plugins/publish/validate_assembly_name.py | 4 ++-- .../publish/validate_assembly_namespaces.py | 4 ++-- .../publish/validate_assembly_transforms.py | 4 ++-- .../plugins/publish/validate_attributes.py | 4 ++-- .../publish/validate_camera_attributes.py | 4 ++-- .../publish/validate_camera_contents.py | 4 ++-- .../plugins/publish/validate_color_sets.py | 4 ++-- ...validate_current_renderlayer_renderable.py | 4 ++-- .../plugins/publish/validate_cycle_error.py | 4 ++-- .../plugins/publish/validate_frame_range.py | 4 ++-- .../plugins/publish/validate_glsl_material.py | 4 ++-- .../plugins/publish/validate_glsl_plugin.py | 4 ++-- .../publish/validate_instance_has_members.py | 4 ++-- .../publish/validate_instance_in_context.py | 4 ++-- .../publish/validate_instance_subset.py | 4 ++-- .../plugins/publish/validate_loaded_plugin.py | 20 +++++++++---------- .../plugins/publish/validate_look_contents.py | 4 ++-- ...lidate_look_default_shaders_connections.py | 4 ++-- .../validate_look_id_reference_edits.py | 4 ++-- .../validate_look_no_default_shaders.py | 4 ++-- .../plugins/publish/validate_look_sets.py | 4 ++-- .../publish/validate_look_shading_group.py | 4 ++-- .../publish/validate_look_single_shader.py | 4 ++-- .../plugins/publish/validate_maya_units.py | 4 ++-- .../validate_mesh_arnold_attributes.py | 4 ++-- .../plugins/publish/validate_mesh_empty.py | 4 ++-- .../plugins/publish/validate_mesh_has_uv.py | 4 ++-- .../publish/validate_mesh_lamina_faces.py | 4 ++-- .../plugins/publish/validate_mesh_ngons.py | 4 ++-- .../validate_mesh_no_negative_scale.py | 4 ++-- .../publish/validate_mesh_non_manifold.py | 4 ++-- .../publish/validate_mesh_non_zero_edge.py | 4 ++-- .../publish/validate_mesh_normals_unlocked.py | 4 ++-- .../publish/validate_mesh_overlapping_uvs.py | 4 ++-- .../validate_mesh_shader_connections.py | 4 ++-- .../publish/validate_mesh_single_uv_set.py | 4 ++-- .../publish/validate_mesh_uv_set_map1.py | 4 ++-- .../validate_mesh_vertices_have_edges.py | 4 ++-- .../plugins/publish/validate_model_content.py | 4 ++-- .../publish/validate_mvlook_contents.py | 4 ++-- .../plugins/publish/validate_no_animation.py | 4 ++-- .../publish/validate_no_default_camera.py | 4 ++-- .../plugins/publish/validate_no_namespace.py | 4 ++-- .../publish/validate_no_null_transforms.py | 4 ++-- .../publish/validate_no_unknown_nodes.py | 4 ++-- .../plugins/publish/validate_no_vraymesh.py | 4 ++-- .../plugins/publish/validate_node_ids.py | 4 ++-- .../validate_node_ids_deformed_shapes.py | 4 ++-- .../publish/validate_node_ids_in_database.py | 4 ++-- .../publish/validate_node_ids_related.py | 4 ++-- .../publish/validate_node_ids_unique.py | 4 ++-- .../publish/validate_node_no_ghosting.py | 4 ++-- .../validate_plugin_path_attributes.py | 4 ++-- .../publish/validate_render_image_rule.py | 4 ++-- .../validate_render_no_default_cameras.py | 4 ++-- .../publish/validate_render_single_camera.py | 4 ++-- .../publish/validate_renderlayer_aovs.py | 4 ++-- .../publish/validate_rendersettings.py | 4 ++-- .../plugins/publish/validate_resolution.py | 4 ++-- .../plugins/publish/validate_resources.py | 4 ++-- .../plugins/publish/validate_review.py | 4 ++-- .../plugins/publish/validate_rig_contents.py | 4 ++-- .../publish/validate_rig_controllers.py | 4 ++-- ...idate_rig_controllers_arnold_attributes.py | 4 ++-- .../publish/validate_rig_joints_hidden.py | 4 ++-- .../publish/validate_rig_out_set_node_ids.py | 4 ++-- .../publish/validate_rig_output_ids.py | 4 ++-- .../publish/validate_scene_set_workspace.py | 4 ++-- .../plugins/publish/validate_setdress_root.py | 4 ++-- .../plugins/publish/validate_shader_name.py | 4 ++-- .../publish/validate_shape_default_names.py | 4 ++-- .../publish/validate_shape_render_stats.py | 4 ++-- .../plugins/publish/validate_shape_zero.py | 4 ++-- .../publish/validate_single_assembly.py | 4 ++-- .../validate_skeletalmesh_hierarchy.py | 4 ++-- .../validate_skeletalmesh_triangulated.py | 4 ++-- .../validate_skeleton_top_group_hierarchy.py | 4 ++-- .../validate_skinCluster_deformer_set.py | 4 ++-- .../plugins/publish/validate_step_size.py | 4 ++-- .../validate_transform_naming_suffix.py | 4 ++-- .../publish/validate_transform_zero.py | 4 ++-- .../plugins/publish/validate_unique_names.py | 4 ++-- .../validate_unreal_mesh_triangulated.py | 4 ++-- .../validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_unreal_up_axis.py | 4 ++-- .../plugins/publish/validate_visible_only.py | 4 ++-- .../plugins/publish/validate_vray.py | 4 ++-- .../validate_vray_distributed_rendering.py | 4 ++-- .../publish/validate_vray_referenced_aovs.py | 4 ++-- .../validate_vray_translator_settings.py | 4 ++-- .../plugins/publish/validate_vrayproxy.py | 4 ++-- .../publish/validate_vrayproxy_members.py | 4 ++-- .../plugins/publish/validate_xgen.py | 4 ++-- .../validate_yeti_renderscript_callbacks.py | 4 ++-- .../publish/validate_yeti_rig_cache_state.py | 4 ++-- .../validate_yeti_rig_input_in_instance.py | 4 ++-- .../publish/validate_yeti_rig_settings.py | 4 ++-- 200 files changed, 417 insertions(+), 409 deletions(-) diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index 087a0a488b..d01cea3ad4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -11,7 +11,8 @@ from ayon_maya.api.lib import ( unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api import plugin def is_sequence(files): @@ -22,7 +23,7 @@ def is_sequence(files): return sequence -class ArnoldStandinLoader(Loader): +class ArnoldStandinLoader(plugin.Loader): """Load as Arnold standin""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index 8ad3e526d1..b6bd3c3ab6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -1,10 +1,10 @@ from ayon_core.lib import BoolDef from ayon_core.pipeline import registered_host -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from ayon_maya.api.workfile_template_builder import MayaTemplateBuilder -class LoadAsTemplate(Loader): +class LoadAsTemplate(plugin.Loader): """Load workfile as a template """ product_types = {"workfile", "mayaScene"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index 8c6edf3aac..490631aa67 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -3,10 +3,10 @@ from ayon_core.pipeline import remove_container from ayon_maya.api import setdress from ayon_maya.api.lib import unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin -class AssemblyLoader(Loader): +class AssemblyLoader(plugin.Loader): product_types = {"assembly"} representations = {"json"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 5ad3993e57..d9f67fdd90 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -1,11 +1,11 @@ from ayon_core.pipeline import get_representation_path from ayon_maya.api.lib import get_container_members, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds, mel -class AudioLoader(Loader): +class AudioLoader(plugin.Loader): """Specific loader of audio.""" product_types = {"audio"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index d40b31e885..795d01fd5a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -3,10 +3,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class GpuCacheLoader(Loader): +class GpuCacheLoader(plugin.Loader): """Load Alembic as gpuCache""" product_types = {"model", "animation", "proxyAbc", "pointcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 3a32237729..453e24a2d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -11,7 +11,7 @@ from ayon_core.pipeline.load.utils import get_representation_path_from_context from ayon_core.settings import get_project_settings from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds @@ -81,7 +81,7 @@ def create_stencil(): return file, place, stencil, place_stencil -class FileNodeLoader(Loader): +class FileNodeLoader(plugin.Loader): """File node loader.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 21625affca..3da67221e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -6,7 +6,7 @@ from ayon_maya.api.lib import ( unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds from qtpy import QtCore, QtWidgets @@ -80,7 +80,7 @@ class CameraWindow(QtWidgets.QDialog): self.close() -class ImagePlaneLoader(Loader): +class ImagePlaneLoader(plugin.Loader): """Specific loader of plate for image planes on selected camera.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py index f4aaca6a4d..7689a3ca5e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py @@ -1,8 +1,8 @@ -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import mel -class MatchmoveLoader(Loader): +class MatchmoveLoader(plugin.Loader): """ This will run matchmove script to create track in scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index b3bd2475fd..79fc1fc94f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -4,10 +4,10 @@ from ayon_core.pipeline import get_representation_path from ayon_core.pipeline.load import get_representation_path_from_context from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin -class MayaUsdLoader(Loader): +class MayaUsdLoader(plugin.Loader): """Read USD data in a Maya USD Proxy""" product_types = {"model", "usd", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index ca347697ab..026740a957 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -4,13 +4,13 @@ import os import maya.cmds as cmds from ayon_api import get_representation_by_id from ayon_core.pipeline import get_representation_path +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import mel -class MultiverseUsdLoader(Loader): +class MultiverseUsdLoader(plugin.Loader): """Read USD data in a Multiverse Compound""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index bdcb771109..a8fff12577 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -5,13 +5,13 @@ import maya.cmds as cmds import qargparse from ayon_api import get_representation_by_id from ayon_core.pipeline import get_representation_path +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import mel -class MultiverseUsdOverLoader(Loader): +class MultiverseUsdOverLoader(plugin.Loader): """Reference file""" product_types = {"mvUsdOverride"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index 996d77856d..92bf6dfe26 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -6,12 +6,13 @@ import clique import maya.cmds as cmds from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type -class RedshiftProxyLoader(Loader): +class RedshiftProxyLoader(plugin.Loader): """Load Redshift proxy""" product_types = {"redshiftproxy"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index 09fda5d2f4..3b323698c4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -15,8 +15,8 @@ import six from ayon_core.lib import BoolDef, EnumDef from ayon_core.pipeline import get_representation_path from ayon_maya.api import lib +from ayon_maya.api import plugin from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import cmds @@ -45,7 +45,7 @@ def mark_all_imported(enabled): cmds.deleteAttr(plug) -class RenderSetupLoader(Loader): +class RenderSetupLoader(plugin.Loader): """Load json preset for RenderSetup overwriting current one.""" product_types = {"rendersetup"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index 832562971f..4515ec499d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -8,10 +8,11 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class LoadVDBtoArnold(Loader): +class LoadVDBtoArnold(plugin.Loader): """Load OpenVDB for Arnold in aiVolume""" product_types = {"vdbcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index 1ea82cbf28..c08004421b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -2,10 +2,11 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class LoadVDBtoRedShift(Loader): +class LoadVDBtoRedShift(plugin.Loader): """Load OpenVDB in a Redshift Volume Shape Note that the RedshiftVolumeShape is created without a RedshiftVolume diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index fefbea0e88..f022f8be5e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -2,7 +2,8 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type from maya import cmds # List of 3rd Party Channels Mapping names for VRayVolumeGrid @@ -70,7 +71,7 @@ def _fix_duplicate_vvg_callbacks(): matched.add(callback) -class LoadVDBtoVRay(Loader): +class LoadVDBtoVRay(plugin.Loader): """Load OpenVDB in a V-Ray Volume Grid""" product_types = {"vdbcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 53995f877b..c71a48247c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -13,10 +13,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class VRayProxyLoader(Loader): +class VRayProxyLoader(plugin.Loader): """Load VRay Proxy with Alembic or VrayMesh.""" product_types = {"vrayproxy", "model", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index acea6cdd63..255ca844ba 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -4,10 +4,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class VRaySceneLoader(Loader): +class VRaySceneLoader(plugin.Loader): """Load Vray scene""" product_types = {"vrayscene_layer"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index 6f053cd1e6..88d9d550da 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -1,7 +1,7 @@ import os import shutil -import ayon_maya.api.plugin +from ayon_maya.api import plugin import maya.cmds as cmds import xgenm from ayon_core.pipeline import get_representation_path @@ -15,7 +15,7 @@ from ayon_maya.api.lib import ( from qtpy import QtWidgets -class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): +class XgenLoader(plugin.ReferenceLoader): """Load Xgen as reference""" product_types = {"xgen"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index b2b5c7c710..6000de2507 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -8,7 +8,8 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api import lib from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type from ayon_maya.api.yeti import create_yeti_variable from maya import cmds @@ -40,7 +41,7 @@ def set_attribute(node, attr, value): lib.set_attribute(node, attr, value) -class YetiCacheLoader(Loader): +class YetiCacheLoader(plugin.Loader): """Load Yeti Cache with one or more Yeti nodes""" product_types = {"yeticache", "yetiRig"} diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py index 7996602c37..528d981c4b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py @@ -1,9 +1,9 @@ import maya.cmds as cmds import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectAnimationOutputGeometry(MayaInstancePlugin): +class CollectAnimationOutputGeometry(plugin.MayaInstancePlugin): """Collect out hierarchy data for instance. Collect all hierarchy nodes which reside in the out_SET of the animation diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index 55f332e4b9..c9dd0b8063 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api.lib import get_all_children -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectArnoldSceneSource(MayaInstancePlugin): +class CollectArnoldSceneSource(plugin.MayaInstancePlugin): """Collect Arnold Scene Source data.""" # Offset to be after renderable camera collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index 57b3443dd3..e57d70662c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -11,10 +11,10 @@ import pyblish.api from maya import cmds, mel from ayon_maya import api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectAssembly(MayaInstancePlugin): +class CollectAssembly(plugin.MayaInstancePlugin): """Collect all relevant assembly items Collected data: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py index 27c9dc130e..8bd1908c73 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class CollectCurrentFile(MayaContextPlugin): +class CollectCurrentFile(plugin.MayaContextPlugin): """Inject the current working file.""" order = pyblish.api.CollectorOrder - 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py index 687b93211b..83f42667a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectFbxAnimation(MayaInstancePlugin, +class CollectFbxAnimation(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Collect Animated Rig Data for FBX Extractor.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py index eabc1237a3..f6791b6e72 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectFbxCamera(MayaInstancePlugin): +class CollectFbxCamera(plugin.MayaInstancePlugin): """Collect Camera for FBX export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py index ca4c617fa9..74b8054c33 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py @@ -1,9 +1,9 @@ from maya import cmds -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin import pyblish.api -class CollectFileDependencies(MayaContextPlugin): +class CollectFileDependencies(plugin.MayaContextPlugin): """Gather all files referenced in this scene.""" label = "Collect File Dependencies" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py index c34505597c..7ee23d289c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectGLTF(MayaInstancePlugin): +class CollectGLTF(plugin.MayaInstancePlugin): """Collect Assets for GLTF/GLB export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py index b649628a36..9041d4d1d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaHistory(MayaInstancePlugin): +class CollectMayaHistory(plugin.MayaInstancePlugin): """Collect history for instances from the Maya scene Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index bebd765c1b..67d4a3f378 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -7,7 +7,7 @@ import pyblish.api from ayon_core.pipeline import registered_host from ayon_maya.api.lib import get_container_members from ayon_maya.api.lib_rendersetup import get_shader_in_layer -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def iter_history(nodes, @@ -94,7 +94,7 @@ def collect_input_containers(containers, nodes): if any(node in container["_members"] for node in nodes)] -class CollectUpstreamInputs(MayaInstancePlugin): +class CollectUpstreamInputs(plugin.MayaInstancePlugin): """Collect input source inputs for this publish. This will include `inputs` data of which loaded publishes were used in the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 89b490febc..0ca43d4be9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -2,10 +2,10 @@ from maya import cmds import pyblish.api from ayon_maya.api.lib import get_all_children -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectNewInstances(MayaInstancePlugin): +class CollectNewInstances(plugin.MayaInstancePlugin): """Gather members for instances and pre-defined attribute This collector takes into account assets that are associated with diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index 27fb409777..691933babd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -6,7 +6,7 @@ import re import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa SHAPE_ATTRS = {"castsShadows", @@ -266,7 +266,7 @@ def get_file_node_files(node): return result -class CollectLook(MayaInstancePlugin): +class CollectLook(plugin.MayaInstancePlugin): """Collect look data for instance. For the shapes/transforms of the referenced object to collect look for diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py index b6a15a637f..c10d0fffbe 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaSceneTime(MayaInstancePlugin): +class CollectMayaSceneTime(plugin.MayaInstancePlugin): """Collect Maya Scene playback range This allows to reproduce the playback range for the content to be loaded. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py index 2224037b1f..47888506ff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py @@ -1,12 +1,12 @@ import maya.cmds as cmds import maya.mel as mel -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin import pyblish.api -class CollectMayaUnits(MayaContextPlugin): +class CollectMayaUnits(plugin.MayaContextPlugin): """Collect Maya's scene units.""" label = "Maya Units" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py index bdcd232348..a7b51e1fb3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py @@ -1,11 +1,11 @@ import os import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaWorkspace(MayaContextPlugin): +class CollectMayaWorkspace(plugin.MayaContextPlugin): """Inject the current workspace into context""" order = pyblish.api.CollectorOrder - 0.5 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py index c239f1c118..13e5a609e7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectModelData(MayaInstancePlugin): +class CollectModelData(plugin.MayaInstancePlugin): """Collect model data Ensures always only a single frame is extracted (current frame). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index fff35d32f5..ddf36b7eda 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -4,7 +4,7 @@ import re import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds SHAPE_ATTRS = ["castsShadows", @@ -252,7 +252,7 @@ def is_mipmap(fname): return False -class CollectMultiverseLookData(MayaInstancePlugin): +class CollectMultiverseLookData(plugin.MayaInstancePlugin): """Collect Multiverse Look Searches through the overrides finding all material overrides. From there diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py index 0c3cccc8ec..8d0b45137f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectPointcache(MayaInstancePlugin): +class CollectPointcache(plugin.MayaInstancePlugin): """Collect pointcache data for instance.""" order = pyblish.api.CollectorOrder + 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py index 97c5dc67d4..14d914cac5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class CollectRemoveMarked(MayaContextPlugin): +class CollectRemoveMarked(plugin.MayaContextPlugin): """Remove marked data Remove instances that have 'remove' in their instance.data diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index 143d1c08e2..160a019540 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -44,11 +44,11 @@ from ayon_maya.api.lib_renderproducts import ( UnsupportedRendererException, get as get_layer_render_products, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaRender(MayaInstancePlugin): +class CollectMayaRender(plugin.MayaInstancePlugin): """Gather all publishable render layers from renderSetup.""" order = pyblish.api.CollectorOrder + 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index 7e1d531541..dd4a8fefe5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRenderLayerAOVS(MayaInstancePlugin): +class CollectRenderLayerAOVS(plugin.MayaInstancePlugin): """Collect all render layer's AOVs / Render Elements that will render. This collector is important to be able to Extend Frames. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index 4ac16eb714..fbd181de3e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api.lib_rendersetup import get_attr_in_layer -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRenderableCamera(MayaInstancePlugin): +class CollectRenderableCamera(plugin.MayaInstancePlugin): """Collect the renderable camera(s) for the render layer""" # Offset to be after renderlayer collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 90620771e1..8a50c2f0a9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -2,11 +2,11 @@ import ayon_api import pyblish.api from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel -class CollectReview(MayaInstancePlugin): +class CollectReview(plugin.MayaInstancePlugin): """Collect Review data """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py index dfa4fc2d9a..98f4d38ab2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRigSets(MayaInstancePlugin): +class CollectRigSets(plugin.MayaInstancePlugin): """Ensure rig contains pipeline-critical content Every rig must contain at least two object sets: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py index a8783018c9..aaec4cb6d9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectSkeletonMesh(MayaInstancePlugin): +class CollectSkeletonMesh(plugin.MayaInstancePlugin): """Collect Static Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py index a7900a2085..32515a5957 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectUnrealSkeletalMesh(MayaInstancePlugin): +class CollectUnrealSkeletalMesh(plugin.MayaInstancePlugin): """Collect Unreal Skeletal Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py index 762c7daa4a..35295d6e3b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from pprint import pformat -class CollectUnrealStaticMesh(MayaInstancePlugin): +class CollectUnrealStaticMesh(plugin.MayaInstancePlugin): """Collect Unreal Static Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py index b7ef70c874..e468636def 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py @@ -1,9 +1,9 @@ from maya import cmds -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin import pyblish.api -class CollectUserDefinedAttributes(MayaInstancePlugin): +class CollectUserDefinedAttributes(plugin.MayaInstancePlugin): """Collect user defined attributes for nodes in instance.""" order = pyblish.api.CollectorOrder + 0.45 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py index 8710858150..a5491e5f9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- """Collect Vray Proxy.""" import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectVrayProxy(MayaInstancePlugin): +class CollectVrayProxy(plugin.MayaInstancePlugin): """Collect Vray Proxy instance. Add `pointcache` family for it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index 86538450b7..f14735574e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -4,10 +4,10 @@ import pyblish.api from ayon_core.lib import get_formatted_current_time from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectVrayScene(MayaInstancePlugin): +class CollectVrayScene(plugin.MayaInstancePlugin): """Collect Vray Scene. If export on farm is checked, job is created to export it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py index d7cea61a2c..fa0689849a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py @@ -1,9 +1,9 @@ import os import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectWorkfileData(MayaInstancePlugin): +class CollectWorkfileData(plugin.MayaInstancePlugin): """Inject data into Workfile instance""" order = pyblish.api.CollectorOrder - 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py index 5c1b021799..a87483e67f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import mel -class CollectWorksceneFPS(MayaContextPlugin): +class CollectWorksceneFPS(plugin.MayaContextPlugin): """Get the FPS of the work scene""" label = "Workscene FPS" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index 784c0a4b83..9ef17f3399 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -2,11 +2,11 @@ import os import pyblish.api from ayon_maya.api.lib import get_attribute_input -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectXgen(MayaInstancePlugin): +class CollectXgen(plugin.MayaInstancePlugin): """Collect Xgen""" order = pyblish.api.CollectorOrder + 0.499999 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index 10883074d3..44de461126 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -1,6 +1,6 @@ import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from ayon_maya.api.yeti import get_yeti_user_variables from maya import cmds @@ -22,7 +22,7 @@ SETTINGS = { } -class CollectYetiCache(MayaInstancePlugin): +class CollectYetiCache(plugin.MayaInstancePlugin): """Collect all information of the Yeti caches The information contains the following attributes per Yeti node diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 25bc5ec172..dbdc10789f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -4,7 +4,7 @@ import re import pyblish.api from ayon_core.pipeline.publish import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds SETTINGS = {"renderDensity", @@ -15,7 +15,7 @@ SETTINGS = {"renderDensity", "cbId"} -class CollectYetiRig(MayaInstancePlugin): +class CollectYetiRig(plugin.MayaInstancePlugin): """Collect all information of the Yeti Rig""" order = pyblish.api.CollectorOrder + 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py index a09489d4ae..0c05b499c0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class DetermineFutureVersion(MayaInstancePlugin): +class DetermineFutureVersion(plugin.MayaInstancePlugin): """ This will determine version of product if we want render to be attached to. """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index 221da82d36..290f7e24eb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -4,10 +4,10 @@ import maya.api.OpenMaya as om import maya.api.OpenMayaUI as omui import pyblish.api from ayon_maya.api.lib import IS_HEADLESS -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ExtractActiveViewThumbnail(MayaInstancePlugin): +class ExtractActiveViewThumbnail(plugin.MayaInstancePlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index fb79094aec..b39c875400 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -3,12 +3,11 @@ import os from collections import defaultdict import arnold -from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import lib, plugin from maya import cmds -class ExtractArnoldSceneSource(MayaExtractorPlugin): +class ExtractArnoldSceneSource(plugin.MayaExtractorPlugin): """Extract the content of the instance to an Arnold Scene Source file.""" label = "Extract Arnold Scene Source" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index ecbf21dfb9..8460fb716f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -2,11 +2,11 @@ import json import os from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractAssembly(MayaExtractorPlugin): +class ExtractAssembly(plugin.MayaExtractorPlugin): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index 2c38110913..b5ce6a6a44 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -2,12 +2,12 @@ import os import json from maya import cmds -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_core.pipeline import publish from ayon_maya.api import lib -class ExtractCameraAlembic(MayaExtractorPlugin, +class ExtractCameraAlembic(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Alembic. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index 5f6260c794..c5aa331cb2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -7,7 +7,7 @@ import os from ayon_core.lib import BoolDef from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -80,7 +80,7 @@ def unlock(plug): cmds.disconnectAttr(source, destination) -class ExtractCameraMayaScene(MayaExtractorPlugin, +class ExtractCameraMayaScene(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Maya Scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index cd1fe1f7e8..d9b0a789c5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -5,11 +5,11 @@ import maya.mel as mel # noqa import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractFBX(MayaExtractorPlugin): +class ExtractFBX(plugin.MayaExtractorPlugin): """Extract FBX from Maya. This extracts reproducible FBX exports ignoring any of the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 186486c153..c22241d2ca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -4,11 +4,11 @@ import os import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import get_namespace, namespaced, strip_namespace -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractFBXAnimation(MayaExtractorPlugin): +class ExtractFBXAnimation(plugin.MayaExtractorPlugin): """Extract Rig in FBX format from Maya. This extracts the rig in fbx with the constraints diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index 450764a9f1..46da8f9463 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -3,11 +3,11 @@ import os import pyblish.api from ayon_maya.api import lib from ayon_maya.api.gltf import extract_gltf -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds, mel -class ExtractGLB(MayaExtractorPlugin): +class ExtractGLB(plugin.MayaExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract GLB" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py index 2d177bda96..53944571a8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py @@ -1,11 +1,11 @@ import json from ayon_core.pipeline import publish -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractGPUCache(MayaExtractorPlugin, +class ExtractGPUCache(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract the content of the instance to a GPU cache file.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index 6c76e8173c..b5964e426b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -6,11 +6,11 @@ import pyblish.api from ayon_core.lib import run_subprocess from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractImportReference(MayaExtractorPlugin, +class ExtractImportReference(plugin.MayaExtractorPlugin, OptionalPyblishPluginMixin): """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py index 5f398e2fd5..ca53f563d4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py @@ -3,12 +3,12 @@ import math import os from ayon_api import get_representation_by_id -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds from maya.api import OpenMaya as om -class ExtractLayout(MayaExtractorPlugin): +class ExtractLayout(plugin.MayaExtractorPlugin): """Extract a layout.""" label = "Extract Layout" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index ec27e762b5..8e57b22d64 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -22,7 +22,7 @@ from ayon_core.lib import ( ) from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa # Modes for transfer @@ -405,7 +405,7 @@ class MakeTX(TextureProcessor): return False -class ExtractLook(MayaExtractorPlugin): +class ExtractLook(plugin.MayaExtractorPlugin): """Extract Look (Maya Scene + JSON) Only extracts the sets (shadingEngines and alike) alongside a .json file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index 473a26ce8f..6e66353c7a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -6,11 +6,11 @@ from ayon_core.lib import BoolDef from ayon_core.pipeline import AVALON_CONTAINER_ID, AYON_CONTAINER_ID from ayon_core.pipeline.publish import AYONPyblishPluginMixin from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMayaSceneRaw(MayaExtractorPlugin, AYONPyblishPluginMixin): +class ExtractMayaSceneRaw(plugin.MayaExtractorPlugin, AYONPyblishPluginMixin): """Extract as Maya Scene (raw). This will preserve all references, construction history, etc. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index 4ae0445055..d2bf98afbc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -5,7 +5,7 @@ import os import pyblish.api import six from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -111,7 +111,7 @@ def usd_export_attributes(nodes, attrs=None, attr_prefixes=None, mapping=None): dg_mod.undoIt() -class ExtractMayaUsd(MayaExtractorPlugin): +class ExtractMayaUsd(plugin.MayaExtractorPlugin): """Extractor for Maya USD Asset data. Upon publish a .usd (or .usdz) asset file will typically be written. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index 950e09fb29..7f257a2013 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -4,11 +4,11 @@ import os from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractModel(MayaExtractorPlugin, +class ExtractModel(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract as Model (Maya Scene). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index f951f255b9..b6f8043a93 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -3,10 +3,10 @@ import os from maya import cmds from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractMultiverseLook(MayaExtractorPlugin): +class ExtractMultiverseLook(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD look data. This will extract: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index 3f86f23ee3..477af9dc26 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -3,11 +3,11 @@ import os import pyblish.api import six from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds, mel -class ExtractMultiverseUsd(MayaExtractorPlugin): +class ExtractMultiverseUsd(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD Asset data. This will extract settings for a Multiverse Write Asset operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index 648b5b3cc7..3d18bb80e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMultiverseUsdComposition(MayaExtractorPlugin): +class ExtractMultiverseUsdComposition(plugin.MayaExtractorPlugin): """Extractor of Multiverse USD Composition data. This will extract settings for a Multiverse Write Composition operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index b7469d3627..a67f5c0a99 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMultiverseUsdOverride(MayaExtractorPlugin): +class ExtractMultiverseUsdOverride(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD Override data. This will extract settings for a Multiverse Write Override operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 1daf37afde..baf86b581e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -3,11 +3,11 @@ import os import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractObj(MayaExtractorPlugin): +class ExtractObj(plugin.MayaExtractorPlugin): """Extract OBJ from Maya. This extracts reproducible OBJ exports ignoring any of the settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index f4388827a5..539246eef0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -2,11 +2,11 @@ import os import clique from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractPlayblast(MayaExtractorPlugin): +class ExtractPlayblast(plugin.MayaExtractorPlugin): """Extract viewport playblast. Takes review camera and creates review Quicktime video based on viewport diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index cdbcb7c9f1..d3e9d89aaf 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -18,11 +18,11 @@ from ayon_maya.api.lib import ( maintained_selection, suspended_refresh, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractAlembic(MayaExtractorPlugin, AYONPyblishPluginMixin): +class ExtractAlembic(plugin.MayaExtractorPlugin, AYONPyblishPluginMixin): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index fb17768eb2..fc1c7981ed 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -6,11 +6,11 @@ from ayon_maya.api.lib import ( maintained_selection, suspended_refresh, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractProxyAlembic(MayaExtractorPlugin): +class ExtractProxyAlembic(plugin.MayaExtractorPlugin): """Produce an alembic for bounding box geometry """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 18b0282e83..909d3dd172 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -3,14 +3,14 @@ import os from ayon_maya.api.lib import maintained_selection, renderlayer -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_maya.api.render_setup_tools import ( allow_export_from_render_setup_layer, ) from maya import cmds -class ExtractRedshiftProxy(MayaExtractorPlugin): +class ExtractRedshiftProxy(plugin.MayaExtractorPlugin): """Extract the content of the instance to a redshift proxy file.""" label = "Redshift Proxy (.rs)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py index c8043e435e..8dcdd603b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py @@ -2,10 +2,10 @@ import json import os import maya.app.renderSetup.model.renderSetup as renderSetup -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractRenderSetup(MayaExtractorPlugin): +class ExtractRenderSetup(plugin.MayaExtractorPlugin): """ Produce renderSetup template file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 7568ee9b5b..3f96d7123d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -3,11 +3,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractRig(MayaExtractorPlugin): +class ExtractRig(plugin.MayaExtractorPlugin): """Extract rig as Maya Scene.""" label = "Extract Rig (Maya Scene)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index 549327d8a2..e496d53d42 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -6,10 +6,10 @@ import pyblish.api from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import fbx -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractSkeletonMesh(MayaExtractorPlugin, +class ExtractSkeletonMesh(plugin.MayaExtractorPlugin, OptionalPyblishPluginMixin): """Extract Rig in FBX format from Maya. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index d2ecf7f158..c2ffedd67c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -3,10 +3,10 @@ import os import tempfile from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractThumbnail(MayaExtractorPlugin): +class ExtractThumbnail(plugin.MayaExtractorPlugin): """Extract viewport thumbnail. Takes review camera and creates a thumbnail based on viewport diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index 66ea4b1b6c..a5d9303052 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -4,11 +4,11 @@ import os from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import maintained_selection, suspended_refresh -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractUnrealSkeletalMeshAbc(MayaExtractorPlugin): +class ExtractUnrealSkeletalMeshAbc(plugin.MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ label = "Extract Unreal Skeletal Mesh - Alembic" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 81135bbb92..36324d3511 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -5,7 +5,7 @@ from contextlib import contextmanager import pyblish.api from ayon_maya.api import fbx -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa @@ -19,7 +19,7 @@ def renamed(original_name, renamed_name): cmds.rename(renamed_name, original_name) -class ExtractUnrealSkeletalMeshFbx(MayaExtractorPlugin): +class ExtractUnrealSkeletalMeshFbx(plugin.MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index b4ee55b9e1..215f82b338 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -5,11 +5,11 @@ import os import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import maintained_selection, parent_nodes -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractUnrealStaticMesh(MayaExtractorPlugin): +class ExtractUnrealStaticMesh(plugin.MayaExtractorPlugin): """Extract Unreal Static Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py index fb90e9ee2b..79f47fbe9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py @@ -1,10 +1,10 @@ import os -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractUnrealYetiCache(MayaExtractorPlugin): +class ExtractUnrealYetiCache(plugin.MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index 04b037ef03..d6f1fd6698 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractVRayProxy(MayaExtractorPlugin): +class ExtractVRayProxy(plugin.MayaExtractorPlugin): """Extract the content of the instance to a vrmesh file Things to pay attention to: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index 00c3f2b158..785cb4c37c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -4,12 +4,12 @@ import os import re from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_maya.api.render_setup_tools import export_in_rs_layer from maya import cmds -class ExtractVrayscene(MayaExtractorPlugin): +class ExtractVrayscene(plugin.MayaExtractorPlugin): """Extractor for vrscene.""" label = "VRay Scene (.vrscene)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index c93da91207..e6df19c7f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -4,11 +4,11 @@ import shutil import pyblish.api from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractWorkfileXgen(MayaExtractorPlugin): +class ExtractWorkfileXgen(plugin.MayaExtractorPlugin): """Extract Workfile Xgen. When submitting a render, we need to prep Xgen side car files. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index 47a8140ef6..bb700bbdec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -9,11 +9,11 @@ from ayon_maya.api.lib import ( maintained_selection, write_xgen_file, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractXgen(MayaExtractorPlugin): +class ExtractXgen(plugin.MayaExtractorPlugin): """Extract Xgen Workflow: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py index e3e9a76d72..b84867316c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py @@ -1,11 +1,11 @@ import json import os -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractYetiCache(MayaExtractorPlugin): +class ExtractYetiCache(plugin.MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 0c21118b22..640b37b667 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -6,7 +6,7 @@ import json import os from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -89,7 +89,7 @@ def yetigraph_attribute_values(assumed_destination, resources): pass -class ExtractYetiRig(MayaExtractorPlugin): +class ExtractYetiRig(plugin.MayaExtractorPlugin): """Extract the Yeti rig to a Maya Scene and write the Yeti rig data.""" label = "Extract Yeti Rig" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py index 62c5e9a8b2..66019c4837 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class IncrementCurrentFileDeadline(MayaContextPlugin): +class IncrementCurrentFileDeadline(plugin.MayaContextPlugin): """Increment the current file. Saves the current maya scene with an increased version number. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py index 923614c8d1..ac9e1beeec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ResetXgenAttributes(MayaInstancePlugin): +class ResetXgenAttributes(plugin.MayaInstancePlugin): """Reset Xgen attributes. When the incremental save of the workfile triggers, the Xgen attributes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py index f062f0d947..9c23fcff85 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_lock_enabled, remove_workfile_lock, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class SaveCurrentScene(MayaContextPlugin): +class SaveCurrentScene(plugin.MayaContextPlugin): """Save current scene.""" label = "Save current file" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index f68418770b..fd4e2254a7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -3,11 +3,11 @@ import inspect import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin from ayon_core.pipeline.publish import PublishValidationError, RepairAction -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin class ValidateAlembicDefaultsPointcache( - MayaInstancePlugin, OptionalPyblishPluginMixin + plugin.MayaInstancePlugin, OptionalPyblishPluginMixin ): """Validate the attributes on the instance are defaults. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index b11e6ec930..b10a1a2bb7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAnimationContent(MayaInstancePlugin, +class ValidateAnimationContent(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'animation' product type diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index ba8a50ea40..40f03b2690 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateOutRelatedNodeIds(MayaInstancePlugin, +class ValidateOutRelatedNodeIds(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 7f8015443d..edc4161dff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import is_visible -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateArnoldSceneSource(MayaInstancePlugin): +class ValidateArnoldSceneSource(plugin.MayaInstancePlugin): """Validate Arnold Scene Source. Ensure no nodes are hidden. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index 0da1a26293..8da8813b0d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateArnoldSceneSourceCbid(MayaInstancePlugin, +class ValidateArnoldSceneSourceCbid(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Arnold Scene Source Cbid. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py index 030e2fb950..36c220f862 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py @@ -10,10 +10,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssRelativePaths(MayaInstancePlugin, +class ValidateAssRelativePaths(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure exporting ass file has set relative texture paths""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index 468f9aee9b..4dfe7214bf 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssemblyName(MayaInstancePlugin, +class ValidateAssemblyName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Ensure Assembly name ends with `GRP` diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 15119fa3c2..324b12a207 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssemblyNamespaces(MayaInstancePlugin, +class ValidateAssemblyNamespaces(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure namespaces are not nested. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index 9d2aa98c24..7fc14560f7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateAssemblyModelTransforms(MayaInstancePlugin, +class ValidateAssemblyModelTransforms(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Verify only root nodes of the loaded asset have transformations. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 2f52c92200..8d4d8323ce 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import set_attribute -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateAttributes(MayaInstancePlugin, +class ValidateAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure attributes are consistent. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 1922b22109..8c3f3800cc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCameraAttributes(MayaInstancePlugin, +class ValidateCameraAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera has no invalid attribute keys or values. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 988b16cec2..42a5ef1769 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, OptionalPyblishPluginMixin) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateCameraContents(MayaInstancePlugin, +class ValidateCameraContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera instance contents. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index d89244b5f7..f95e27def1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateColorSets(MayaInstancePlugin, +class ValidateColorSets(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py index c863778e07..6c599d398d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, context_plugin_should_run, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCurrentRenderLayerIsRenderable(MayaContextPlugin, +class ValidateCurrentRenderLayerIsRenderable(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if current render layer has a renderable camera. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index 62aafa9f53..0b870993e9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCycleError(MayaInstancePlugin, +class ValidateCycleError(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes produce no cycle errors.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index a5834d9bff..90bdef4107 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -5,12 +5,12 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib_rendersetup import get_attr_in_layer, get_attr_overrides -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds from maya.app.renderSetup.model.override import AbsOverride -class ValidateFrameRange(MayaInstancePlugin, +class ValidateFrameRange(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the frame ranges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py index d620de49c1..e94cb3e663 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py @@ -5,11 +5,11 @@ from ayon_core.pipeline import ( PublishValidationError, ) from ayon_core.pipeline.publish import RepairAction, ValidateContentsOrder -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateGLSLMaterial(MayaInstancePlugin, +class ValidateGLSLMaterial(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py index 588c86e297..aaea616631 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateGLSLPlugin(MayaInstancePlugin, +class ValidateGLSLPlugin(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index 2fc5a3910f..baca2a9008 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateInstanceHasMembers(MayaInstancePlugin): +class ValidateInstanceHasMembers(plugin.MayaInstancePlugin): """Validates instance objectSet has *any* members.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index 3d1d051484..5168c8496c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateInstanceInContext(MayaInstancePlugin, +class ValidateInstanceInContext(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validator to check if instance asset match context asset. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py index fe18d9359e..4c876079ff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin # Allow only characters, numbers and underscore allowed = set(string.ascii_lowercase + @@ -18,7 +18,7 @@ def validate_name(product_name): return all(x in allowed for x in product_name) -class ValidateSubsetName(MayaInstancePlugin): +class ValidateSubsetName(plugin.MayaInstancePlugin): """Validates product name has only valid characters""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py index b83f411681..60af00186e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py @@ -7,10 +7,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateLoadedPlugin(MayaInstancePlugin, +class ValidateLoadedPlugin(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure there are no unauthorized loaded plugins""" @@ -23,17 +23,17 @@ class ValidateLoadedPlugin(MayaInstancePlugin, def get_invalid(cls, context): invalid = [] - loaded_plugin = cmds.pluginInfo(query=True, listPlugins=True) + loaded_plugins = cmds.pluginInfo(query=True, listPlugins=True) # get variable from AYON settings whitelist_native_plugins = cls.whitelist_native_plugins authorized_plugins = cls.authorized_plugins or [] - for plugin in loaded_plugin: + for maya_plugin in loaded_plugins: if not whitelist_native_plugins and os.getenv('MAYA_LOCATION') \ - in cmds.pluginInfo(plugin, query=True, path=True): + in cmds.pluginInfo(maya_plugin, query=True, path=True): continue - if plugin not in authorized_plugins: - invalid.append(plugin) + if maya_plugin not in authorized_plugins: + invalid.append(maya_plugin) return invalid @@ -50,6 +50,6 @@ class ValidateLoadedPlugin(MayaInstancePlugin, def repair(cls, context): """Unload forbidden plugins""" - for plugin in cls.get_invalid(context): - cmds.pluginInfo(plugin, edit=True, autoload=False) - cmds.unloadPlugin(plugin, force=True) + for maya_plugin in cls.get_invalid(context): + cmds.pluginInfo(maya_plugin, edit=True, autoload=False) + cmds.unloadPlugin(maya_plugin, force=True) diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index 31e4073807..722f92b1b5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ValidateLookContents(MayaInstancePlugin): +class ValidateLookContents(plugin.MayaInstancePlugin): """Validate look instance contents Rules: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py index 2dca5a4a90..ac936b36c7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairContextAction, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookDefaultShadersConnections(MayaContextPlugin): +class ValidateLookDefaultShadersConnections(plugin.MayaContextPlugin): """Validate default shaders in the scene have their default connections. For example the standardSurface1 or lambert1 (maya 2023 and before) could diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index e1d956e060..4763128f3f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookIdReferenceEdits(MayaInstancePlugin): +class ValidateLookIdReferenceEdits(plugin.MayaInstancePlugin): """Validate nodes in look have no reference edits to cbId. Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index a93815f275..e4662dd498 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookNoDefaultShaders(MayaInstancePlugin): +class ValidateLookNoDefaultShaders(plugin.MayaInstancePlugin): """Validate if any node has a connection to a default shader. This checks whether the look has any members of: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index 21de06b061..eae1664114 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateLookSets(MayaInstancePlugin): +class ValidateLookSets(plugin.MayaInstancePlugin): """Validate if any sets relationships are not being collected. A shader can be assigned to a node that is missing a Colorbleed ID. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 8c0a92b012..2aecf64e01 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShadingEngine(MayaInstancePlugin, +class ValidateShadingEngine(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all shading engines are named after the surface material. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index 0cfb18df96..d48c050d97 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSingleShader(MayaInstancePlugin): +class ValidateSingleShader(plugin.MayaInstancePlugin): """Validate all nurbsSurfaces and meshes have exactly one shader assigned. This will error if a shape has no shaders or more than one shader. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 16c7920642..cb4df4b5d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( RepairContextAction, ValidateSceneOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class ValidateMayaUnits(MayaContextPlugin, +class ValidateMayaUnits(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Check if the Maya units are set correct""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index 26aac9c944..9729c8863d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -12,11 +12,11 @@ from ayon_maya.api.lib import ( set_attribute, undo_chunk, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshArnoldAttributes(MayaInstancePlugin, +class ValidateMeshArnoldAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the mesh has default Arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index 419ca3c3c3..12b2252eb8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshEmpty(MayaInstancePlugin): +class ValidateMeshEmpty(plugin.MayaInstancePlugin): """Validate meshes have some vertices. Its possible to have meshes without any vertices. To replicate diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 6f45cba973..c7576d2a78 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshHasUVs(MayaInstancePlugin, +class ValidateMeshHasUVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the current mesh has UVs. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index 23a38aedd8..50e3b5b53a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshLaminaFaces(MayaInstancePlugin, +class ValidateMeshLaminaFaces(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have lamina faces. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index f1d347df97..c73c8d27e8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshNgons(MayaInstancePlugin, +class ValidateMeshNgons(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have ngons diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index 58c3a9bc0f..7a77a2a4f6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNoNegativeScale(MayaInstancePlugin, +class ValidateMeshNoNegativeScale(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have a negative scale. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index 9e7461772e..8288e8a3b3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel @@ -100,7 +100,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNonManifold(MayaInstancePlugin, +class ValidateMeshNonManifold(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have non-manifold edges or vertices diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index f891a4f7de..bd11ca6488 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshNonZeroEdgeLength(MayaInstancePlugin, +class ValidateMeshNonZeroEdgeLength(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have edges with a zero length. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index c6b6786f24..dd8c523082 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -17,7 +17,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNormalsUnlocked(MayaInstancePlugin, +class ValidateMeshNormalsUnlocked(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index 5e9a4c3b60..0ef6c2732e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds from six.moves import xrange @@ -235,7 +235,7 @@ class GetOverlappingUVs(object): return faces -class ValidateMeshHasOverlappingUVs(MayaInstancePlugin, +class ValidateMeshHasOverlappingUVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate the current mesh overlapping UVs. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 9f9ca0c0d5..e3fff157ac 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -79,7 +79,7 @@ def disconnect(node_a, node_b): cmds.disconnectAttr(source, input) -class ValidateMeshShaderConnections(MayaInstancePlugin, +class ValidateMeshShaderConnections(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure mesh shading engine connections are valid. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index e7fb6d9ae0..a254cbf8a6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshSingleUVSet(MayaInstancePlugin, +class ValidateMeshSingleUVSet(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Warn on multiple UV sets existing for each polygon mesh. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index bce69c8279..a749edb35a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshUVSetMap1(MayaInstancePlugin, +class ValidateMeshUVSetMap1(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate model's default set exists and is named 'map1'. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index a63e9a0727..a10a275c44 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshVerticesHaveEdges(MayaInstancePlugin, +class ValidateMeshVerticesHaveEdges(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes have only vertices that are connected to edges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index 32435e9d86..5e100dca1c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateModelContent(MayaInstancePlugin, +class ValidateModelContent(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'model' product type diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 602c4ff371..b26a3f4cb7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -6,13 +6,13 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin COLOUR_SPACES = ['sRGB', 'linear', 'auto'] MIPMAP_EXTENSIONS = ['tdl'] -class ValidateMvLookContents(MayaInstancePlugin, +class ValidateMvLookContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): order = ValidateContentsOrder families = ['mvLook'] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index 6e6b04bfea..146dfda2ca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoAnimation(MayaInstancePlugin, +class ValidateNoAnimation(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no keyframes on nodes in the Instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index e5d938e337..a57c02a842 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoDefaultCameras(MayaInstancePlugin, +class ValidateNoDefaultCameras(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index a357b9cdec..9bd2d98e54 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -23,7 +23,7 @@ def get_namespace(node_name): return node_name.rpartition(":")[0] -class ValidateNoNamespace(MayaInstancePlugin, +class ValidateNoNamespace(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure the nodes don't have a namespace""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 581b304f60..5c1baeb0e3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -32,7 +32,7 @@ def has_shape_children(node): return True -class ValidateNoNullTransforms(MayaInstancePlugin, +class ValidateNoNullTransforms(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no null transforms are in the scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 4f55f5f64f..3662c94ba3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoUnknownNodes(MayaInstancePlugin, +class ValidateNoUnknownNodes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Checks to see if there are any unknown nodes in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py index f54e0ddcd1..d14c335021 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py @@ -3,7 +3,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -14,7 +14,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoVRayMesh(MayaInstancePlugin, +class ValidateNoVRayMesh(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate there are no VRayMesh objects in the instance""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index a5b1f50044..f9dafa024f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( ) import ayon_maya.api.action from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateNodeIDs(MayaInstancePlugin): +class ValidateNodeIDs(plugin.MayaInstancePlugin): """Validate nodes have a Colorbleed Id. When IDs are missing from nodes *save your scene* and they should be diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 28e6bf29b7..8e3c4e5bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeIdsDeformedShape(MayaInstancePlugin): +class ValidateNodeIdsDeformedShape(plugin.MayaInstancePlugin): """Validate if deformed shapes have related IDs to the original shapes. When a deformer is applied in the scene on a referenced mesh that already diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index 6465878889..95e488d8e7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateNodeIdsInDatabase(MayaInstancePlugin): +class ValidateNodeIdsInDatabase(plugin.MayaInstancePlugin): """Validate if the CB Id is related to an folder in the database All nodes with the `cbId` attribute will be validated to ensure that diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index eaf1d8a250..7382653d35 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -10,7 +10,7 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def is_valid_uuid(value) -> bool: @@ -22,7 +22,7 @@ def is_valid_uuid(value) -> bool: return True -class ValidateNodeIDsRelated(MayaInstancePlugin, +class ValidateNodeIDsRelated(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes have a related `cbId` to the instance.data[folderPath]""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index ee32b1decc..27606baa55 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeIdsUnique(MayaInstancePlugin): +class ValidateNodeIdsUnique(plugin.MayaInstancePlugin): """Validate the nodes in the instance have a unique Colorbleed Id Here we ensure that what has been added to the instance is unique diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 735b98dfe9..184e4eaf15 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeNoGhosting(MayaInstancePlugin, +class ValidateNodeNoGhosting(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure nodes do not have ghosting enabled. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index 4ab03f19c8..506759516e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ) from ayon_maya.api.action import SelectInvalidAction from ayon_maya.api.lib import pairwise -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidatePluginPathAttributes(MayaInstancePlugin, +class ValidatePluginPathAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate plug-in path attributes point to existing file paths. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py index 72a69302a8..fd1a9ad9e4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderImageRule(MayaInstancePlugin, +class ValidateRenderImageRule(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Maya Workpace "images" file rule matches project settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 85c304e0cd..083b21b819 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderNoDefaultCameras(MayaInstancePlugin, +class ValidateRenderNoDefaultCameras(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are to be rendered.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index a50f4eeab5..6856b9a0f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib_rendersettings import RenderSettings -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderSingleCamera(MayaInstancePlugin, +class ValidateRenderSingleCamera(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate renderable camera count for layer and token. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index dd9cca19a5..16350cfa08 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateRenderLayerAOVs(MayaInstancePlugin, +class ValidateRenderLayerAOVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate created AOVs / RenderElement is registered in the database diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index 5e3b6c541f..7b21bf6a14 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -11,7 +11,7 @@ from ayon_core.pipeline.publish import ( ) from ayon_maya.api import lib from ayon_maya.api.lib_rendersettings import RenderSettings -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel @@ -37,7 +37,7 @@ def get_redshift_image_format_labels(): return mel.eval("{0}={0}".format(var)) -class ValidateRenderSettings(MayaInstancePlugin, +class ValidateRenderSettings(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the global render settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index 63c0b9dab1..58d2ad3030 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -6,11 +6,11 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.publish import RepairAction from ayon_maya.api import lib from ayon_maya.api.lib import reset_scene_resolution -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateResolution(MayaInstancePlugin, +class ValidateResolution(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the render resolution setting aligned with DB""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py index e3c7d65000..0ec51d909c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateResources(MayaInstancePlugin): +class ValidateResources(plugin.MayaInstancePlugin): """Validates mapped resources. These are external files to the current application, for example diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py index c38c132347..76f61dc3e5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py @@ -1,10 +1,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateReview(MayaInstancePlugin): +class ValidateReview(plugin.MayaInstancePlugin): """Validate review.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index ad642c34b2..ada2ce045b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigContents(MayaInstancePlugin, +class ValidateRigContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure rig contains pipeline-critical content diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index 0bbbecc73d..fed78df2da 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import undo_chunk -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigControllers(MayaInstancePlugin, +class ValidateRigControllers(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig controllers. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index 4589603bff..06691f4bd3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigControllersArnoldAttributes(MayaInstancePlugin, +class ValidateRigControllersArnoldAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig control curves have no keyable arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index e9e43a9902..f0593ed7bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigJointsHidden(MayaInstancePlugin, +class ValidateRigJointsHidden(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all joints are hidden visually. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index 163e2007dd..e5f7a5b204 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateRigOutSetNodeIds(MayaInstancePlugin, +class ValidateRigOutSetNodeIds(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index 2a965173fa..064c83c0b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import get_id, set_id -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -16,7 +16,7 @@ def get_basename(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateRigOutputIds(MayaInstancePlugin): +class ValidateRigOutputIds(plugin.MayaInstancePlugin): """Validate rig output ids. Ids must share the same id as similarly named nodes in the scene. This is diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py index d8885cc530..cd36f98dfb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidatePipelineOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin def is_subdir(path, root_dir): @@ -27,7 +27,7 @@ def is_subdir(path, root_dir): return True -class ValidateSceneSetWorkspace(MayaContextPlugin): +class ValidateSceneSetWorkspace(plugin.MayaContextPlugin): """Validate the scene is inside the currently set Maya workspace""" order = ValidatePipelineOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py index ae5493ffe4..26245435eb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py @@ -2,10 +2,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSetdressRoot(MayaInstancePlugin): +class ValidateSetdressRoot(plugin.MayaInstancePlugin): """Validate if set dress top root node is published.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index 77dc24d1a4..45d7ee1c8b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShaderName(MayaInstancePlugin, +class ValidateShaderName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate shader name assigned. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index bd9f0cf1d7..4e4f98d755 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def short_name(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateShapeDefaultNames(MayaInstancePlugin, +class ValidateShapeDefaultNames(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that Shape names are using Maya's default format. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index 646c12f331..a9c3e861f0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShapeRenderStats(MayaInstancePlugin, +class ValidateShapeRenderStats(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure all render stats are set to the default values.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 8f58e646f0..8c11009374 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShapeZero(MayaInstancePlugin, +class ValidateShapeZero(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Shape components may not have any "tweak" values diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py index 02f3973149..0a760e2acc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py @@ -2,10 +2,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSingleAssembly(MayaInstancePlugin): +class ValidateSingleAssembly(plugin.MayaInstancePlugin): """Ensure the content of the instance is grouped in a single hierarchy The instance must have a single root node containing all the content. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py index be71eebac2..9904fdce22 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishXmlValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletalMeshHierarchy(MayaInstancePlugin, +class ValidateSkeletalMeshHierarchy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that nodes has common root.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index db93b8cbc5..7b2b005e9c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.action import SelectInvalidAction -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletalMeshTriangulated(MayaInstancePlugin): +class ValidateSkeletalMeshTriangulated(plugin.MayaInstancePlugin): """Validates that the geometry has been triangulated.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py index 57418324c9..4e0dc38a36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletonTopGroupHierarchy(MayaInstancePlugin, +class ValidateSkeletonTopGroupHierarchy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates top group hierarchy in the SETs Make sure the object inside the SETs are always top diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index ee99b432aa..32015a57bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSkinclusterDeformerSet(MayaInstancePlugin, +class ValidateSkinclusterDeformerSet(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate skinClusters on meshes have valid member relationships. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index 445388efc1..303885d907 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateStepSize(MayaInstancePlugin, +class ValidateStepSize(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the step size for the instance is in a valid range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index 1d6a29d446..3a60bc7aef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateTransformNamingSuffix(MayaInstancePlugin, +class ValidateTransformNamingSuffix(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates transform suffix based on the type of its children shapes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index 621a7dd6bc..e251572c0d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateTransformZero(MayaInstancePlugin, +class ValidateTransformZero(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Transforms can't have any values diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 59540b659a..cbe5d2f647 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUniqueNames(MayaInstancePlugin, +class ValidateUniqueNames(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """transform names should be unique diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index e8fc3fc095..f283150892 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUnrealMeshTriangulated(MayaInstancePlugin, +class ValidateUnrealMeshTriangulated(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if mesh is made of triangles for Unreal Engine""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index 054f9aa3a0..dee6563989 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -8,10 +8,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateUnrealStaticMeshName(MayaInstancePlugin, +class ValidateUnrealStaticMeshName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate name of Unreal Static Mesh diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py index fad0eff5f8..d970eb8020 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUnrealUpAxis(MayaContextPlugin, +class ValidateUnrealUpAxis(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if Z is set as up axis in Maya""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 431cf2f229..b694b890fc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import iter_visible_nodes_in_range -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAlembicVisibleOnly(MayaInstancePlugin, +class ValidateAlembicVisibleOnly(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates at least a single node is visible in frame range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py index 65a01886b6..7cf064f993 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_core.pipeline.publish import PublishValidationError -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVray(MayaInstancePlugin): +class ValidateVray(plugin.MayaInstancePlugin): """Validate general Vray setup.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index d58c01c1e2..0338798e3f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVRayDistributedRendering(MayaInstancePlugin, +class ValidateVRayDistributedRendering(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate V-Ray Distributed Rendering is ignored in batch mode. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py index 9cc3290853..a330866e9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairContextAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVrayReferencedAOVs(MayaInstancePlugin, +class ValidateVrayReferencedAOVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Render Elements (AOVs) include references. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py index 546fd480a9..a4b34db2a1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, context_plugin_should_run, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVRayTranslatorEnabled(MayaContextPlugin, +class ValidateVRayTranslatorEnabled(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate VRay Translator settings for extracting vrscenes.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py index 06b717be03..67d656b183 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateVrayProxy(MayaInstancePlugin, +class ValidateVrayProxy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): order = pyblish.api.ValidatorOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 60d4fe4d8c..cfb17cda55 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVrayProxyMembers(MayaInstancePlugin, +class ValidateVrayProxyMembers(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Proxy instance has shape members""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py index 036da2c1e6..050165db01 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py @@ -4,10 +4,10 @@ import maya.cmds as cmds import pyblish.api import xgenm from ayon_core.pipeline.publish import PublishValidationError -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateXgen(MayaInstancePlugin): +class ValidateXgen(plugin.MayaInstancePlugin): """Validate Xgen data.""" label = "Validate Xgen" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py index c185838028..ce6410deaa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateYetiRenderScriptCallbacks(MayaInstancePlugin, +class ValidateYetiRenderScriptCallbacks(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Check if the render script callbacks will be used during the rendering diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 64478d4c50..a7f272c1ec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -8,10 +8,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateYetiRigCacheState(MayaInstancePlugin, +class ValidateYetiRigCacheState(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the I/O attributes of the node diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index cf637e55cb..8c258b4455 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateYetiRigInputShapesInInstance(MayaInstancePlugin, +class ValidateYetiRigInputShapesInInstance(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if all input nodes are part of the instance's hierarchy""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py index 4258fb8feb..fa0836e0ef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateYetiRigSettings(MayaInstancePlugin, +class ValidateYetiRigSettings(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Yeti Rig Settings have collected input connections. From 34ccd63e2db9b6ea9cc4d0e5dbdfde10ea5f56f0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 30 May 2024 16:56:47 +0200 Subject: [PATCH 399/469] Fix deadline version Needs to match what is in package. Currently no way how to query Server to get version in a bundle. --- client/ayon_core/modules/deadline/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/version.py b/client/ayon_core/modules/deadline/version.py index 569b1212f7..74acd0efba 100644 --- a/client/ayon_core/modules/deadline/version.py +++ b/client/ayon_core/modules/deadline/version.py @@ -1 +1 @@ -__version__ = "0.1.10" +__version__ = "0.1.12" From 41bee8c211c778ed0cfd2beaed825beadc0d7db0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:29:22 +0200 Subject: [PATCH 400/469] move resolve code next to server code --- .../resolve/client/ayon_resolve}/README.markdown | 0 .../resolve/client/ayon_resolve}/RESOLVE_API_v19.0B-build20.txt | 0 .../resolve/client/ayon_resolve}/__init__.py | 0 .../resolve => server_addon/resolve/client/ayon_resolve}/addon.py | 0 .../resolve/client/ayon_resolve}/api/__init__.py | 0 .../resolve/client/ayon_resolve}/api/action.py | 0 .../resolve/client/ayon_resolve}/api/lib.py | 0 .../resolve/client/ayon_resolve}/api/menu.py | 0 .../resolve/client/ayon_resolve}/api/menu_style.qss | 0 .../resolve/client/ayon_resolve}/api/pipeline.py | 0 .../resolve/client/ayon_resolve}/api/plugin.py | 0 .../resolve/client/ayon_resolve}/api/testing_utils.py | 0 .../resolve/client/ayon_resolve}/api/todo-rendering.py | 0 .../resolve/client/ayon_resolve}/api/utils.py | 0 .../resolve/client/ayon_resolve}/api/workio.py | 0 .../client/ayon_resolve}/hooks/pre_resolve_last_workfile.py | 0 .../resolve/client/ayon_resolve}/hooks/pre_resolve_setup.py | 0 .../resolve/client/ayon_resolve}/hooks/pre_resolve_startup.py | 0 .../resolve/client/ayon_resolve}/otio/__init__.py | 0 .../resolve/client/ayon_resolve}/otio/davinci_export.py | 0 .../resolve/client/ayon_resolve}/otio/davinci_import.py | 0 .../resolve/client/ayon_resolve}/otio/utils.py | 0 .../client/ayon_resolve}/plugins/create/create_shot_clip.py | 0 .../resolve/client/ayon_resolve}/plugins/load/load_clip.py | 0 .../client/ayon_resolve}/plugins/load/load_editorial_package.py | 0 .../client/ayon_resolve}/plugins/publish/extract_workfile.py | 0 .../client/ayon_resolve}/plugins/publish/precollect_instances.py | 0 .../client/ayon_resolve}/plugins/publish/precollect_workfile.py | 0 .../resolve/client/ayon_resolve}/startup.py | 0 .../resolve/client/ayon_resolve}/utility_scripts/AYON__Menu.py | 0 .../client/ayon_resolve}/utility_scripts/ayon_startup.scriptlib | 0 .../client/ayon_resolve}/utility_scripts/develop/OTIO_export.py | 0 .../client/ayon_resolve}/utility_scripts/develop/OTIO_import.py | 0 .../utility_scripts/develop/OpenPype_sync_util_scripts.py | 0 .../resolve => server_addon/resolve/client/ayon_resolve}/utils.py | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/README.markdown (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/RESOLVE_API_v19.0B-build20.txt (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/addon.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/action.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/lib.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/menu.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/menu_style.qss (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/pipeline.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/plugin.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/testing_utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/todo-rendering.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/workio.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_last_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_setup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_startup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/davinci_export.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/davinci_import.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/create/create_shot_clip.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/load/load_clip.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/load/load_editorial_package.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/extract_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/precollect_instances.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/precollect_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/startup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/AYON__Menu.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/ayon_startup.scriptlib (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OTIO_export.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OTIO_import.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OpenPype_sync_util_scripts.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utils.py (100%) diff --git a/client/ayon_core/hosts/resolve/README.markdown b/server_addon/resolve/client/ayon_resolve/README.markdown similarity index 100% rename from client/ayon_core/hosts/resolve/README.markdown rename to server_addon/resolve/client/ayon_resolve/README.markdown diff --git a/client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt b/server_addon/resolve/client/ayon_resolve/RESOLVE_API_v19.0B-build20.txt similarity index 100% rename from client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt rename to server_addon/resolve/client/ayon_resolve/RESOLVE_API_v19.0B-build20.txt diff --git a/client/ayon_core/hosts/resolve/__init__.py b/server_addon/resolve/client/ayon_resolve/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/__init__.py rename to server_addon/resolve/client/ayon_resolve/__init__.py diff --git a/client/ayon_core/hosts/resolve/addon.py b/server_addon/resolve/client/ayon_resolve/addon.py similarity index 100% rename from client/ayon_core/hosts/resolve/addon.py rename to server_addon/resolve/client/ayon_resolve/addon.py diff --git a/client/ayon_core/hosts/resolve/api/__init__.py b/server_addon/resolve/client/ayon_resolve/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/__init__.py rename to server_addon/resolve/client/ayon_resolve/api/__init__.py diff --git a/client/ayon_core/hosts/resolve/api/action.py b/server_addon/resolve/client/ayon_resolve/api/action.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/action.py rename to server_addon/resolve/client/ayon_resolve/api/action.py diff --git a/client/ayon_core/hosts/resolve/api/lib.py b/server_addon/resolve/client/ayon_resolve/api/lib.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/lib.py rename to server_addon/resolve/client/ayon_resolve/api/lib.py diff --git a/client/ayon_core/hosts/resolve/api/menu.py b/server_addon/resolve/client/ayon_resolve/api/menu.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/menu.py rename to server_addon/resolve/client/ayon_resolve/api/menu.py diff --git a/client/ayon_core/hosts/resolve/api/menu_style.qss b/server_addon/resolve/client/ayon_resolve/api/menu_style.qss similarity index 100% rename from client/ayon_core/hosts/resolve/api/menu_style.qss rename to server_addon/resolve/client/ayon_resolve/api/menu_style.qss diff --git a/client/ayon_core/hosts/resolve/api/pipeline.py b/server_addon/resolve/client/ayon_resolve/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/pipeline.py rename to server_addon/resolve/client/ayon_resolve/api/pipeline.py diff --git a/client/ayon_core/hosts/resolve/api/plugin.py b/server_addon/resolve/client/ayon_resolve/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/plugin.py rename to server_addon/resolve/client/ayon_resolve/api/plugin.py diff --git a/client/ayon_core/hosts/resolve/api/testing_utils.py b/server_addon/resolve/client/ayon_resolve/api/testing_utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/testing_utils.py rename to server_addon/resolve/client/ayon_resolve/api/testing_utils.py diff --git a/client/ayon_core/hosts/resolve/api/todo-rendering.py b/server_addon/resolve/client/ayon_resolve/api/todo-rendering.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/todo-rendering.py rename to server_addon/resolve/client/ayon_resolve/api/todo-rendering.py diff --git a/client/ayon_core/hosts/resolve/api/utils.py b/server_addon/resolve/client/ayon_resolve/api/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/utils.py rename to server_addon/resolve/client/ayon_resolve/api/utils.py diff --git a/client/ayon_core/hosts/resolve/api/workio.py b/server_addon/resolve/client/ayon_resolve/api/workio.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/workio.py rename to server_addon/resolve/client/ayon_resolve/api/workio.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_last_workfile.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_last_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_last_workfile.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_last_workfile.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_setup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_setup.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_startup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_startup.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py diff --git a/client/ayon_core/hosts/resolve/otio/__init__.py b/server_addon/resolve/client/ayon_resolve/otio/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/__init__.py rename to server_addon/resolve/client/ayon_resolve/otio/__init__.py diff --git a/client/ayon_core/hosts/resolve/otio/davinci_export.py b/server_addon/resolve/client/ayon_resolve/otio/davinci_export.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/davinci_export.py rename to server_addon/resolve/client/ayon_resolve/otio/davinci_export.py diff --git a/client/ayon_core/hosts/resolve/otio/davinci_import.py b/server_addon/resolve/client/ayon_resolve/otio/davinci_import.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/davinci_import.py rename to server_addon/resolve/client/ayon_resolve/otio/davinci_import.py diff --git a/client/ayon_core/hosts/resolve/otio/utils.py b/server_addon/resolve/client/ayon_resolve/otio/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/utils.py rename to server_addon/resolve/client/ayon_resolve/otio/utils.py diff --git a/client/ayon_core/hosts/resolve/plugins/create/create_shot_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/create/create_shot_clip.py rename to server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/load/load_clip.py rename to server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py rename to server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/extract_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/extract_workfile.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/precollect_instances.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/precollect_instances.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/precollect_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/precollect_workfile.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py diff --git a/client/ayon_core/hosts/resolve/startup.py b/server_addon/resolve/client/ayon_resolve/startup.py similarity index 100% rename from client/ayon_core/hosts/resolve/startup.py rename to server_addon/resolve/client/ayon_resolve/startup.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/AYON__Menu.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/AYON__Menu.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/ayon_startup.scriptlib b/server_addon/resolve/client/ayon_resolve/utility_scripts/ayon_startup.scriptlib similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/ayon_startup.scriptlib rename to server_addon/resolve/client/ayon_resolve/utility_scripts/ayon_startup.scriptlib diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_export.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_export.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_import.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_import.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py diff --git a/client/ayon_core/hosts/resolve/utils.py b/server_addon/resolve/client/ayon_resolve/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/utils.py rename to server_addon/resolve/client/ayon_resolve/utils.py From e883ac4c812a62afe3a97af23da6f6bfff9c2907 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:36:37 +0200 Subject: [PATCH 401/469] updated package.py --- server_addon/resolve/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/resolve/package.py b/server_addon/resolve/package.py index cf92413bce..993f700e40 100644 --- a/server_addon/resolve/package.py +++ b/server_addon/resolve/package.py @@ -1,3 +1,10 @@ name = "resolve" title = "DaVinci Resolve" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_resolve" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From e16ce8f80c8523e2e74fe32845e94e72833c0f9a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:37:08 +0200 Subject: [PATCH 402/469] fixed imports --- server_addon/resolve/client/ayon_resolve/__init__.py | 9 ++++++++- server_addon/resolve/client/ayon_resolve/addon.py | 6 ++++-- server_addon/resolve/client/ayon_resolve/api/pipeline.py | 6 ++---- server_addon/resolve/client/ayon_resolve/api/utils.py | 8 ++++---- .../client/ayon_resolve/hooks/pre_resolve_setup.py | 2 +- .../client/ayon_resolve/hooks/pre_resolve_startup.py | 5 ++--- .../ayon_resolve/plugins/create/create_shot_clip.py | 4 ++-- .../client/ayon_resolve/plugins/load/load_clip.py | 4 ++-- .../ayon_resolve/plugins/load/load_editorial_package.py | 2 +- .../ayon_resolve/plugins/publish/extract_workfile.py | 2 +- .../ayon_resolve/plugins/publish/precollect_instances.py | 2 +- .../ayon_resolve/plugins/publish/precollect_workfile.py | 4 ++-- server_addon/resolve/client/ayon_resolve/startup.py | 6 +++--- .../client/ayon_resolve/utility_scripts/AYON__Menu.py | 2 +- .../ayon_resolve/utility_scripts/develop/OTIO_export.py | 2 +- .../ayon_resolve/utility_scripts/develop/OTIO_import.py | 2 +- .../develop/OpenPype_sync_util_scripts.py | 4 ++-- server_addon/resolve/client/ayon_resolve/utils.py | 4 ++-- server_addon/resolve/client/ayon_resolve/version.py | 3 +++ 19 files changed, 43 insertions(+), 34 deletions(-) create mode 100644 server_addon/resolve/client/ayon_resolve/version.py diff --git a/server_addon/resolve/client/ayon_resolve/__init__.py b/server_addon/resolve/client/ayon_resolve/__init__.py index b4a994bbaa..ba9afb67d5 100644 --- a/server_addon/resolve/client/ayon_resolve/__init__.py +++ b/server_addon/resolve/client/ayon_resolve/__init__.py @@ -1,6 +1,13 @@ -from .addon import ResolveAddon +from .version import __version__ +from .addon import ( + RESOLVE_ADDON_ROOT, + ResolveAddon, +) __all__ = ( + "__version__", + + "RESOLVE_ADDON_ROOT", "ResolveAddon", ) diff --git a/server_addon/resolve/client/ayon_resolve/addon.py b/server_addon/resolve/client/ayon_resolve/addon.py index 1354caabb2..706d2802b0 100644 --- a/server_addon/resolve/client/ayon_resolve/addon.py +++ b/server_addon/resolve/client/ayon_resolve/addon.py @@ -2,18 +2,20 @@ import os from ayon_core.addon import AYONAddon, IHostAddon -from .utils import RESOLVE_ROOT_DIR +from .version import __version__ +from .utils import RESOLVE_ADDON_ROOT class ResolveAddon(AYONAddon, IHostAddon): name = "resolve" + version = __version__ host_name = "resolve" def get_launch_hook_paths(self, app): if app.host_name != self.host_name: return [] return [ - os.path.join(RESOLVE_ROOT_DIR, "hooks") + os.path.join(RESOLVE_ADDON_ROOT, "hooks") ] def get_workfile_extensions(self): diff --git a/server_addon/resolve/client/ayon_resolve/api/pipeline.py b/server_addon/resolve/client/ayon_resolve/api/pipeline.py index 15e4f1203d..d6d6dc799e 100644 --- a/server_addon/resolve/client/ayon_resolve/api/pipeline.py +++ b/server_addon/resolve/client/ayon_resolve/api/pipeline.py @@ -57,7 +57,7 @@ class ResolveHost(HostBase, IWorkfileHost, ILoadHost): """ - log.info("ayon_core.hosts.resolve installed") + log.info("ayon_resolve installed") pyblish.register_host(self.name) pyblish.register_plugin_path(PUBLISH_PATH) @@ -246,9 +246,7 @@ def on_pyblish_instance_toggled(instance, old_value, new_value): log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) - from ayon_core.hosts.resolve.api import ( - set_publish_attribute - ) + from ayon_resolve.api import set_publish_attribute # Whether instances should be passthrough based on new value timeline_item = instance.data["item"] diff --git a/server_addon/resolve/client/ayon_resolve/api/utils.py b/server_addon/resolve/client/ayon_resolve/api/utils.py index 030534370b..d63ade9d51 100644 --- a/server_addon/resolve/client/ayon_resolve/api/utils.py +++ b/server_addon/resolve/client/ayon_resolve/api/utils.py @@ -13,11 +13,11 @@ log = Logger.get_logger(__name__) def get_resolve_module(): - from ayon_core.hosts.resolve import api + from ayon_resolve import api # dont run if already loaded if api.bmdvr: log.info(("resolve module is assigned to " - f"`ayon_core.hosts.resolve.api.bmdvr`: {api.bmdvr}")) + f"`ayon_resolve.api.bmdvr`: {api.bmdvr}")) return api.bmdvr try: """ @@ -78,6 +78,6 @@ def get_resolve_module(): api.bmdvr = bmdvr api.bmdvf = bmdvf log.info(("Assigning resolve module to " - f"`ayon_core.hosts.resolve.api.bmdvr`: {api.bmdvr}")) + f"`ayon_resolve.api.bmdvr`: {api.bmdvr}")) log.info(("Assigning resolve module to " - f"`ayon_core.hosts.resolve.api.bmdvf`: {api.bmdvf}")) + f"`ayon_resolve.api.bmdvf`: {api.bmdvf}")) diff --git a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py index f45e28d5ab..ffd34d7b8d 100644 --- a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py +++ b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py @@ -2,7 +2,7 @@ import os from pathlib import Path import platform from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.resolve.utils import setup +from ayon_resolve.utils import setup class PreLaunchResolveSetup(PreLaunchHook): diff --git a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py index 300564f7cc..b357b10056 100644 --- a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py +++ b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py @@ -1,7 +1,7 @@ import os from ayon_applications import PreLaunchHook, LaunchTypes -import ayon_core.hosts.resolve +from ayon_resolve import RESOLVE_ADDON_ROOT class PreLaunchResolveStartup(PreLaunchHook): @@ -15,8 +15,7 @@ class PreLaunchResolveStartup(PreLaunchHook): def execute(self): # Set the openpype prelaunch startup script path for easy access # in the LUA .scriptlib code - op_resolve_root = os.path.dirname(ayon_core.hosts.resolve.__file__) - script_path = os.path.join(op_resolve_root, "startup.py") + script_path = os.path.join(RESOLVE_ADDON_ROOT, "startup.py") key = "AYON_RESOLVE_STARTUP_SCRIPT" self.launch_context.env[key] = script_path diff --git a/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py index cbc03da3b6..da98c8de7d 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py @@ -1,6 +1,6 @@ # from pprint import pformat -from ayon_core.hosts.resolve.api import plugin, lib -from ayon_core.hosts.resolve.api.lib import ( +from ayon_resolve.api import plugin, lib +from ayon_resolve.api.lib import ( get_video_track_names, create_bin, ) diff --git a/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py index 2ce1c43957..7e3a5a254e 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py @@ -1,7 +1,7 @@ import ayon_api -from ayon_core.hosts.resolve.api import lib, plugin -from ayon_core.hosts.resolve.api.pipeline import ( +from ayon_resolve.api import lib, plugin +from ayon_resolve.api.pipeline import ( containerise, update_container, ) diff --git a/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py index 33395534fa..234e7b7f71 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( get_representation_path, ) -from ayon_core.hosts.resolve.api import lib +from ayon_resolve.api import lib class LoadEditorialPackage(load.LoaderPlugin): diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py index 48ebdee7e3..77d14ccdc5 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.resolve.api.lib import get_project_manager +from ayon_resolve.api.lib import get_project_manager class ExtractWorkfile(publish.Extractor): diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py index caa79c85c0..10e1eba3e3 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py @@ -3,7 +3,7 @@ from pprint import pformat import pyblish from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID -from ayon_core.hosts.resolve.api.lib import ( +from ayon_resolve.api.lib import ( get_current_timeline_items, get_timeline_item_pype_tag, publish_clip_color, diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py index 6158cf1d61..a388d4bc59 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py @@ -3,8 +3,8 @@ from pprint import pformat from ayon_core.pipeline import get_current_folder_path -from ayon_core.hosts.resolve import api as rapi -from ayon_core.hosts.resolve.otio import davinci_export +from ayon_resolve import api as rapi +from ayon_resolve.otio import davinci_export class PrecollectWorkfile(pyblish.api.ContextPlugin): diff --git a/server_addon/resolve/client/ayon_resolve/startup.py b/server_addon/resolve/client/ayon_resolve/startup.py index 3ad0a6bf7b..7f0bd59055 100644 --- a/server_addon/resolve/client/ayon_resolve/startup.py +++ b/server_addon/resolve/client/ayon_resolve/startup.py @@ -11,7 +11,7 @@ This code runs in a separate process to the main Resolve process. """ import os from ayon_core.lib import Logger -import ayon_core.hosts.resolve.api +import ayon_resolve.api log = Logger.get_logger(__name__) @@ -27,7 +27,7 @@ def ensure_installed_host(): if host: return host - host = ayon_core.hosts.resolve.api.ResolveHost() + host = ayon_resolve.api.ResolveHost() install_host(host) return registered_host() @@ -35,7 +35,7 @@ def ensure_installed_host(): def launch_menu(): print("Launching Resolve AYON menu..") ensure_installed_host() - ayon_core.hosts.resolve.api.launch_ayon_menu() + ayon_resolve.api.launch_ayon_menu() def open_workfile(path): diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py index b10b477beb..670544d605 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py @@ -8,7 +8,7 @@ log = Logger.get_logger(__name__) def main(env): - from ayon_core.hosts.resolve.api import ResolveHost, launch_ayon_menu + from ayon_resolve.api import ResolveHost, launch_ayon_menu # activate resolve from openpype host = ResolveHost() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py index c1c83eb060..4572d1354d 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import os -from ayon_core.hosts.resolve.otio import davinci_export as otio_export +from ayon_resolve.otio import davinci_export as otio_export resolve = bmd.scriptapp("Resolve") # noqa fu = resolve.Fusion() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py index 5bbdd73402..17de1b6fc3 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import os -from ayon_core.hosts.resolve.otio import davinci_import as otio_import +from ayon_resolve.otio import davinci_import as otio_import resolve = bmd.scriptapp("Resolve") # noqa fu = resolve.Fusion() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py index c394238860..5a069aff9e 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py @@ -6,8 +6,8 @@ from ayon_core.pipeline import install_host def main(env): - from ayon_core.hosts.resolve.utils import setup - import ayon_core.hosts.resolve.api as bmdvr + from ayon_resolve.utils import setup + import ayon_resolve.api as bmdvr # Registers openpype's Global pyblish plugins install_host(bmdvr) setup(env) diff --git a/server_addon/resolve/client/ayon_resolve/utils.py b/server_addon/resolve/client/ayon_resolve/utils.py index 4ef6ea4f40..d256fda18d 100644 --- a/server_addon/resolve/client/ayon_resolve/utils.py +++ b/server_addon/resolve/client/ayon_resolve/utils.py @@ -2,7 +2,7 @@ import os import shutil from ayon_core.lib import Logger, is_running_from_build -RESOLVE_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +RESOLVE_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) def setup(env): @@ -12,7 +12,7 @@ def setup(env): util_scripts_dir = env["RESOLVE_UTILITY_SCRIPTS_DIR"] util_scripts_paths = [os.path.join( - RESOLVE_ROOT_DIR, + RESOLVE_ADDON_ROOT, "utility_scripts" )] diff --git a/server_addon/resolve/client/ayon_resolve/version.py b/server_addon/resolve/client/ayon_resolve/version.py new file mode 100644 index 0000000000..c8f8df554c --- /dev/null +++ b/server_addon/resolve/client/ayon_resolve/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'resolve' version.""" +__version__ = "0.2.0" From 7da9638a2a11f6732d4eee6718d2a754fcc7d10d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:37:28 +0200 Subject: [PATCH 403/469] added resolve milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index fcd41c5f7d..a5d1db4058 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -59,6 +59,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "tvpaint": VersionInfo(0, 2, 0), "maya": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), + "resolve": VersionInfo(0, 2, 0), "substancepainter": VersionInfo(0, 2, 0), } From 4996c184800b91b5f3cf313b930d4fd685f7e232 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:15:19 +0200 Subject: [PATCH 404/469] moved photoshop clinet next to server codebase --- .../photoshop/client/ayon_photoshop}/__init__.py | 0 .../photoshop/client/ayon_photoshop}/addon.py | 0 .../photoshop/client/ayon_photoshop}/api/README.md | 0 .../client/ayon_photoshop}/api/__init__.py | 0 .../client/ayon_photoshop}/api/extension.zxp | Bin .../client/ayon_photoshop}/api/extension/.debug | 0 .../ayon_photoshop}/api/extension/CSXS/manifest.xml | 0 .../api/extension/client/CSInterface.js | 0 .../ayon_photoshop}/api/extension/client/client.js | 0 .../api/extension/client/loglevel.min.js | 0 .../ayon_photoshop}/api/extension/client/wsrpc.js | 0 .../api/extension/client/wsrpc.min.js | 0 .../ayon_photoshop}/api/extension/host/JSX.js | 0 .../ayon_photoshop}/api/extension/host/index.jsx | 0 .../ayon_photoshop}/api/extension/host/json.js | 0 .../api/extension/icons/ayon_logo.png | Bin .../client/ayon_photoshop}/api/extension/index.html | 0 .../client/ayon_photoshop}/api/launch_logic.py | 0 .../client/ayon_photoshop}/api/launch_script.py | 0 .../photoshop/client/ayon_photoshop}/api/lib.py | 0 .../photoshop/client/ayon_photoshop}/api/panel.png | Bin .../client/ayon_photoshop}/api/panel_failure.png | Bin .../client/ayon_photoshop}/api/pipeline.py | 0 .../photoshop/client/ayon_photoshop}/api/plugin.py | 0 .../photoshop/client/ayon_photoshop}/api/ws_stub.py | 0 .../client/ayon_photoshop}/hooks/pre_launch_args.py | 0 .../photoshop/client/ayon_photoshop}/lib.py | 0 .../plugins/create/create_flatten_image.py | 0 .../ayon_photoshop}/plugins/create/create_image.py | 0 .../ayon_photoshop}/plugins/create/create_review.py | 0 .../plugins/create/create_workfile.py | 0 .../ayon_photoshop}/plugins/load/load_image.py | 0 .../plugins/load/load_image_from_sequence.py | 0 .../ayon_photoshop}/plugins/load/load_reference.py | 0 .../ayon_photoshop}/plugins/publish/closePS.py | 0 .../plugins/publish/collect_auto_image.py | 0 .../plugins/publish/collect_auto_image_refresh.py | 0 .../plugins/publish/collect_auto_review.py | 0 .../plugins/publish/collect_auto_workfile.py | 0 .../plugins/publish/collect_batch_data.py | 0 .../publish/collect_color_coded_instances.py | 0 .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_extension_version.py | 0 .../plugins/publish/collect_image.py | 0 .../plugins/publish/collect_published_version.py | 0 .../plugins/publish/collect_review.py | 0 .../plugins/publish/collect_version.py | 0 .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/extract_image.py | 0 .../plugins/publish/extract_review.py | 0 .../plugins/publish/extract_save_scene.py | 0 .../publish/help/validate_instance_asset.xml | 0 .../plugins/publish/help/validate_naming.xml | 0 .../plugins/publish/increment_workfile.py | 0 .../plugins/publish/validate_instance_asset.py | 0 .../plugins/publish/validate_naming.py | 0 .../client/ayon_photoshop}/resources/template.psd | Bin 57 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/__init__.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/addon.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/README.md (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/__init__.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension.zxp (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/.debug (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/CSXS/manifest.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/CSInterface.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/client.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/loglevel.min.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/wsrpc.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/wsrpc.min.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/JSX.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/index.jsx (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/json.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/icons/ayon_logo.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/index.html (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/launch_logic.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/launch_script.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/lib.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/panel.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/panel_failure.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/pipeline.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/plugin.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/ws_stub.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/hooks/pre_launch_args.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/lib.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_flatten_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_image_from_sequence.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_reference.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/closePS.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_image_refresh.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_batch_data.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_color_coded_instances.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_extension_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_published_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_save_scene.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/help/validate_instance_asset.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/help/validate_naming.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/increment_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/validate_instance_asset.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/validate_naming.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/resources/template.psd (100%) diff --git a/client/ayon_core/hosts/photoshop/__init__.py b/server_addon/photoshop/client/ayon_photoshop/__init__.py similarity index 100% rename from client/ayon_core/hosts/photoshop/__init__.py rename to server_addon/photoshop/client/ayon_photoshop/__init__.py diff --git a/client/ayon_core/hosts/photoshop/addon.py b/server_addon/photoshop/client/ayon_photoshop/addon.py similarity index 100% rename from client/ayon_core/hosts/photoshop/addon.py rename to server_addon/photoshop/client/ayon_photoshop/addon.py diff --git a/client/ayon_core/hosts/photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md similarity index 100% rename from client/ayon_core/hosts/photoshop/api/README.md rename to server_addon/photoshop/client/ayon_photoshop/api/README.md diff --git a/client/ayon_core/hosts/photoshop/api/__init__.py b/server_addon/photoshop/client/ayon_photoshop/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/__init__.py rename to server_addon/photoshop/client/ayon_photoshop/api/__init__.py diff --git a/client/ayon_core/hosts/photoshop/api/extension.zxp b/server_addon/photoshop/client/ayon_photoshop/api/extension.zxp similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension.zxp rename to server_addon/photoshop/client/ayon_photoshop/api/extension.zxp diff --git a/client/ayon_core/hosts/photoshop/api/extension/.debug b/server_addon/photoshop/client/ayon_photoshop/api/extension/.debug similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/.debug rename to server_addon/photoshop/client/ayon_photoshop/api/extension/.debug diff --git a/client/ayon_core/hosts/photoshop/api/extension/CSXS/manifest.xml b/server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/CSXS/manifest.xml rename to server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/CSInterface.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/CSInterface.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/client.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/client.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/loglevel.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/loglevel.min.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.min.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/JSX.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/JSX.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/JSX.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/JSX.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/index.jsx b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/index.jsx rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/json.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/json.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/icons/ayon_logo.png b/server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/icons/ayon_logo.png rename to server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png diff --git a/client/ayon_core/hosts/photoshop/api/extension/index.html b/server_addon/photoshop/client/ayon_photoshop/api/extension/index.html similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/index.html rename to server_addon/photoshop/client/ayon_photoshop/api/extension/index.html diff --git a/client/ayon_core/hosts/photoshop/api/launch_logic.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/launch_logic.py rename to server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py diff --git a/client/ayon_core/hosts/photoshop/api/launch_script.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/launch_script.py rename to server_addon/photoshop/client/ayon_photoshop/api/launch_script.py diff --git a/client/ayon_core/hosts/photoshop/api/lib.py b/server_addon/photoshop/client/ayon_photoshop/api/lib.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/lib.py rename to server_addon/photoshop/client/ayon_photoshop/api/lib.py diff --git a/client/ayon_core/hosts/photoshop/api/panel.png b/server_addon/photoshop/client/ayon_photoshop/api/panel.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/panel.png rename to server_addon/photoshop/client/ayon_photoshop/api/panel.png diff --git a/client/ayon_core/hosts/photoshop/api/panel_failure.png b/server_addon/photoshop/client/ayon_photoshop/api/panel_failure.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/panel_failure.png rename to server_addon/photoshop/client/ayon_photoshop/api/panel_failure.png diff --git a/client/ayon_core/hosts/photoshop/api/pipeline.py b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/pipeline.py rename to server_addon/photoshop/client/ayon_photoshop/api/pipeline.py diff --git a/client/ayon_core/hosts/photoshop/api/plugin.py b/server_addon/photoshop/client/ayon_photoshop/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/plugin.py rename to server_addon/photoshop/client/ayon_photoshop/api/plugin.py diff --git a/client/ayon_core/hosts/photoshop/api/ws_stub.py b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/ws_stub.py rename to server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py diff --git a/client/ayon_core/hosts/photoshop/hooks/pre_launch_args.py b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py similarity index 100% rename from client/ayon_core/hosts/photoshop/hooks/pre_launch_args.py rename to server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py diff --git a/client/ayon_core/hosts/photoshop/lib.py b/server_addon/photoshop/client/ayon_photoshop/lib.py similarity index 100% rename from client/ayon_core/hosts/photoshop/lib.py rename to server_addon/photoshop/client/ayon_photoshop/lib.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_flatten_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_flatten_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_image_from_sequence.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_image_from_sequence.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_reference.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_reference.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/closePS.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/closePS.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image_refresh.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image_refresh.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_batch_data.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_batch_data.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_color_coded_instances.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_current_file.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_current_file.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_extension_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_extension_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_published_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_published_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_save_scene.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_save_scene.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/help/validate_naming.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/help/validate_naming.xml rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/increment_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/increment_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/validate_instance_asset.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/validate_instance_asset.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/validate_naming.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py diff --git a/client/ayon_core/hosts/photoshop/resources/template.psd b/server_addon/photoshop/client/ayon_photoshop/resources/template.psd similarity index 100% rename from client/ayon_core/hosts/photoshop/resources/template.psd rename to server_addon/photoshop/client/ayon_photoshop/resources/template.psd From 3cb36982ce3f09258bef71cc4997c65f2448134f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:21:25 +0200 Subject: [PATCH 405/469] fixed imports --- server_addon/photoshop/client/ayon_photoshop/api/README.md | 2 +- .../photoshop/client/ayon_photoshop/api/launch_script.py | 2 +- server_addon/photoshop/client/ayon_photoshop/api/lib.py | 2 +- .../photoshop/client/ayon_photoshop/api/pipeline.py | 2 +- server_addon/photoshop/client/ayon_photoshop/lib.py | 4 ++-- .../ayon_photoshop/plugins/create/create_flatten_image.py | 4 ++-- .../client/ayon_photoshop/plugins/create/create_image.py | 6 +++--- .../client/ayon_photoshop/plugins/create/create_review.py | 2 +- .../client/ayon_photoshop/plugins/create/create_workfile.py | 2 +- .../client/ayon_photoshop/plugins/load/load_image.py | 4 ++-- .../ayon_photoshop/plugins/load/load_image_from_sequence.py | 4 ++-- .../client/ayon_photoshop/plugins/load/load_reference.py | 4 ++-- .../client/ayon_photoshop/plugins/publish/closePS.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_image.py | 2 +- .../plugins/publish/collect_auto_image_refresh.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_review.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_workfile.py | 2 +- .../plugins/publish/collect_color_coded_instances.py | 2 +- .../ayon_photoshop/plugins/publish/collect_current_file.py | 2 +- .../plugins/publish/collect_extension_version.py | 2 +- .../client/ayon_photoshop/plugins/publish/collect_image.py | 2 +- .../client/ayon_photoshop/plugins/publish/extract_image.py | 2 +- .../client/ayon_photoshop/plugins/publish/extract_review.py | 2 +- .../ayon_photoshop/plugins/publish/extract_save_scene.py | 2 +- .../ayon_photoshop/plugins/publish/increment_workfile.py | 2 +- .../plugins/publish/validate_instance_asset.py | 2 +- .../ayon_photoshop/plugins/publish/validate_naming.py | 2 +- 27 files changed, 34 insertions(+), 34 deletions(-) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md index b391131a42..41a26de70a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/README.md +++ b/server_addon/photoshop/client/ayon_photoshop/api/README.md @@ -128,7 +128,7 @@ class CollectInstances(pyblish.api.ContextPlugin): import os from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractImage(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py index bb4de80086..de7fc8ba48 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py @@ -8,7 +8,7 @@ workfile or others. import os import sys -from ayon_core.hosts.photoshop.api.lib import main as host_main +from ayon_photoshop.api.lib import main as host_main # Get current file to locate start point of sys.argv CURRENT_FILE = os.path.abspath(__file__) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/lib.py b/server_addon/photoshop/client/ayon_photoshop/api/lib.py index af14e6d02f..fd003919ce 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/lib.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/lib.py @@ -19,7 +19,7 @@ def safe_excepthook(*args): def main(*subprocess_args): - from ayon_core.hosts.photoshop.api import PhotoshopHost + from ayon_photoshop.api import PhotoshopHost host = PhotoshopHost() install_host(host) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py index 27cfa5a7b5..d399bb25e2 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py @@ -21,8 +21,8 @@ from ayon_core.host import ( ) from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.photoshop import PHOTOSHOP_ADDON_ROOT from ayon_core.tools.utils import get_ayon_qt_app +from ayon_photoshop import PHOTOSHOP_ADDON_ROOT from . import lib diff --git a/server_addon/photoshop/client/ayon_photoshop/lib.py b/server_addon/photoshop/client/ayon_photoshop/lib.py index dd227c5d81..9dc90953c5 100644 --- a/server_addon/photoshop/client/ayon_photoshop/lib.py +++ b/server_addon/photoshop/client/ayon_photoshop/lib.py @@ -2,13 +2,13 @@ import re import ayon_api -import ayon_core.hosts.photoshop.api as api from ayon_core.lib import prepare_template_data from ayon_core.pipeline import ( AutoCreator, CreatedInstance ) -from ayon_core.hosts.photoshop.api.pipeline import cache_and_get_instances +from ayon_photoshop import api +from ayon_photoshop.api.pipeline import cache_and_get_instances class PSAutoCreator(AutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py index a3bc77c640..a467a5ecaa 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py @@ -1,7 +1,7 @@ import ayon_api -import ayon_core.hosts.photoshop.api as api -from ayon_core.hosts.photoshop.lib import PSAutoCreator, clean_product_name +from ayon_photoshop import api +from ayon_photoshop.lib import PSAutoCreator, clean_product_name from ayon_core.lib import BoolDef, prepare_template_data from ayon_core.pipeline.create import get_product_name, CreatedInstance diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py index a44c3490c6..0170306301 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py @@ -1,6 +1,5 @@ import re -from ayon_core.hosts.photoshop import api from ayon_core.lib import BoolDef from ayon_core.pipeline import ( Creator, @@ -9,8 +8,9 @@ from ayon_core.pipeline import ( ) from ayon_core.lib import prepare_template_data from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS -from ayon_core.hosts.photoshop.api.pipeline import cache_and_get_instances -from ayon_core.hosts.photoshop.lib import clean_product_name +from ayon_photoshop import api +from ayon_photoshop.api.pipeline import cache_and_get_instances +from ayon_photoshop.lib import clean_product_name class ImageCreator(Creator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py index 229b736801..60c64b3831 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.photoshop.lib import PSAutoCreator +from ayon_photoshop.lib import PSAutoCreator class ReviewCreator(PSAutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py index da0c9d1d12..ce44a1ad2d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.photoshop.lib import PSAutoCreator +from ayon_photoshop.lib import PSAutoCreator class WorkfileCreator(PSAutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py index d71067615e..e3d80f6957 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py @@ -1,8 +1,8 @@ import re from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ImageLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py index dd14543f3e..f69dce26f6 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py @@ -2,8 +2,8 @@ import os import qargparse -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ImageFromSequenceLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py index b563faff82..21076f6a4f 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py @@ -1,8 +1,8 @@ import re from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ReferenceLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py index 68c3b5b249..2cdc9fa1e8 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py @@ -2,7 +2,7 @@ """Close PS after publish. For Webpublishing only.""" import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ClosePS(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py index adbe02eb74..23a71bdf46 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py index 7a5f297c89..108b65232a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectAutoImageRefresh(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py index d7267d253a..8b84e69309 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py @@ -7,7 +7,7 @@ Provides: """ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py index af74c76a15..1bf7c1a600 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py @@ -1,7 +1,7 @@ import os import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py index e8f7c7e3df..52df60dd8a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py @@ -4,8 +4,8 @@ import re import pyblish.api from ayon_core.lib import prepare_template_data, is_in_tests -from ayon_core.hosts.photoshop import api as photoshop from ayon_core.settings import get_project_settings +from ayon_photoshop import api as photoshop class CollectColorCodedInstances(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py index 74353d452f..02f2217f75 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py @@ -2,7 +2,7 @@ import os import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectCurrentFile(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py index 2d24a8de15..90415e9245 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py @@ -2,7 +2,7 @@ import os import re import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectExtensionVersion(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py index bfd73bfc5f..ed6af6f7d3 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api +from ayon_photoshop import api class CollectImage(pyblish.api.InstancePlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py index 7290a1437e..0d8824af2d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractImage(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py index 3497e7ad75..11bb47a886 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py @@ -7,7 +7,7 @@ from ayon_core.lib import ( get_ffmpeg_tool_args, ) from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractReview(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py index 962c0722db..22ebbb739d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractSaveScene(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py index 9b25a35ef5..b10645813a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.pipeline.publish import get_errored_plugins_from_context from ayon_core.lib import version_up -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class IncrementWorkfile(pyblish.api.InstancePlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py index c3a6822f32..36ba621dc2 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( PublishXmlValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ValidateInstanceFolderRepair(pyblish.api.Action): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py index 13c6a54fd2..2b5492d878 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py @@ -2,7 +2,7 @@ import re import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS from ayon_core.pipeline.publish import ( ValidateContentsOrder, From f744f915aea2f23b53805dc812574707682e1a7d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:22:43 +0200 Subject: [PATCH 406/469] updated package.py --- server_addon/photoshop/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/photoshop/package.py b/server_addon/photoshop/package.py index 22043f951c..3c57a9c79e 100644 --- a/server_addon/photoshop/package.py +++ b/server_addon/photoshop/package.py @@ -1,3 +1,10 @@ name = "photoshop" title = "Photoshop" -version = "0.1.3" +version = "0.2.0" + +client_dir = "ayon_photoshop" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 2683ed9670713d11d7be3117fcca2c9ab9443e82 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:22:53 +0200 Subject: [PATCH 407/469] added version.py to client --- server_addon/photoshop/client/ayon_photoshop/__init__.py | 3 +++ server_addon/photoshop/client/ayon_photoshop/addon.py | 4 +++- server_addon/photoshop/client/ayon_photoshop/version.py | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 server_addon/photoshop/client/ayon_photoshop/version.py diff --git a/server_addon/photoshop/client/ayon_photoshop/__init__.py b/server_addon/photoshop/client/ayon_photoshop/__init__.py index cf21b7df75..e72c79c812 100644 --- a/server_addon/photoshop/client/ayon_photoshop/__init__.py +++ b/server_addon/photoshop/client/ayon_photoshop/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( PHOTOSHOP_ADDON_ROOT, PhotoshopAddon, @@ -6,6 +7,8 @@ from .addon import ( __all__ = ( + "__version__", + "PHOTOSHOP_ADDON_ROOT", "PhotoshopAddon", "get_launch_script_path", diff --git a/server_addon/photoshop/client/ayon_photoshop/addon.py b/server_addon/photoshop/client/ayon_photoshop/addon.py index 65fe6a7cd1..d0fe638f15 100644 --- a/server_addon/photoshop/client/ayon_photoshop/addon.py +++ b/server_addon/photoshop/client/ayon_photoshop/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + PHOTOSHOP_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class PhotoshopAddon(AYONAddon, IHostAddon): name = "photoshop" + version = __version__ host_name = "photoshop" def add_implementation_envs(self, env, _app): @@ -33,4 +36,3 @@ def get_launch_script_path(): return os.path.join( PHOTOSHOP_ADDON_ROOT, "api", "launch_script.py" ) - diff --git a/server_addon/photoshop/client/ayon_photoshop/version.py b/server_addon/photoshop/client/ayon_photoshop/version.py new file mode 100644 index 0000000000..f04558d6c6 --- /dev/null +++ b/server_addon/photoshop/client/ayon_photoshop/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'photoshop' version.""" +__version__ = "0.2.0" From 6fb0b911161540aed4ca7f0b6acaabebd4311b60 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:23:45 +0200 Subject: [PATCH 408/469] added photoshop milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index fcd41c5f7d..18b2a5b0db 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -55,6 +55,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), "max": VersionInfo(0, 2, 0), + "photoshop": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "maya": VersionInfo(0, 2, 0), From 11788c62c39d5525315c7882f683ea242e8d7ce6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:28:49 +0200 Subject: [PATCH 409/469] moved webserver for communication to photoshop addon --- .../client/ayon_photoshop/api/launch_logic.py | 2 +- .../client/ayon_photoshop/api/webserver.py | 241 ++++++++++++++++++ .../client/ayon_photoshop/api/ws_stub.py | 2 +- server_addon/photoshop/client/pyproject.toml | 6 + 4 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 server_addon/photoshop/client/ayon_photoshop/api/webserver.py create mode 100644 server_addon/photoshop/client/pyproject.toml diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py index c388f93044..04401a0972 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py @@ -22,9 +22,9 @@ from ayon_core.pipeline.workfile import ( ) from ayon_core.pipeline.template_data import get_template_data_with_names from ayon_core.tools.utils import host_tools -from ayon_core.tools.adobe_webserver.app import WebServerTool from ayon_core.pipeline.context_tools import change_current_context +from .webserver import WebServerTool from .ws_stub import PhotoshopServerStub log = Logger.get_logger(__name__) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/webserver.py b/server_addon/photoshop/client/ayon_photoshop/api/webserver.py new file mode 100644 index 0000000000..cd229c65ad --- /dev/null +++ b/server_addon/photoshop/client/ayon_photoshop/api/webserver.py @@ -0,0 +1,241 @@ +"""Webserver for communication with photoshop. + +Aiohttp (Asyncio) based websocket server used for communication with host +application. + +This webserver is started in spawned Python process that opens DCC during +its launch, waits for connection from DCC and handles communication going +forward. Server is closed before Python process is killed. +""" +import os +import logging +import urllib +import threading +import asyncio +import socket + +from aiohttp import web + +from wsrpc_aiohttp import WSRPCClient + +from ayon_core.pipeline import get_global_context + +log = logging.getLogger(__name__) + + +class WebServerTool: + """ + Basic POC implementation of asychronic websocket RPC server. + Uses class in external_app_1.py to mimic implementation for single + external application. + 'test_client' folder contains two test implementations of client + """ + _instance = None + + def __init__(self): + WebServerTool._instance = self + + self.client = None + self.handlers = {} + self.on_stop_callbacks = [] + + port = None + host_name = "localhost" + websocket_url = os.getenv("WEBSOCKET_URL") + if websocket_url: + parsed = urllib.parse.urlparse(websocket_url) + port = parsed.port + host_name = parsed.netloc.split(":")[0] + if not port: + port = 8098 # fallback + + self.port = port + self.host_name = host_name + + self.app = web.Application() + + # add route with multiple methods for single "external app" + self.webserver_thread = WebServerThread(self, self.port) + + def add_route(self, *args, **kwargs): + self.app.router.add_route(*args, **kwargs) + + def add_static(self, *args, **kwargs): + self.app.router.add_static(*args, **kwargs) + + def start_server(self): + if self.webserver_thread and not self.webserver_thread.is_alive(): + self.webserver_thread.start() + + def stop_server(self): + self.stop() + + async def send_context_change(self, host): + """ + Calls running webserver to inform about context change + + Used when new PS/AE should be triggered, + but one already running, without + this publish would point to old context. + """ + client = WSRPCClient(os.getenv("WEBSOCKET_URL"), + loop=asyncio.get_event_loop()) + await client.connect() + + context = get_global_context() + project_name = context["project_name"] + folder_path = context["folder_path"] + task_name = context["task_name"] + log.info("Sending context change to {}{}/{}".format( + project_name, folder_path, task_name + )) + + await client.call( + '{}.set_context'.format(host), + project=project_name, + folder=folder_path, + task=task_name + ) + await client.close() + + def port_occupied(self, host_name, port): + """ + Check if 'url' is already occupied. + + This could mean, that app is already running and we are trying open it + again. In that case, use existing running webserver. + Check here is easier than capturing exception from thread. + """ + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as con: + result = con.connect_ex((host_name, port)) == 0 + + if result: + print(f"Port {port} is already in use") + return result + + def call(self, func): + log.debug("websocket.call {}".format(func)) + future = asyncio.run_coroutine_threadsafe( + func, + self.webserver_thread.loop + ) + result = future.result() + return result + + @staticmethod + def get_instance(): + if WebServerTool._instance is None: + WebServerTool() + return WebServerTool._instance + + @property + def is_running(self): + if not self.webserver_thread: + return False + return self.webserver_thread.is_running + + def stop(self): + if not self.is_running: + return + try: + log.debug("Stopping websocket server") + self.webserver_thread.is_running = False + self.webserver_thread.stop() + except Exception: + log.warning( + "Error has happened during Killing websocket server", + exc_info=True + ) + + def thread_stopped(self): + for callback in self.on_stop_callbacks: + callback() + + +class WebServerThread(threading.Thread): + """ Listener for websocket rpc requests. + + It would be probably better to "attach" this to main thread (as for + example Harmony needs to run something on main thread), but currently + it creates separate thread and separate asyncio event loop + """ + def __init__(self, module, port): + super(WebServerThread, self).__init__() + + self.is_running = False + self.port = port + self.module = module + self.loop = None + self.runner = None + self.site = None + self.tasks = [] + + def run(self): + self.is_running = True + + try: + log.info("Starting web server") + self.loop = asyncio.new_event_loop() # create new loop for thread + asyncio.set_event_loop(self.loop) + + self.loop.run_until_complete(self.start_server()) + + websocket_url = "ws://localhost:{}/ws".format(self.port) + + log.debug( + "Running Websocket server on URL: \"{}\"".format(websocket_url) + ) + + asyncio.ensure_future(self.check_shutdown(), loop=self.loop) + self.loop.run_forever() + except Exception: + self.is_running = False + log.warning( + "Websocket Server service has failed", exc_info=True + ) + raise + finally: + self.loop.close() # optional + + self.is_running = False + self.module.thread_stopped() + log.info("Websocket server stopped") + + async def start_server(self): + """ Starts runner and TCPsite """ + self.runner = web.AppRunner(self.module.app) + await self.runner.setup() + self.site = web.TCPSite(self.runner, 'localhost', self.port) + await self.site.start() + + def stop(self): + """Sets is_running flag to false, 'check_shutdown' shuts server down""" + self.is_running = False + + async def check_shutdown(self): + """ Future that is running and checks if server should be running + periodically. + """ + while self.is_running: + while self.tasks: + task = self.tasks.pop(0) + log.debug("waiting for task {}".format(task)) + await task + log.debug("returned value {}".format(task.result)) + + await asyncio.sleep(0.5) + + log.debug("Starting shutdown") + await self.site.stop() + log.debug("Site stopped") + await self.runner.cleanup() + log.debug("Runner stopped") + tasks = [task for task in asyncio.all_tasks() if + task is not asyncio.current_task()] + list(map(lambda task: task.cancel(), tasks)) # cancel all the tasks + results = await asyncio.gather(*tasks, return_exceptions=True) + log.debug(f'Finished awaiting cancelled tasks, results: {results}...') + await self.loop.shutdown_asyncgens() + # to really make sure everything else has time to stop + await asyncio.sleep(0.07) + self.loop.stop() diff --git a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py index 36fe0af2f8..3619fa4b7a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py @@ -6,7 +6,7 @@ import json import attr from wsrpc_aiohttp import WebSocketAsync -from ayon_core.tools.adobe_webserver.app import WebServerTool +from .webserver import WebServerTool @attr.s diff --git a/server_addon/photoshop/client/pyproject.toml b/server_addon/photoshop/client/pyproject.toml new file mode 100644 index 0000000000..3beb76ba74 --- /dev/null +++ b/server_addon/photoshop/client/pyproject.toml @@ -0,0 +1,6 @@ +[project] +name="photoshop" +description="AYON Phostoshop addon." + +[ayon.runtimeDependencies] +wsrpc_aiohttp = "^3.1.1" # websocket server From 438f1301b6b9218751b5e1d049c251eb9309f9f9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 11:12:03 +0200 Subject: [PATCH 410/469] move fusion next to server codebase --- .../fusion => server_addon/fusion/client/ayon_fusion}/__init__.py | 0 .../fusion => server_addon/fusion/client/ayon_fusion}/addon.py | 0 .../fusion/client/ayon_fusion}/api/__init__.py | 0 .../fusion/client/ayon_fusion}/api/action.py | 0 .../fusion => server_addon/fusion/client/ayon_fusion}/api/lib.py | 0 .../fusion => server_addon/fusion/client/ayon_fusion}/api/menu.py | 0 .../fusion/client/ayon_fusion}/api/pipeline.py | 0 .../fusion/client/ayon_fusion}/api/plugin.py | 0 .../fusion/client/ayon_fusion}/api/pulse.py | 0 .../fusion/client/ayon_fusion}/deploy/MenuScripts/README.md | 0 .../client/ayon_fusion}/deploy/MenuScripts/install_pyside2.py | 0 .../fusion/client/ayon_fusion}/deploy/MenuScripts/launch_menu.py | 0 .../fusion/client/ayon_fusion}/deploy/ayon/Config/menu.fu | 0 .../fusion/client/ayon_fusion}/deploy/ayon/fusion_shared.prefs | 0 .../client/ayon_fusion}/hooks/pre_fusion_launch_menu_hook.py | 0 .../fusion/client/ayon_fusion}/hooks/pre_fusion_profile_hook.py | 0 .../fusion/client/ayon_fusion}/hooks/pre_fusion_setup.py | 0 .../fusion/client/ayon_fusion}/hooks/pre_pyside_install.py | 0 .../client/ayon_fusion}/plugins/create/create_image_saver.py | 0 .../fusion/client/ayon_fusion}/plugins/create/create_saver.py | 0 .../fusion/client/ayon_fusion}/plugins/create/create_workfile.py | 0 .../client/ayon_fusion}/plugins/inventory/select_containers.py | 0 .../client/ayon_fusion}/plugins/inventory/set_tool_color.py | 0 .../fusion/client/ayon_fusion}/plugins/load/actions.py | 0 .../fusion/client/ayon_fusion}/plugins/load/load_alembic.py | 0 .../fusion/client/ayon_fusion}/plugins/load/load_fbx.py | 0 .../fusion/client/ayon_fusion}/plugins/load/load_sequence.py | 0 .../fusion/client/ayon_fusion}/plugins/load/load_usd.py | 0 .../fusion/client/ayon_fusion}/plugins/load/load_workfile.py | 0 .../fusion/client/ayon_fusion}/plugins/publish/collect_comp.py | 0 .../ayon_fusion}/plugins/publish/collect_comp_frame_range.py | 0 .../fusion/client/ayon_fusion}/plugins/publish/collect_inputs.py | 0 .../client/ayon_fusion}/plugins/publish/collect_instances.py | 0 .../fusion/client/ayon_fusion}/plugins/publish/collect_render.py | 0 .../client/ayon_fusion}/plugins/publish/collect_workfile.py | 0 .../client/ayon_fusion}/plugins/publish/extract_render_local.py | 0 .../client/ayon_fusion}/plugins/publish/increment_current_file.py | 0 .../fusion/client/ayon_fusion}/plugins/publish/save_scene.py | 0 .../ayon_fusion}/plugins/publish/validate_background_depth.py | 0 .../client/ayon_fusion}/plugins/publish/validate_comp_saved.py | 0 .../plugins/publish/validate_create_folder_checked.py | 0 .../plugins/publish/validate_expected_frames_existence.py | 0 .../plugins/publish/validate_filename_has_extension.py | 0 .../client/ayon_fusion}/plugins/publish/validate_image_frame.py | 0 .../ayon_fusion}/plugins/publish/validate_instance_frame_range.py | 0 .../ayon_fusion}/plugins/publish/validate_instance_in_context.py | 0 .../ayon_fusion}/plugins/publish/validate_saver_has_input.py | 0 .../ayon_fusion}/plugins/publish/validate_saver_passthrough.py | 0 .../ayon_fusion}/plugins/publish/validate_saver_resolution.py | 0 .../ayon_fusion}/plugins/publish/validate_unique_subsets.py | 0 .../fusion/client/ayon_fusion}/scripts/__init__.py | 0 .../fusion/client/ayon_fusion}/scripts/duplicate_with_inputs.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/__init__.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/__init__.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/_cmp.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_cmp.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/_compat.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_config.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_funcs.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_make.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_next_gen.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_version_info.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/_version_info.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/converters.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/converters.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/exceptions.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/exceptions.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/filters.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/filters.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/py.typed | 0 .../fusion/client/ayon_fusion}/vendor/attr/setters.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/setters.pyi | 0 .../fusion/client/ayon_fusion}/vendor/attr/validators.py | 0 .../fusion/client/ayon_fusion}/vendor/attr/validators.pyi | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/__init__.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/_collections.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/_version.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/connection.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/connectionpool.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/contrib/__init__.py | 0 .../ayon_fusion}/vendor/urllib3/contrib/_appengine_environ.py | 0 .../vendor/urllib3/contrib/_securetransport/__init__.py | 0 .../vendor/urllib3/contrib/_securetransport/bindings.py | 0 .../vendor/urllib3/contrib/_securetransport/low_level.py | 0 .../client/ayon_fusion}/vendor/urllib3/contrib/appengine.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/contrib/ntlmpool.py | 0 .../client/ayon_fusion}/vendor/urllib3/contrib/pyopenssl.py | 0 .../client/ayon_fusion}/vendor/urllib3/contrib/securetransport.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/contrib/socks.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/exceptions.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/fields.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/filepost.py | 0 .../client/ayon_fusion}/vendor/urllib3/packages/__init__.py | 0 .../ayon_fusion}/vendor/urllib3/packages/backports/__init__.py | 0 .../ayon_fusion}/vendor/urllib3/packages/backports/makefile.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/packages/six.py | 0 .../vendor/urllib3/packages/ssl_match_hostname/__init__.py | 0 .../vendor/urllib3/packages/ssl_match_hostname/_implementation.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/poolmanager.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/request.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/response.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/__init__.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/connection.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/proxy.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/queue.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/request.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/response.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/retry.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/ssl_.py | 0 .../client/ayon_fusion}/vendor/urllib3/util/ssltransport.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/timeout.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/url.py | 0 .../fusion/client/ayon_fusion}/vendor/urllib3/util/wait.py | 0 113 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/addon.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/action.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/lib.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/menu.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/pipeline.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/plugin.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/api/pulse.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/deploy/MenuScripts/README.md (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/deploy/MenuScripts/install_pyside2.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/deploy/MenuScripts/launch_menu.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/deploy/ayon/Config/menu.fu (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/deploy/ayon/fusion_shared.prefs (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/hooks/pre_fusion_launch_menu_hook.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/hooks/pre_fusion_profile_hook.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/hooks/pre_fusion_setup.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/hooks/pre_pyside_install.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/create/create_image_saver.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/create/create_saver.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/inventory/select_containers.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/inventory/set_tool_color.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/actions.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/load_alembic.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/load_fbx.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/load_sequence.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/load_usd.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/load/load_workfile.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_comp.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_comp_frame_range.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_inputs.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_instances.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_render.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/extract_render_local.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/increment_current_file.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/save_scene.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_background_depth.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_comp_saved.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_create_folder_checked.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_expected_frames_existence.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_filename_has_extension.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_image_frame.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_instance_frame_range.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_instance_in_context.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_saver_has_input.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_saver_passthrough.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_saver_resolution.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/plugins/publish/validate_unique_subsets.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/scripts/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/scripts/duplicate_with_inputs.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/__init__.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_cmp.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_cmp.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_compat.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_config.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_funcs.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_make.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_next_gen.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_version_info.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/_version_info.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/converters.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/converters.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/exceptions.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/exceptions.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/filters.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/filters.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/py.typed (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/setters.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/setters.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/validators.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/attr/validators.pyi (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/_collections.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/_version.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/connection.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/connectionpool.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/_appengine_environ.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/_securetransport/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/_securetransport/bindings.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/_securetransport/low_level.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/appengine.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/ntlmpool.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/pyopenssl.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/securetransport.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/contrib/socks.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/exceptions.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/fields.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/filepost.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/backports/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/backports/makefile.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/six.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/ssl_match_hostname/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/packages/ssl_match_hostname/_implementation.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/poolmanager.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/request.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/response.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/__init__.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/connection.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/proxy.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/queue.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/request.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/response.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/retry.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/ssl_.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/ssltransport.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/timeout.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/url.py (100%) rename {client/ayon_core/hosts/fusion => server_addon/fusion/client/ayon_fusion}/vendor/urllib3/util/wait.py (100%) diff --git a/client/ayon_core/hosts/fusion/__init__.py b/server_addon/fusion/client/ayon_fusion/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/__init__.py rename to server_addon/fusion/client/ayon_fusion/__init__.py diff --git a/client/ayon_core/hosts/fusion/addon.py b/server_addon/fusion/client/ayon_fusion/addon.py similarity index 100% rename from client/ayon_core/hosts/fusion/addon.py rename to server_addon/fusion/client/ayon_fusion/addon.py diff --git a/client/ayon_core/hosts/fusion/api/__init__.py b/server_addon/fusion/client/ayon_fusion/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/__init__.py rename to server_addon/fusion/client/ayon_fusion/api/__init__.py diff --git a/client/ayon_core/hosts/fusion/api/action.py b/server_addon/fusion/client/ayon_fusion/api/action.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/action.py rename to server_addon/fusion/client/ayon_fusion/api/action.py diff --git a/client/ayon_core/hosts/fusion/api/lib.py b/server_addon/fusion/client/ayon_fusion/api/lib.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/lib.py rename to server_addon/fusion/client/ayon_fusion/api/lib.py diff --git a/client/ayon_core/hosts/fusion/api/menu.py b/server_addon/fusion/client/ayon_fusion/api/menu.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/menu.py rename to server_addon/fusion/client/ayon_fusion/api/menu.py diff --git a/client/ayon_core/hosts/fusion/api/pipeline.py b/server_addon/fusion/client/ayon_fusion/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/pipeline.py rename to server_addon/fusion/client/ayon_fusion/api/pipeline.py diff --git a/client/ayon_core/hosts/fusion/api/plugin.py b/server_addon/fusion/client/ayon_fusion/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/plugin.py rename to server_addon/fusion/client/ayon_fusion/api/plugin.py diff --git a/client/ayon_core/hosts/fusion/api/pulse.py b/server_addon/fusion/client/ayon_fusion/api/pulse.py similarity index 100% rename from client/ayon_core/hosts/fusion/api/pulse.py rename to server_addon/fusion/client/ayon_fusion/api/pulse.py diff --git a/client/ayon_core/hosts/fusion/deploy/MenuScripts/README.md b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/README.md similarity index 100% rename from client/ayon_core/hosts/fusion/deploy/MenuScripts/README.md rename to server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/README.md diff --git a/client/ayon_core/hosts/fusion/deploy/MenuScripts/install_pyside2.py b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/install_pyside2.py similarity index 100% rename from client/ayon_core/hosts/fusion/deploy/MenuScripts/install_pyside2.py rename to server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/install_pyside2.py diff --git a/client/ayon_core/hosts/fusion/deploy/MenuScripts/launch_menu.py b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py similarity index 100% rename from client/ayon_core/hosts/fusion/deploy/MenuScripts/launch_menu.py rename to server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py diff --git a/client/ayon_core/hosts/fusion/deploy/ayon/Config/menu.fu b/server_addon/fusion/client/ayon_fusion/deploy/ayon/Config/menu.fu similarity index 100% rename from client/ayon_core/hosts/fusion/deploy/ayon/Config/menu.fu rename to server_addon/fusion/client/ayon_fusion/deploy/ayon/Config/menu.fu diff --git a/client/ayon_core/hosts/fusion/deploy/ayon/fusion_shared.prefs b/server_addon/fusion/client/ayon_fusion/deploy/ayon/fusion_shared.prefs similarity index 100% rename from client/ayon_core/hosts/fusion/deploy/ayon/fusion_shared.prefs rename to server_addon/fusion/client/ayon_fusion/deploy/ayon/fusion_shared.prefs diff --git a/client/ayon_core/hosts/fusion/hooks/pre_fusion_launch_menu_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py similarity index 100% rename from client/ayon_core/hosts/fusion/hooks/pre_fusion_launch_menu_hook.py rename to server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py diff --git a/client/ayon_core/hosts/fusion/hooks/pre_fusion_profile_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py similarity index 100% rename from client/ayon_core/hosts/fusion/hooks/pre_fusion_profile_hook.py rename to server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py diff --git a/client/ayon_core/hosts/fusion/hooks/pre_fusion_setup.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py similarity index 100% rename from client/ayon_core/hosts/fusion/hooks/pre_fusion_setup.py rename to server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py diff --git a/client/ayon_core/hosts/fusion/hooks/pre_pyside_install.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_pyside_install.py similarity index 100% rename from client/ayon_core/hosts/fusion/hooks/pre_pyside_install.py rename to server_addon/fusion/client/ayon_fusion/hooks/pre_pyside_install.py diff --git a/client/ayon_core/hosts/fusion/plugins/create/create_image_saver.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/create/create_image_saver.py rename to server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py diff --git a/client/ayon_core/hosts/fusion/plugins/create/create_saver.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/create/create_saver.py rename to server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py diff --git a/client/ayon_core/hosts/fusion/plugins/create/create_workfile.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/create/create_workfile.py rename to server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/fusion/plugins/inventory/select_containers.py b/server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/inventory/select_containers.py rename to server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py diff --git a/client/ayon_core/hosts/fusion/plugins/inventory/set_tool_color.py b/server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/inventory/set_tool_color.py rename to server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/actions.py b/server_addon/fusion/client/ayon_fusion/plugins/load/actions.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/actions.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/actions.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/load_alembic.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/load_alembic.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/load_fbx.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/load_fbx.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/load_sequence.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/load_sequence.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/load_usd.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/load_usd.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py diff --git a/client/ayon_core/hosts/fusion/plugins/load/load_workfile.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/load/load_workfile.py rename to server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_comp.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_comp.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_comp_frame_range.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp_frame_range.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_comp_frame_range.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp_frame_range.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_inputs.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_inputs.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_inputs.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_inputs.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_instances.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_instances.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_instances.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_instances.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_render.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_render.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/collect_workfile.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/collect_workfile.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/extract_render_local.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/extract_render_local.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/increment_current_file.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/increment_current_file.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/increment_current_file.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/increment_current_file.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/save_scene.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/save_scene.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/save_scene.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/save_scene.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_background_depth.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_background_depth.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_comp_saved.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_comp_saved.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_comp_saved.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_comp_saved.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_create_folder_checked.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_create_folder_checked.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_expected_frames_existence.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_expected_frames_existence.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_filename_has_extension.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_filename_has_extension.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_image_frame.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_image_frame.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_image_frame.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_image_frame.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_instance_frame_range.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_frame_range.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_instance_frame_range.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_frame_range.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_instance_in_context.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_saver_has_input.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_saver_has_input.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_saver_passthrough.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_saver_passthrough.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_saver_resolution.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_saver_resolution.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py diff --git a/client/ayon_core/hosts/fusion/plugins/publish/validate_unique_subsets.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py similarity index 100% rename from client/ayon_core/hosts/fusion/plugins/publish/validate_unique_subsets.py rename to server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py diff --git a/client/ayon_core/hosts/fusion/scripts/__init__.py b/server_addon/fusion/client/ayon_fusion/scripts/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/scripts/__init__.py rename to server_addon/fusion/client/ayon_fusion/scripts/__init__.py diff --git a/client/ayon_core/hosts/fusion/scripts/duplicate_with_inputs.py b/server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py similarity index 100% rename from client/ayon_core/hosts/fusion/scripts/duplicate_with_inputs.py rename to server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/__init__.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/__init__.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/__init__.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/__init__.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_cmp.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_cmp.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_cmp.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_cmp.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_cmp.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/_cmp.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_cmp.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_cmp.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_compat.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_compat.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_compat.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_compat.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_config.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_config.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_config.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_config.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_funcs.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_funcs.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_funcs.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_funcs.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_make.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_make.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_make.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_make.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_next_gen.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_next_gen.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_next_gen.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_next_gen.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_version_info.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/_version_info.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_version_info.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_version_info.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/_version_info.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/_version_info.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/_version_info.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/_version_info.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/converters.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/converters.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/converters.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/converters.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/converters.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/converters.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/converters.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/converters.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/exceptions.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/exceptions.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/exceptions.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/exceptions.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/exceptions.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/exceptions.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/exceptions.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/exceptions.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/filters.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/filters.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/filters.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/filters.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/filters.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/filters.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/filters.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/filters.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/py.typed b/server_addon/fusion/client/ayon_fusion/vendor/attr/py.typed similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/py.typed rename to server_addon/fusion/client/ayon_fusion/vendor/attr/py.typed diff --git a/client/ayon_core/hosts/fusion/vendor/attr/setters.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/setters.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/setters.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/setters.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/setters.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/setters.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/setters.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/setters.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/attr/validators.py b/server_addon/fusion/client/ayon_fusion/vendor/attr/validators.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/validators.py rename to server_addon/fusion/client/ayon_fusion/vendor/attr/validators.py diff --git a/client/ayon_core/hosts/fusion/vendor/attr/validators.pyi b/server_addon/fusion/client/ayon_fusion/vendor/attr/validators.pyi similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/attr/validators.pyi rename to server_addon/fusion/client/ayon_fusion/vendor/attr/validators.pyi diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/_collections.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/_collections.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/_collections.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/_collections.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/_version.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/_version.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/_version.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/_version.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/connection.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/connection.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/connection.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/connection.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/connectionpool.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/connectionpool.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/connectionpool.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/connectionpool.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_appengine_environ.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_appengine_environ.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_appengine_environ.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_appengine_environ.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/bindings.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/bindings.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/bindings.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/bindings.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/low_level.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/low_level.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/_securetransport/low_level.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/_securetransport/low_level.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/appengine.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/appengine.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/appengine.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/appengine.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/ntlmpool.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/ntlmpool.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/ntlmpool.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/ntlmpool.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/pyopenssl.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/pyopenssl.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/pyopenssl.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/pyopenssl.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/securetransport.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/securetransport.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/securetransport.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/securetransport.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/contrib/socks.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/socks.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/contrib/socks.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/contrib/socks.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/exceptions.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/exceptions.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/exceptions.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/exceptions.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/fields.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/fields.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/fields.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/fields.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/filepost.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/filepost.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/filepost.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/filepost.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/backports/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/backports/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/backports/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/backports/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/backports/makefile.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/backports/makefile.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/backports/makefile.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/backports/makefile.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/six.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/six.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/six.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/six.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/ssl_match_hostname/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/ssl_match_hostname/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/ssl_match_hostname/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/ssl_match_hostname/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/ssl_match_hostname/_implementation.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/packages/ssl_match_hostname/_implementation.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/packages/ssl_match_hostname/_implementation.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/poolmanager.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/poolmanager.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/poolmanager.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/poolmanager.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/request.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/request.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/request.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/request.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/response.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/response.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/response.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/response.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/__init__.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/__init__.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/__init__.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/__init__.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/connection.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/connection.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/connection.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/connection.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/proxy.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/proxy.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/proxy.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/proxy.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/queue.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/queue.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/queue.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/queue.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/request.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/request.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/request.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/request.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/response.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/response.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/response.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/response.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/retry.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/retry.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/retry.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/retry.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/ssl_.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/ssl_.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/ssl_.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/ssl_.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/ssltransport.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/ssltransport.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/ssltransport.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/ssltransport.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/timeout.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/timeout.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/timeout.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/timeout.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/url.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/url.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/url.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/url.py diff --git a/client/ayon_core/hosts/fusion/vendor/urllib3/util/wait.py b/server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/wait.py similarity index 100% rename from client/ayon_core/hosts/fusion/vendor/urllib3/util/wait.py rename to server_addon/fusion/client/ayon_fusion/vendor/urllib3/util/wait.py From 095cf69a97a525a1add462b6a53bd889d248c3f2 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 11:13:09 +0200 Subject: [PATCH 411/469] added more information to package.py --- server_addon/fusion/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/fusion/package.py b/server_addon/fusion/package.py index 9e7a46df2c..e82e9bf0f6 100644 --- a/server_addon/fusion/package.py +++ b/server_addon/fusion/package.py @@ -1,3 +1,10 @@ name = "fusion" title = "Fusion" -version = "0.1.5" +version = "0.2.0" + +client_dir = "ayon_fusion" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 599f6202478e09aaac2b498a3c803b232ab35704 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 11:13:46 +0200 Subject: [PATCH 412/469] fix invalid imports --- server_addon/photoshop/client/ayon_photoshop/api/README.md | 2 +- .../photoshop/client/ayon_photoshop/hooks/pre_launch_args.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md index 41a26de70a..ef458dea16 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/README.md +++ b/server_addon/photoshop/client/ayon_photoshop/api/README.md @@ -17,7 +17,7 @@ ExManCmd /install {path to addon}/api/extension.zxp The easiest way to get the server and Photoshop launch is with: ``` -python -c ^"import ayon_core.hosts.photoshop;ayon_core.hosts.photoshop.launch(""C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"")^" +python -c ^"import ayon_photoshop;ayon_photoshop.launch(""C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"")^" ``` `avalon.photoshop.launch` launches the application and server, and also closes the server when Photoshop exists. diff --git a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py index 70f8fc730f..ff60c2f40d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py +++ b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py @@ -7,7 +7,7 @@ from ayon_core.lib import ( is_using_ayon_console, ) from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.photoshop import get_launch_script_path +from ayon_photoshop import get_launch_script_path def get_launch_kwargs(kwargs): From 975a1b01422b56fe80f7b360a3d2aa61cace48f9 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 May 2024 11:45:51 +0200 Subject: [PATCH 413/469] Fix import --- client/ayon_core/plugins/publish/validate_version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index c2f7d5bf44..f47b5e4d6f 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -3,9 +3,9 @@ import pyblish.api from ayon_core.lib import filter_profiles from ayon_core.pipeline.publish import ( PublishValidationError, - OptionalPyblishPluginMixin, - get_current_host_name, + OptionalPyblishPluginMixin ) +from ayon_core.pipeline.context_tools import get_current_host_name class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): From a83a4d1e29153a853748388947708ee39731c48c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 May 2024 11:56:48 +0200 Subject: [PATCH 414/469] Update client/ayon_core/plugins/publish/validate_version.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/publish/validate_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index f47b5e4d6f..0359f8fb53 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.pipeline.context_tools import get_current_host_name +from ayon_core.pipeline import get_current_host_name class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): From 639d3d418e7e336b33c6795d1b40d3673def259c Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 31 May 2024 17:12:04 +0300 Subject: [PATCH 415/469] update docstring and add hosts attibute in Houdini plugins base classes --- server_addon/houdini/client/ayon_houdini/api/plugin.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index 05a948984b..22a2b40dd4 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -358,18 +358,21 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase): class HoudiniLoader(load.LoaderPlugin): - """Base class for most of the Houdini load plugins.""" + """Base class for Houdini load plugins.""" + hosts = ["houdini"] settings_category = SETTINGS_CATEGORY class HoudiniInstancePlugin(pyblish.api.InstancePlugin): - """Base class for most of the Houdini instance publish plugins.""" + """Base class for Houdini instance publish plugins.""" + hosts = ["houdini"] settings_category = SETTINGS_CATEGORY class HoudiniContextPlugin(pyblish.api.ContextPlugin): - """Base class for most of the Houdini context publish plugins.""" + """Base class for Houdini context publish plugins.""" + hosts = ["houdini"] settings_category = SETTINGS_CATEGORY From 8b5b88de900f4460bfe758bf67c7ef6fa519d7b9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 16:26:25 +0200 Subject: [PATCH 416/469] fix imports --- server_addon/fusion/client/ayon_fusion/api/action.py | 2 +- server_addon/fusion/client/ayon_fusion/api/menu.py | 4 ++-- server_addon/fusion/client/ayon_fusion/api/pipeline.py | 6 +++--- server_addon/fusion/client/ayon_fusion/api/plugin.py | 2 +- .../client/ayon_fusion/deploy/MenuScripts/launch_menu.py | 4 ++-- .../client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py | 2 +- .../client/ayon_fusion/hooks/pre_fusion_profile_hook.py | 2 +- .../fusion/client/ayon_fusion/hooks/pre_fusion_setup.py | 2 +- .../client/ayon_fusion/plugins/create/create_image_saver.py | 2 +- .../client/ayon_fusion/plugins/create/create_saver.py | 4 ++-- .../client/ayon_fusion/plugins/create/create_workfile.py | 2 +- .../ayon_fusion/plugins/inventory/select_containers.py | 2 +- .../client/ayon_fusion/plugins/inventory/set_tool_color.py | 2 +- .../fusion/client/ayon_fusion/plugins/load/actions.py | 4 ++-- .../fusion/client/ayon_fusion/plugins/load/load_alembic.py | 2 +- .../fusion/client/ayon_fusion/plugins/load/load_fbx.py | 2 +- .../fusion/client/ayon_fusion/plugins/load/load_sequence.py | 2 +- .../fusion/client/ayon_fusion/plugins/load/load_usd.py | 4 ++-- .../fusion/client/ayon_fusion/plugins/load/load_workfile.py | 2 +- .../client/ayon_fusion/plugins/publish/collect_comp.py | 2 +- .../client/ayon_fusion/plugins/publish/collect_render.py | 2 +- .../ayon_fusion/plugins/publish/extract_render_local.py | 4 ++-- .../plugins/publish/validate_background_depth.py | 2 +- .../plugins/publish/validate_create_folder_checked.py | 2 +- .../plugins/publish/validate_expected_frames_existence.py | 2 +- .../plugins/publish/validate_filename_has_extension.py | 2 +- .../plugins/publish/validate_instance_in_context.py | 2 +- .../ayon_fusion/plugins/publish/validate_saver_has_input.py | 2 +- .../plugins/publish/validate_saver_passthrough.py | 2 +- .../plugins/publish/validate_saver_resolution.py | 4 ++-- .../ayon_fusion/plugins/publish/validate_unique_subsets.py | 2 +- .../client/ayon_fusion/scripts/duplicate_with_inputs.py | 2 +- 32 files changed, 41 insertions(+), 41 deletions(-) diff --git a/server_addon/fusion/client/ayon_fusion/api/action.py b/server_addon/fusion/client/ayon_fusion/api/action.py index a0c6aafcb5..02cd96f56c 100644 --- a/server_addon/fusion/client/ayon_fusion/api/action.py +++ b/server_addon/fusion/client/ayon_fusion/api/action.py @@ -1,7 +1,7 @@ import pyblish.api -from ayon_core.hosts.fusion.api.lib import get_current_comp +from ayon_fusion.api.lib import get_current_comp from ayon_core.pipeline.publish import get_errored_instances_from_context diff --git a/server_addon/fusion/client/ayon_fusion/api/menu.py b/server_addon/fusion/client/ayon_fusion/api/menu.py index 6a64ad2120..38d8c36bb1 100644 --- a/server_addon/fusion/client/ayon_fusion/api/menu.py +++ b/server_addon/fusion/client/ayon_fusion/api/menu.py @@ -6,10 +6,10 @@ from qtpy import QtWidgets, QtCore, QtGui from ayon_core.tools.utils import host_tools from ayon_core.style import load_stylesheet from ayon_core.lib import register_event_callback -from ayon_core.hosts.fusion.scripts import ( +from ayon_fusion.scripts import ( duplicate_with_inputs, ) -from ayon_core.hosts.fusion.api.lib import ( +from ayon_fusion.api.lib import ( set_current_context_framerange, set_current_context_resolution, ) diff --git a/server_addon/fusion/client/ayon_fusion/api/pipeline.py b/server_addon/fusion/client/ayon_fusion/api/pipeline.py index 2d1073ec7d..071b4b8fb5 100644 --- a/server_addon/fusion/client/ayon_fusion/api/pipeline.py +++ b/server_addon/fusion/client/ayon_fusion/api/pipeline.py @@ -22,9 +22,9 @@ from ayon_core.pipeline import ( AVALON_CONTAINER_ID, ) from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.fusion import FUSION_HOST_DIR from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost from ayon_core.tools.utils import host_tools +from ayon_fusion import FUSION_HOST_DIR from .lib import ( @@ -80,7 +80,7 @@ class FusionHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): and loaders into fusion. It is called automatically when installing via - `ayon_core.pipeline.install_host(ayon_core.hosts.fusion.api)` + `ayon_core.pipeline.install_host(ayon_fusion.api)` See the Maya equivalent for inspiration on how to implement this. @@ -127,7 +127,7 @@ class FusionHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): def open_workfile(self, filepath): # Hack to get fusion, see - # ayon_core.hosts.fusion.api.pipeline.get_current_comp() + # ayon_fusion.api.pipeline.get_current_comp() fusion = getattr(sys.modules["__main__"], "fusion", None) return fusion.LoadComp(filepath) diff --git a/server_addon/fusion/client/ayon_fusion/api/plugin.py b/server_addon/fusion/client/ayon_fusion/api/plugin.py index efe8269120..48e133cc63 100644 --- a/server_addon/fusion/client/ayon_fusion/api/plugin.py +++ b/server_addon/fusion/client/ayon_fusion/api/plugin.py @@ -1,7 +1,7 @@ from copy import deepcopy import os -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( get_current_comp, comp_lock_and_undo_chunk, ) diff --git a/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py index 640f78eeb8..0bd00ae2b8 100644 --- a/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py +++ b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py @@ -26,8 +26,8 @@ def main(env): # However the contents of that folder can conflict with Qt library dlls # so we make sure to move out of it to avoid DLL Load Failed errors. os.chdir("..") - from ayon_core.hosts.fusion.api import FusionHost - from ayon_core.hosts.fusion.api import menu + from ayon_fusion.api import FusionHost + from ayon_fusion.api import menu # activate resolve from pype install_host(FusionHost()) diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py index 113a1ffe59..8ae8b5027c 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py @@ -1,6 +1,6 @@ import os from ayon_applications import PreLaunchHook -from ayon_core.hosts.fusion import FUSION_HOST_DIR +from ayon_fusion import FUSION_HOST_DIR class FusionLaunchMenuHook(PreLaunchHook): diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py index 1064d0a83a..b715bb31b5 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py @@ -2,7 +2,7 @@ import os import shutil import platform from pathlib import Path -from ayon_core.hosts.fusion import ( +from ayon_fusion import ( FUSION_HOST_DIR, FUSION_VERSIONS_DICT, get_fusion_version, diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py index ef084b0483..c29a0617cc 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py @@ -4,7 +4,7 @@ from ayon_applications import ( LaunchTypes, ApplicationLaunchFailed, ) -from ayon_core.hosts.fusion import ( +from ayon_fusion import ( FUSION_HOST_DIR, FUSION_VERSIONS_DICT, get_fusion_version, diff --git a/server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py index 729843d078..d88219b268 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/create/create_image_saver.py @@ -1,6 +1,6 @@ from ayon_core.lib import NumberDef -from ayon_core.hosts.fusion.api.plugin import GenericCreateSaver +from ayon_fusion.api.plugin import GenericCreateSaver class CreateImageSaver(GenericCreateSaver): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py index 20c7b99851..3e7d9486ce 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/create/create_saver.py @@ -4,8 +4,8 @@ from ayon_core.lib import ( EnumDef ) -from ayon_core.hosts.fusion.api.plugin import GenericCreateSaver -from ayon_core.hosts.fusion.api.lib import get_current_comp +from ayon_fusion.api.plugin import GenericCreateSaver +from ayon_fusion.api.lib import get_current_comp class CreateSaver(GenericCreateSaver): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py b/server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py index a2fe027ef4..3dc14861df 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/create/create_workfile.py @@ -1,6 +1,6 @@ import ayon_api -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( get_current_comp ) from ayon_core.pipeline import ( diff --git a/server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py b/server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py index 167cd3be1f..e863c58ab3 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/inventory/select_containers.py @@ -8,7 +8,7 @@ class FusionSelectContainers(InventoryAction): color = "#d8d8d8" def process(self, containers): - from ayon_core.hosts.fusion.api import ( + from ayon_fusion.api import ( get_current_comp, comp_lock_and_undo_chunk ) diff --git a/server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py b/server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py index 7167cf0fc5..2c02afe32c 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/inventory/set_tool_color.py @@ -2,7 +2,7 @@ from qtpy import QtGui, QtWidgets from ayon_core.pipeline import InventoryAction from ayon_core import style -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( get_current_comp, comp_lock_and_undo_chunk ) diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/actions.py b/server_addon/fusion/client/ayon_fusion/plugins/load/actions.py index 95400ea41c..dfa73e0b7a 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/actions.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/actions.py @@ -27,7 +27,7 @@ class FusionSetFrameRangeLoader(load.LoaderPlugin): def load(self, context, name, namespace, data): - from ayon_core.hosts.fusion.api import lib + from ayon_fusion.api import lib version_attributes = context["version"]["attrib"] @@ -63,7 +63,7 @@ class FusionSetFrameRangeWithHandlesLoader(load.LoaderPlugin): def load(self, context, name, namespace, data): - from ayon_core.hosts.fusion.api import lib + from ayon_fusion.api import lib version_attributes = context["version"]["attrib"] start = version_attributes.get("frameStart", None) diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py index 312362caca..2e763b5330 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/load_alembic.py @@ -2,7 +2,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( imprint_container, get_current_comp, comp_lock_and_undo_chunk diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py index a84e7e0914..a080fa3983 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/load_fbx.py @@ -2,7 +2,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( imprint_container, get_current_comp, comp_lock_and_undo_chunk, diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py index 7c70b54e48..233f1d7021 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/load_sequence.py @@ -1,7 +1,7 @@ import contextlib import ayon_core.pipeline.load as load -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( imprint_container, get_current_comp, comp_lock_and_undo_chunk, diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py index 309b0c094c..42ce339faf 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/load_usd.py @@ -2,12 +2,12 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( imprint_container, get_current_comp, comp_lock_and_undo_chunk ) -from ayon_core.hosts.fusion.api.lib import get_fusion_module +from ayon_fusion.api.lib import get_fusion_module class FusionLoadUSD(load.LoaderPlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py b/server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py index 818fbcb187..c728f6b4aa 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/load/load_workfile.py @@ -5,7 +5,7 @@ is no update or reload function added for this plugin from ayon_core.pipeline import load -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( get_current_comp, get_bmd_library, ) diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py index 591c460d5a..2e5bcd63db 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_comp.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.fusion.api import get_current_comp +from ayon_fusion.api import get_current_comp class CollectCurrentCompFusion(pyblish.api.ContextPlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py index 9c04e59717..af52aee861 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/collect_render.py @@ -4,7 +4,7 @@ import pyblish.api from ayon_core.pipeline import publish from ayon_core.pipeline.publish import RenderInstance -from ayon_core.hosts.fusion.api.lib import get_frame_path +from ayon_fusion.api.lib import get_frame_path @attr.s diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py index 39fa20cfc0..bbcba5366d 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/extract_render_local.py @@ -5,8 +5,8 @@ import collections import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.fusion.api import comp_lock_and_undo_chunk -from ayon_core.hosts.fusion.api.lib import get_frame_path, maintained_comp_range +from ayon_fusion.api import comp_lock_and_undo_chunk +from ayon_fusion.api.lib import get_frame_path, maintained_comp_range log = logging.getLogger(__name__) diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py index d588748cfa..90b6b110a4 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_background_depth.py @@ -6,7 +6,7 @@ from ayon_core.pipeline import ( PublishValidationError, ) -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateBackgroundDepth( diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py index 13ea85b48c..1b910123f0 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_create_folder_checked.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateCreateFolderChecked(pyblish.api.InstancePlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py index 83d1feaefd..6dc9642581 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_expected_frames_existence.py @@ -4,7 +4,7 @@ import pyblish.api from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateLocalFramesExistence(pyblish.api.InstancePlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py index 17b1aa47c8..471c0ca31a 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_filename_has_extension.py @@ -3,7 +3,7 @@ import os import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateFilenameHasExtension(pyblish.api.InstancePlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py index 3aa6fb452f..7b8b70b2fb 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_instance_in_context.py @@ -2,7 +2,7 @@ """Validate if instance context is the same as publish context.""" import pyblish.api -from ayon_core.hosts.fusion.api.action import SelectToolAction +from ayon_fusion.api.action import SelectToolAction from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py index a8977e4747..de2cd1d862 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_has_input.py @@ -1,7 +1,7 @@ import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateSaverHasInput(pyblish.api.InstancePlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py index acafe3308f..caa17168bc 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_passthrough.py @@ -1,7 +1,7 @@ import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateSaverPassthrough(pyblish.api.ContextPlugin): diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py index 17992b123c..15d96a9afc 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_saver_resolution.py @@ -4,8 +4,8 @@ from ayon_core.pipeline import ( OptionalPyblishPluginMixin, ) -from ayon_core.hosts.fusion.api.action import SelectInvalidAction -from ayon_core.hosts.fusion.api import comp_lock_and_undo_chunk +from ayon_fusion.api.action import SelectInvalidAction +from ayon_fusion.api import comp_lock_and_undo_chunk class ValidateSaverResolution( diff --git a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py index bcd9abd8b0..dd7df54da5 100644 --- a/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py +++ b/server_addon/fusion/client/ayon_fusion/plugins/publish/validate_unique_subsets.py @@ -3,7 +3,7 @@ from collections import defaultdict import pyblish.api from ayon_core.pipeline import PublishValidationError -from ayon_core.hosts.fusion.api.action import SelectInvalidAction +from ayon_fusion.api.action import SelectInvalidAction class ValidateUniqueSubsets(pyblish.api.ContextPlugin): diff --git a/server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py b/server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py index 727fd335ea..78edb1b3ba 100644 --- a/server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py +++ b/server_addon/fusion/client/ayon_fusion/scripts/duplicate_with_inputs.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.fusion.api import ( +from ayon_fusion.api import ( comp_lock_and_undo_chunk, get_current_comp ) From 8f20f3ce0805435f0b934bf669f47fc92029d073 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 16:26:50 +0200 Subject: [PATCH 417/469] added fusion version milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index fcd41c5f7d..e14c8f9164 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -54,6 +54,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), + "fusion": VersionInfo(0, 2, 0), "max": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), From 2253e65f7ded6af4b84f92c4dcded3f221beb376 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 16:29:42 +0200 Subject: [PATCH 418/469] renamed 'FUSION_HOST_DIR' to 'FUSION_ADDON_ROOT' --- server_addon/fusion/client/ayon_fusion/__init__.py | 4 ++-- server_addon/fusion/client/ayon_fusion/addon.py | 4 ++-- server_addon/fusion/client/ayon_fusion/api/pipeline.py | 4 ++-- .../client/ayon_fusion/deploy/MenuScripts/launch_menu.py | 5 ++--- .../client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py | 4 ++-- .../client/ayon_fusion/hooks/pre_fusion_profile_hook.py | 4 ++-- .../fusion/client/ayon_fusion/hooks/pre_fusion_setup.py | 6 +++--- 7 files changed, 15 insertions(+), 16 deletions(-) diff --git a/server_addon/fusion/client/ayon_fusion/__init__.py b/server_addon/fusion/client/ayon_fusion/__init__.py index 1da11ba9d1..205750f84a 100644 --- a/server_addon/fusion/client/ayon_fusion/__init__.py +++ b/server_addon/fusion/client/ayon_fusion/__init__.py @@ -1,7 +1,7 @@ from .addon import ( get_fusion_version, FusionAddon, - FUSION_HOST_DIR, + FUSION_ADDON_ROOT, FUSION_VERSIONS_DICT, ) @@ -9,6 +9,6 @@ from .addon import ( __all__ = ( "get_fusion_version", "FusionAddon", - "FUSION_HOST_DIR", + "FUSION_ADDON_ROOT", "FUSION_VERSIONS_DICT", ) diff --git a/server_addon/fusion/client/ayon_fusion/addon.py b/server_addon/fusion/client/ayon_fusion/addon.py index 54e48ea7bf..91d24ddc8b 100644 --- a/server_addon/fusion/client/ayon_fusion/addon.py +++ b/server_addon/fusion/client/ayon_fusion/addon.py @@ -3,7 +3,7 @@ import re from ayon_core.addon import AYONAddon, IHostAddon from ayon_core.lib import Logger -FUSION_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) +FUSION_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) # FUSION_VERSIONS_DICT is used by the pre-launch hooks # The keys correspond to all currently supported Fusion versions @@ -55,7 +55,7 @@ class FusionAddon(AYONAddon, IHostAddon): def get_launch_hook_paths(self, app): if app.host_name != self.host_name: return [] - return [os.path.join(FUSION_HOST_DIR, "hooks")] + return [os.path.join(FUSION_ADDON_ROOT, "hooks")] def add_implementation_envs(self, env, app): # Set default values if are not already set via settings diff --git a/server_addon/fusion/client/ayon_fusion/api/pipeline.py b/server_addon/fusion/client/ayon_fusion/api/pipeline.py index 071b4b8fb5..04f0d3db9a 100644 --- a/server_addon/fusion/client/ayon_fusion/api/pipeline.py +++ b/server_addon/fusion/client/ayon_fusion/api/pipeline.py @@ -24,7 +24,7 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.load import any_outdated_containers from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost from ayon_core.tools.utils import host_tools -from ayon_fusion import FUSION_HOST_DIR +from ayon_fusion import FUSION_ADDON_ROOT from .lib import ( @@ -35,7 +35,7 @@ from .lib import ( log = Logger.get_logger(__name__) -PLUGINS_DIR = os.path.join(FUSION_HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(FUSION_ADDON_ROOT, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") LOAD_PATH = os.path.join(PLUGINS_DIR, "load") diff --git a/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py index 0bd00ae2b8..0c5010f6a7 100644 --- a/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py +++ b/server_addon/fusion/client/ayon_fusion/deploy/MenuScripts/launch_menu.py @@ -5,10 +5,9 @@ if sys.version_info < (3, 7): # hack to handle discrepancy between distributed libraries and Python 3.6 # mostly because wrong version of urllib3 # TODO remove when not necessary - from ayon_core import AYON_CORE_ROOT - FUSION_HOST_DIR = os.path.join(AYON_CORE_ROOT, "hosts", "fusion") + from ayon_fusion import FUSION_ADDON_ROOT - vendor_path = os.path.join(FUSION_HOST_DIR, "vendor") + vendor_path = os.path.join(FUSION_ADDON_ROOT, "vendor") if vendor_path not in sys.path: sys.path.insert(0, vendor_path) diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py index 8ae8b5027c..035cbb8d97 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_launch_menu_hook.py @@ -1,6 +1,6 @@ import os from ayon_applications import PreLaunchHook -from ayon_fusion import FUSION_HOST_DIR +from ayon_fusion import FUSION_ADDON_ROOT class FusionLaunchMenuHook(PreLaunchHook): @@ -28,7 +28,7 @@ class FusionLaunchMenuHook(PreLaunchHook): "Validation for Fusion version 18+ for /execute " "prelaunch argument skipped.") - path = os.path.join(FUSION_HOST_DIR, + path = os.path.join(FUSION_ADDON_ROOT, "deploy", "MenuScripts", "launch_menu.py").replace("\\", "/") diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py index b715bb31b5..7758798bb6 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_profile_hook.py @@ -3,7 +3,7 @@ import shutil import platform from pathlib import Path from ayon_fusion import ( - FUSION_HOST_DIR, + FUSION_ADDON_ROOT, FUSION_VERSIONS_DICT, get_fusion_version, ) @@ -163,7 +163,7 @@ class FusionCopyPrefsPrelaunch(PreLaunchHook): master_prefs_variable = f"FUSION{profile_version}_MasterPrefs" master_prefs = Path( - FUSION_HOST_DIR, "deploy", "ayon", "fusion_shared.prefs") + FUSION_ADDON_ROOT, "deploy", "ayon", "fusion_shared.prefs") self.log.info(f"Setting {master_prefs_variable}: {master_prefs}") self.launch_context.env[master_prefs_variable] = str(master_prefs) diff --git a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py index c29a0617cc..25cf40f18d 100644 --- a/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py +++ b/server_addon/fusion/client/ayon_fusion/hooks/pre_fusion_setup.py @@ -5,7 +5,7 @@ from ayon_applications import ( ApplicationLaunchFailed, ) from ayon_fusion import ( - FUSION_HOST_DIR, + FUSION_ADDON_ROOT, FUSION_VERSIONS_DICT, get_fusion_version, ) @@ -67,5 +67,5 @@ class FusionPrelaunch(PreLaunchHook): # for hook installing PySide2 self.data["fusion_python3_home"] = py3_dir - self.log.info(f"Setting AYON_FUSION_ROOT: {FUSION_HOST_DIR}") - self.launch_context.env["AYON_FUSION_ROOT"] = FUSION_HOST_DIR + self.log.info(f"Setting AYON_FUSION_ROOT: {FUSION_ADDON_ROOT}") + self.launch_context.env["AYON_FUSION_ROOT"] = FUSION_ADDON_ROOT From 9d42f7f613585e9dfef8cc7717512a1cfe0bb15f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 16:30:15 +0200 Subject: [PATCH 419/469] added version to client code --- server_addon/fusion/client/ayon_fusion/__init__.py | 3 +++ server_addon/fusion/client/ayon_fusion/addon.py | 3 +++ server_addon/fusion/client/ayon_fusion/version.py | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 server_addon/fusion/client/ayon_fusion/version.py diff --git a/server_addon/fusion/client/ayon_fusion/__init__.py b/server_addon/fusion/client/ayon_fusion/__init__.py index 205750f84a..f2ddccdd87 100644 --- a/server_addon/fusion/client/ayon_fusion/__init__.py +++ b/server_addon/fusion/client/ayon_fusion/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( get_fusion_version, FusionAddon, @@ -7,6 +8,8 @@ from .addon import ( __all__ = ( + "__version__", + "get_fusion_version", "FusionAddon", "FUSION_ADDON_ROOT", diff --git a/server_addon/fusion/client/ayon_fusion/addon.py b/server_addon/fusion/client/ayon_fusion/addon.py index 91d24ddc8b..ffc70b6ff4 100644 --- a/server_addon/fusion/client/ayon_fusion/addon.py +++ b/server_addon/fusion/client/ayon_fusion/addon.py @@ -3,6 +3,8 @@ import re from ayon_core.addon import AYONAddon, IHostAddon from ayon_core.lib import Logger +from .version import __version__ + FUSION_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) # FUSION_VERSIONS_DICT is used by the pre-launch hooks @@ -50,6 +52,7 @@ def get_fusion_version(app_name): class FusionAddon(AYONAddon, IHostAddon): name = "fusion" + version = __version__ host_name = "fusion" def get_launch_hook_paths(self, app): diff --git a/server_addon/fusion/client/ayon_fusion/version.py b/server_addon/fusion/client/ayon_fusion/version.py new file mode 100644 index 0000000000..209eddcdb6 --- /dev/null +++ b/server_addon/fusion/client/ayon_fusion/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'fusion' version.""" +__version__ = "0.2.0" From 1a5116600b342429faf11d1f8cb369d22d769833 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 31 May 2024 17:30:27 +0300 Subject: [PATCH 420/469] remove 'hosts' and 'settings_category' attributes from plugins classes --- .../ayon_houdini/plugins/publish/collect_active_state.py | 1 - .../client/ayon_houdini/plugins/publish/collect_arnold_rop.py | 1 - .../ayon_houdini/plugins/publish/collect_asset_handles.py | 4 ---- .../client/ayon_houdini/plugins/publish/collect_cache_farm.py | 1 - .../client/ayon_houdini/plugins/publish/collect_chunk_size.py | 3 --- .../ayon_houdini/plugins/publish/collect_current_file.py | 1 - .../ayon_houdini/plugins/publish/collect_farm_instances.py | 1 - .../client/ayon_houdini/plugins/publish/collect_inputs.py | 1 - .../ayon_houdini/plugins/publish/collect_instances_type.py | 1 - .../plugins/publish/collect_instances_usd_layered.py | 1 - .../client/ayon_houdini/plugins/publish/collect_karma_rop.py | 1 - .../plugins/publish/collect_local_render_instances.py | 3 --- .../client/ayon_houdini/plugins/publish/collect_mantra_rop.py | 1 - .../ayon_houdini/plugins/publish/collect_output_node.py | 1 - .../ayon_houdini/plugins/publish/collect_redshift_rop.py | 1 - .../ayon_houdini/plugins/publish/collect_remote_publish.py | 1 - .../ayon_houdini/plugins/publish/collect_render_products.py | 1 - .../ayon_houdini/plugins/publish/collect_review_data.py | 1 - .../ayon_houdini/plugins/publish/collect_rop_frame_range.py | 1 - .../ayon_houdini/plugins/publish/collect_staticmesh_type.py | 1 - .../ayon_houdini/plugins/publish/collect_usd_bootstrap.py | 1 - .../client/ayon_houdini/plugins/publish/collect_usd_layers.py | 1 - .../client/ayon_houdini/plugins/publish/collect_vray_rop.py | 1 - .../client/ayon_houdini/plugins/publish/collect_workfile.py | 1 - .../ayon_houdini/plugins/publish/collect_workscene_fps.py | 1 - .../plugins/publish/extract_active_view_thumbnail.py | 1 - .../client/ayon_houdini/plugins/publish/extract_alembic.py | 1 - .../client/ayon_houdini/plugins/publish/extract_ass.py | 1 - .../client/ayon_houdini/plugins/publish/extract_bgeo.py | 1 - .../client/ayon_houdini/plugins/publish/extract_composite.py | 1 - .../client/ayon_houdini/plugins/publish/extract_fbx.py | 1 - .../client/ayon_houdini/plugins/publish/extract_hda.py | 1 - .../client/ayon_houdini/plugins/publish/extract_mantra_ifd.py | 1 - .../client/ayon_houdini/plugins/publish/extract_opengl.py | 1 - .../ayon_houdini/plugins/publish/extract_redshift_proxy.py | 1 - .../client/ayon_houdini/plugins/publish/extract_render.py | 1 - .../client/ayon_houdini/plugins/publish/extract_usd.py | 1 - .../ayon_houdini/plugins/publish/extract_usd_layered.py | 1 - .../client/ayon_houdini/plugins/publish/extract_vdb_cache.py | 1 - .../ayon_houdini/plugins/publish/increment_current_file.py | 1 - .../houdini/client/ayon_houdini/plugins/publish/save_scene.py | 1 - .../plugins/publish/validate_abc_primitive_to_detail.py | 1 - .../plugins/publish/validate_alembic_face_sets.py | 1 - .../plugins/publish/validate_alembic_input_node.py | 1 - .../client/ayon_houdini/plugins/publish/validate_bypass.py | 1 - .../ayon_houdini/plugins/publish/validate_camera_rop.py | 1 - .../ayon_houdini/plugins/publish/validate_cop_output_node.py | 1 - .../plugins/publish/validate_export_is_a_single_frame.py | 1 - .../ayon_houdini/plugins/publish/validate_fbx_output_node.py | 1 - .../ayon_houdini/plugins/publish/validate_file_extension.py | 1 - .../ayon_houdini/plugins/publish/validate_frame_range.py | 1 - .../plugins/publish/validate_houdini_license_category.py | 1 - .../plugins/publish/validate_instance_in_context.py | 3 --- .../ayon_houdini/plugins/publish/validate_mesh_is_static.py | 3 --- .../ayon_houdini/plugins/publish/validate_mkpaths_toggled.py | 1 - .../client/ayon_houdini/plugins/publish/validate_no_errors.py | 1 - .../plugins/publish/validate_primitive_hierarchy_paths.py | 1 - .../ayon_houdini/plugins/publish/validate_remote_publish.py | 1 - .../plugins/publish/validate_remote_publish_enabled.py | 1 - .../plugins/publish/validate_review_colorspace.py | 3 --- .../ayon_houdini/plugins/publish/validate_scene_review.py | 1 - .../ayon_houdini/plugins/publish/validate_sop_output_node.py | 1 - .../ayon_houdini/plugins/publish/validate_subset_name.py | 2 -- .../plugins/publish/validate_unreal_staticmesh_naming.py | 3 --- .../plugins/publish/validate_usd_layer_path_backslashes.py | 1 - .../plugins/publish/validate_usd_model_and_shade.py | 1 - .../ayon_houdini/plugins/publish/validate_usd_output_node.py | 1 - .../plugins/publish/validate_usd_render_product_names.py | 1 - .../ayon_houdini/plugins/publish/validate_usd_setdress.py | 1 - .../plugins/publish/validate_usd_shade_model_exists.py | 1 - .../plugins/publish/validate_usd_shade_workspace.py | 1 - .../ayon_houdini/plugins/publish/validate_vdb_output_node.py | 1 - .../ayon_houdini/plugins/publish/validate_workfile_paths.py | 3 --- 73 files changed, 91 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py index 73c11368b4..e09a347e9f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_active_state.py @@ -16,7 +16,6 @@ class CollectInstanceActiveState(plugin.HoudiniInstancePlugin): order = pyblish.api.CollectorOrder + 0.299 families = ["*"] - hosts = ["houdini"] label = "Instance Active State" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py index 0682ce8b9b..10c6d91d26 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_arnold_rop.py @@ -25,7 +25,6 @@ class CollectArnoldROPRenderProducts(plugin.HoudiniInstancePlugin): # This specific order value is used so that # this plugin runs after CollectFrames order = pyblish.api.CollectorOrder + 0.11 - hosts = ["houdini"] families = ["arnold_rop"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py index 4bb3228c54..db9bde8595 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_asset_handles.py @@ -23,8 +23,6 @@ class CollectAssetHandles(plugin.HoudiniInstancePlugin, the exclusive frame range and actual handle ranges. """ - hosts = ["houdini"] - # This specific order value is used so that # this plugin runs after CollectAnatomyInstanceData order = pyblish.api.CollectorOrder + 0.499 @@ -32,8 +30,6 @@ class CollectAssetHandles(plugin.HoudiniInstancePlugin, label = "Collect Folder Handles" use_asset_handles = True - settings_category = "houdini" - def process(self, instance): # Only process instances without already existing handles data # but that do have frameStartHandle and frameEndHandle defined diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py index 9c41e68362..ecfebccfef 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_cache_farm.py @@ -15,7 +15,6 @@ class CollectDataforCache(plugin.HoudiniInstancePlugin): families = ["ass", "pointcache", "mantraifd", "redshiftproxy", "vdbcache", "model"] - hosts = ["houdini"] targets = ["local", "remote"] label = "Collect Data for Cache" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py index f9f4304aa6..6ff53b7695 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_chunk_size.py @@ -12,13 +12,10 @@ class CollectChunkSize(plugin.HoudiniInstancePlugin, families = ["ass", "pointcache", "vdbcache", "mantraifd", "redshiftproxy", "model"] - hosts = ["houdini"] targets = ["local", "remote"] label = "Collect Chunk Size" chunk_size = 999999 - settings_category = "houdini" - def process(self, instance): # need to get the chunk size info from the setting attr_values = self.get_attr_values_from_data(instance.data) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py index 70f96e0104..8e339e0e04 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_current_file.py @@ -10,7 +10,6 @@ class CollectHoudiniCurrentFile(plugin.HoudiniContextPlugin): order = pyblish.api.CollectorOrder - 0.1 label = "Houdini Current File" - hosts = ["houdini"] def process(self, context): """Inject the current working file""" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py index 6acf216ef3..8fdae06f90 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_farm_instances.py @@ -12,7 +12,6 @@ class CollectFarmInstances(plugin.HoudiniInstancePlugin): "arnold_rop", "vray_rop"] - hosts = ["houdini"] targets = ["local", "remote"] label = "Collect farm instances" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py index 6a815f8d08..f2904a68f6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_inputs.py @@ -91,7 +91,6 @@ class CollectUpstreamInputs(plugin.HoudiniInstancePlugin): label = "Collect Inputs" order = pyblish.api.CollectorOrder + 0.4 - hosts = ["houdini"] def process(self, instance): # We can't get the "inputAncestors" directly from the ROP diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_type.py index 07851387fe..542abf8139 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_type.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_type.py @@ -10,7 +10,6 @@ class CollectPointcacheType(pyblish.api.InstancePlugin): """Collect data type for different instances.""" order = pyblish.api.CollectorOrder - hosts = ["houdini"] families = ["pointcache", "model"] label = "Collect instances types" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py index ca94c50372..4f85a629fb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_instances_usd_layered.py @@ -32,7 +32,6 @@ class CollectInstancesUsdLayered(plugin.HoudiniContextPlugin): order = pyblish.api.CollectorOrder - 0.01 label = "Collect Instances (USD Configured Layers)" - hosts = ["houdini"] def process(self, context): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py index 0b2110df4e..60fec9d2e0 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_karma_rop.py @@ -28,7 +28,6 @@ class CollectKarmaROPRenderProducts(plugin.HoudiniInstancePlugin): # This specific order value is used so that # this plugin runs after CollectFrames order = pyblish.api.CollectorOrder + 0.11 - hosts = ["houdini"] families = ["karma_rop"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py index 978d903fd2..259b2378bb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_local_render_instances.py @@ -23,11 +23,8 @@ class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin): "arnold_rop", "vray_rop"] - hosts = ["houdini"] label = "Collect local render instances" - settings_category = "houdini" - use_deadline_aov_filter = False aov_filter = {"host_name": "houdini", "value": [".*([Bb]eauty).*"]} diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py index f9b6dd837d..f7feeee63b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_mantra_rop.py @@ -28,7 +28,6 @@ class CollectMantraROPRenderProducts(plugin.HoudiniInstancePlugin): # This specific order value is used so that # this plugin runs after CollectFrames order = pyblish.api.CollectorOrder + 0.11 - hosts = ["houdini"] families = ["mantra_rop"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py index a1f0e261d0..ff51669376 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_output_node.py @@ -19,7 +19,6 @@ class CollectOutputSOPPath(plugin.HoudiniInstancePlugin): "model" ] - hosts = ["houdini"] label = "Collect Output Node Path" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py index c1d5267d0a..96cb6ebeaf 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_redshift_rop.py @@ -28,7 +28,6 @@ class CollectRedshiftROPRenderProducts(plugin.HoudiniInstancePlugin): # This specific order value is used so that # this plugin runs after CollectFrames order = pyblish.api.CollectorOrder + 0.11 - hosts = ["houdini"] families = ["redshift_rop"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py index b1b77aceb9..e695b57518 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_remote_publish.py @@ -10,7 +10,6 @@ class CollectRemotePublishSettings(plugin.HoudiniContextPlugin): order = pyblish.api.CollectorOrder families = ["*"] - hosts = ["houdini"] targets = ["deadline"] label = "Remote Publish Submission Settings" actions = [RepairAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py index cded3ac509..e84f6c6f84 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_render_products.py @@ -47,7 +47,6 @@ class CollectRenderProducts(plugin.HoudiniInstancePlugin): label = "Collect Render Products" order = pyblish.api.CollectorOrder + 0.4 - hosts = ["houdini"] families = ["usdrender"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py index 9a2af9b9d8..cca55463e6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_review_data.py @@ -11,7 +11,6 @@ class CollectHoudiniReviewData(plugin.HoudiniInstancePlugin): # this plugin runs after CollectRopFrameRange # Also after CollectLocalRenderInstances order = pyblish.api.CollectorOrder + 0.13 - hosts = ["houdini"] families = ["review"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py index 01cf095da1..c0f8d7aef9 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_rop_frame_range.py @@ -8,7 +8,6 @@ from ayon_houdini.api import lib, plugin class CollectRopFrameRange(plugin.HoudiniInstancePlugin): """Collect all frames which would be saved from the ROP nodes""" - hosts = ["houdini"] order = pyblish.api.CollectorOrder label = "Collect RopNode Frame Range" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py index 91203d88e2..1aab655532 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_staticmesh_type.py @@ -8,7 +8,6 @@ from ayon_houdini.api import plugin class CollectStaticMeshType(plugin.HoudiniInstancePlugin): """Collect data type for fbx instance.""" - hosts = ["houdini"] families = ["staticMesh"] label = "Collect type of staticMesh" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py index e180cc1899..5067b9aab2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_bootstrap.py @@ -21,7 +21,6 @@ class CollectUsdBootstrap(plugin.HoudiniInstancePlugin): order = pyblish.api.CollectorOrder + 0.35 label = "Collect USD Bootstrap" - hosts = ["houdini"] families = ["usd", "usd.layered"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py index f8ed0b0931..7ecf5fbb02 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_usd_layers.py @@ -10,7 +10,6 @@ class CollectUsdLayers(plugin.HoudiniInstancePlugin): order = pyblish.api.CollectorOrder + 0.35 label = "Collect USD Layers" - hosts = ["houdini"] families = ["usd"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py index a340cf818e..2f9c2bb18e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_vray_rop.py @@ -28,7 +28,6 @@ class CollectVrayROPRenderProducts(plugin.HoudiniInstancePlugin): # This specific order value is used so that # this plugin runs after CollectFrames order = pyblish.api.CollectorOrder + 0.11 - hosts = ["houdini"] families = ["vray_rop"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py index bfa1a754c3..8d0939a803 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workfile.py @@ -8,7 +8,6 @@ class CollectWorkfile(plugin.HoudiniInstancePlugin): order = pyblish.api.CollectorOrder - 0.01 label = "Houdini Workfile Data" - hosts = ["houdini"] families = ["workfile"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py index 7274523f66..0091eb0abb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/collect_workscene_fps.py @@ -8,7 +8,6 @@ class CollectWorksceneFPS(plugin.HoudiniContextPlugin): label = "Workscene FPS" order = pyblish.api.CollectorOrder - hosts = ["houdini"] def process(self, context): fps = hou.fps() diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index 36f20b6e48..ef35a505c4 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -15,7 +15,6 @@ class ExtractActiveViewThumbnail(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.49 label = "Extract Active View Thumbnail" families = ["workfile"] - hosts = ["houdini"] def process(self, instance): if IS_HEADLESS: diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py index 702c0f9687..4016dd05fb 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py @@ -11,7 +11,6 @@ class ExtractAlembic(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Alembic" - hosts = ["houdini"] families = ["abc", "camera"] targets = ["local", "remote"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py index bceafde75f..cb450b9524 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py @@ -12,7 +12,6 @@ class ExtractAss(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Ass" families = ["ass"] - hosts = ["houdini"] targets = ["local", "remote"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py index 221b073bf0..f867bc98a8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py @@ -10,7 +10,6 @@ class ExtractBGEO(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract BGEO" - hosts = ["houdini"] families = ["bgeo"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py index 4059367914..41e4e4bb14 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py @@ -12,7 +12,6 @@ class ExtractComposite(plugin.HoudiniInstancePlugin, order = pyblish.api.ExtractorOrder label = "Extract Composite (Image Sequence)" - hosts = ["houdini"] families = ["imagesequence"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py index 9f5cbc5fc2..f12ca666d8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py @@ -12,7 +12,6 @@ class ExtractFBX(plugin.HoudiniInstancePlugin): label = "Extract FBX" families = ["fbx"] - hosts = ["houdini"] order = pyblish.api.ExtractorOrder + 0.1 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py index 8f83d26930..d93113b0a6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py @@ -10,7 +10,6 @@ class ExtractHDA(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract HDA" - hosts = ["houdini"] families = ["hda"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py index 29e1a1a93b..fd36759aa7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py @@ -10,7 +10,6 @@ class ExtractMantraIFD(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Mantra ifd" - hosts = ["houdini"] families = ["mantraifd"] targets = ["local", "remote"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py index c08f9875c5..8fa0cf0d25 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py @@ -14,7 +14,6 @@ class ExtractOpenGL(plugin.HoudiniInstancePlugin, order = pyblish.api.ExtractorOrder - 0.01 label = "Extract OpenGL" families = ["review"] - hosts = ["houdini"] def process(self, instance): ropnode = hou.node(instance.data.get("instance_node")) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py index b425ed52ac..b46f5a15a3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py @@ -12,7 +12,6 @@ class ExtractRedshiftProxy(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Redshift Proxy" families = ["redshiftproxy"] - hosts = ["houdini"] targets = ["local", "remote"] def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 91ad77c144..62ad394e73 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -11,7 +11,6 @@ class ExtractRender(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Render" - hosts = ["houdini"] families = ["mantra_rop", "karma_rop", "redshift_rop", diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py index 321bdcb12e..c816a9a4ea 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py @@ -11,7 +11,6 @@ class ExtractUSD(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract USD" - hosts = ["houdini"] families = ["usd", "usdModel", "usdSetDress"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py index 40ae140a59..68f0516c6e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py @@ -156,7 +156,6 @@ class ExtractUSDLayered(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder label = "Extract Layered USD" - hosts = ["houdini"] families = ["usdLayered", "usdShade"] # Force Output Processors so it will always save any file diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py index 7275229422..4afa26036b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py @@ -12,7 +12,6 @@ class ExtractVDBCache(plugin.HoudiniInstancePlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract VDB Cache" families = ["vdbcache"] - hosts = ["houdini"] def process(self, instance): if instance.data.get("farm"): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py index 57acf5b3af..878500f605 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/increment_current_file.py @@ -19,7 +19,6 @@ class IncrementCurrentFile(plugin.HoudiniContextPlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 - hosts = ["houdini"] families = ["workfile", "usdrender", "mantra_rop", diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py index f675952bfb..e0734da5d1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/save_scene.py @@ -10,7 +10,6 @@ class SaveCurrentScene(plugin.HoudiniContextPlugin): label = "Save current file" order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["houdini"] def process(self, context): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py index f9b0496c6f..51885a963e 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_abc_primitive_to_detail.py @@ -20,7 +20,6 @@ class ValidateAbcPrimitiveToDetail(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 families = ["abc"] - hosts = ["houdini"] label = "Validate Primitive to Detail (Abc)" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py index 13365ecfd6..00ce554ff1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_face_sets.py @@ -21,7 +21,6 @@ class ValidateAlembicROPFaceSets(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 families = ["abc"] - hosts = ["houdini"] label = "Validate Alembic ROP Face Sets" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py index 38ead0f9f0..aab3068171 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_alembic_input_node.py @@ -17,7 +17,6 @@ class ValidateAlembicInputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 families = ["abc"] - hosts = ["houdini"] label = "Validate Input Node (Abc)" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py index 4a044bc9ad..f3856b4147 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_bypass.py @@ -18,7 +18,6 @@ class ValidateBypassed(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder - 0.1 families = ["*"] - hosts = ["houdini"] label = "Validate ROP Bypass" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py index f9e6b036b8..f21addb11d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_camera_rop.py @@ -11,7 +11,6 @@ class ValidateCameraROP(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["camera"] - hosts = ["houdini"] label = "Camera ROP" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py index c593a96b9d..1d63e15d90 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_cop_output_node.py @@ -19,7 +19,6 @@ class ValidateCopOutputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["imagesequence"] - hosts = ["houdini"] label = "Validate COP Output Node" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_export_is_a_single_frame.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_export_is_a_single_frame.py index a0dbc581ba..b26c60320b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_export_is_a_single_frame.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_export_is_a_single_frame.py @@ -18,7 +18,6 @@ class ValidateSingleFrame(pyblish.api.InstancePlugin, """ families = ["model"] - hosts = ["houdini"] label = "Validate Single Frame" order = ValidateContentsOrder + 0.1 actions = [SelectInvalidAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py index 2b2136c607..1c236bb8f7 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_fbx_output_node.py @@ -23,7 +23,6 @@ class ValidateFBXOutputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["fbx"] - hosts = ["houdini"] label = "Validate FBX Output Node" actions = [SelectROPAction, SelectInvalidAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py index cb8e0952bc..1b3a58f4b3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_file_extension.py @@ -20,7 +20,6 @@ class ValidateFileExtension(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["camera", "vdbcache"] - hosts = ["houdini"] label = "Output File Extension" family_extensions = { diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py index f543497407..9435fa033a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_frame_range.py @@ -24,7 +24,6 @@ class ValidateFrameRange(plugin.HoudiniInstancePlugin): """ order = pyblish.api.ValidatorOrder - 0.1 - hosts = ["houdini"] label = "Validate Frame Range" actions = [DisableUseFolderHandlesAction, SelectInvalidAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py index a96fdba452..d76f8a0072 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_houdini_license_category.py @@ -24,7 +24,6 @@ class ValidateHoudiniNotApprenticeLicense(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usd", "abc", "fbx", "camera"] - hosts = ["houdini"] label = "Houdini Apprentice License" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py index 5dbd45f1dc..7566dff240 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_instance_in_context.py @@ -24,11 +24,8 @@ class ValidateInstanceInContextHoudini(plugin.HoudiniInstancePlugin, order = ValidateContentsOrder label = "Instance in same Context" optional = True - hosts = ["houdini"] actions = [SelectROPAction, RepairAction] - settings_category = "houdini" - def process(self, instance): if not self.is_active(instance.data): return diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py index 94013a7ed4..b6725bc36c 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mesh_is_static.py @@ -23,13 +23,10 @@ class ValidateMeshIsStatic(plugin.HoudiniInstancePlugin, families = ["staticMesh", "model"] - hosts = ["houdini"] label = "Validate Mesh is Static" order = ValidateContentsOrder + 0.1 actions = [SelectInvalidAction] - settings_category = "houdini" - def process(self, instance): invalid = self.get_invalid(instance) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py index b4ba70c1e1..4573d4ba0b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_mkpaths_toggled.py @@ -11,7 +11,6 @@ class ValidateIntermediateDirectoriesChecked(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["pointcache", "camera", "vdbcache", "model"] - hosts = ["houdini"] label = "Create Intermediate Directories Checked" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py index 5f4222b3e8..ef66665d7b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_no_errors.py @@ -33,7 +33,6 @@ class ValidateNoErrors(plugin.HoudiniInstancePlugin): """Validate the Instance has no current cooking errors.""" order = pyblish.api.ValidatorOrder - hosts = ["houdini"] label = "Validate no errors" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py index 1e068193fc..9daab2a1a3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_primitive_hierarchy_paths.py @@ -25,7 +25,6 @@ class ValidatePrimitiveHierarchyPaths(plugin.HoudiniInstancePlugin): order = ValidateContentsOrder + 0.1 families = ["abc"] - hosts = ["houdini"] label = "Validate Prims Hierarchy Path" actions = [AddDefaultPathAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py index 7332765fe2..08597c0a6f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish.py @@ -13,7 +13,6 @@ class ValidateRemotePublishOutNode(plugin.HoudiniContextPlugin): order = pyblish.api.ValidatorOrder - 0.4 families = ["*"] - hosts = ["houdini"] targets = ["deadline"] label = "Remote Publish ROP node" actions = [RepairContextAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py index 1c36ba6ee9..dc5666609f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_remote_publish_enabled.py @@ -13,7 +13,6 @@ class ValidateRemotePublishEnabled(plugin.HoudiniContextPlugin): order = pyblish.api.ValidatorOrder - 0.39 families = ["*"] - hosts = ["houdini"] targets = ["deadline"] label = "Remote Publish ROP enabled" actions = [RepairContextAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py index 96c8d1d73a..e96b222446 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_review_colorspace.py @@ -31,15 +31,12 @@ class ValidateReviewColorspace(plugin.HoudiniInstancePlugin, order = pyblish.api.ValidatorOrder + 0.1 families = ["review"] - hosts = ["houdini"] label = "Validate Review Colorspace" actions = [ResetViewSpaceAction, SelectROPAction] optional = True review_color_space = "" - settings_category = "houdini" - @classmethod def apply_settings(cls, project_settings): # Preserve automatic settings applying logic diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py index c923a2d33c..f45cd1c97d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_scene_review.py @@ -15,7 +15,6 @@ class ValidateSceneReview(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["review"] - hosts = ["houdini"] label = "Scene Setting for review" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py index 511d49aae7..7d37927058 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_sop_output_node.py @@ -25,7 +25,6 @@ class ValidateSopOutputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["pointcache", "vdbcache", "model"] - hosts = ["houdini"] label = "Validate Output Node (SOP)" actions = [SelectROPAction, SelectInvalidAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py index 0f046d8bfc..dfd353bddf 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_subset_name.py @@ -27,13 +27,11 @@ class ValidateSubsetName(plugin.HoudiniInstancePlugin, """ families = ["staticMesh"] - hosts = ["houdini"] label = "Validate Product Name" order = ValidateContentsOrder + 0.1 actions = [FixProductNameAction, SelectInvalidAction] optional = True - settings_category = "houdini" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py index d400b513bc..a3d971695d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_unreal_staticmesh_naming.py @@ -29,7 +29,6 @@ class ValidateUnrealStaticMeshName(plugin.HoudiniInstancePlugin, """ families = ["staticMesh"] - hosts = ["houdini"] label = "Unreal Static Mesh Name (FBX)" order = ValidateContentsOrder + 0.1 actions = [SelectInvalidAction] @@ -38,8 +37,6 @@ class ValidateUnrealStaticMeshName(plugin.HoudiniInstancePlugin, collision_prefixes = [] static_mesh_prefix = "" - settings_category = "houdini" - @classmethod def apply_settings(cls, project_settings): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py index a55188d43a..4da67ff199 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_layer_path_backslashes.py @@ -23,7 +23,6 @@ class ValidateUSDLayerPathBackslashes(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usdSetDress", "usdShade", "usd", "usdrender"] - hosts = ["houdini"] label = "USD Layer path backslashes" optional = True diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py index 7af3427aee..935bd39e23 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_model_and_shade.py @@ -26,7 +26,6 @@ class ValidateUsdModel(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usdModel"] - hosts = ["houdini"] label = "Validate USD Model" optional = True diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py index f35a4b56bc..88d549d46c 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_output_node.py @@ -18,7 +18,6 @@ class ValidateUSDOutputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usd"] - hosts = ["houdini"] label = "Validate Output Node (USD)" def process(self, instance): diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py index 6b19ba9264..eb46b266e2 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_render_product_names.py @@ -12,7 +12,6 @@ class ValidateUSDRenderProductNames(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usdrender"] - hosts = ["houdini"] label = "Validate USD Render Product Names" optional = True diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py index f0fbf0f6ba..3e91f0418f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_setdress.py @@ -16,7 +16,6 @@ class ValidateUsdSetDress(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder families = ["usdSetDress"] - hosts = ["houdini"] label = "Validate USD Set Dress" optional = True diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py index 48493616d7..8a93d3b4a1 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_model_exists.py @@ -15,7 +15,6 @@ class ValidateUSDShadeModelExists(plugin.HoudiniInstancePlugin): """Validate the Instance has no current cooking errors.""" order = ValidateContentsOrder - hosts = ["houdini"] families = ["usdShade"] label = "USD Shade model exists" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py index 20be856ba4..8972941253 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_usd_shade_workspace.py @@ -16,7 +16,6 @@ class ValidateUsdShadeWorkspace(plugin.HoudiniInstancePlugin): """ order = pyblish.api.ValidatorOrder - hosts = ["houdini"] families = ["usdShade"] label = "USD Shade Workspace" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py index 538ac1c281..c4ed9d2fb8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_vdb_output_node.py @@ -82,7 +82,6 @@ class ValidateVDBOutputNode(plugin.HoudiniInstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 families = ["vdbcache"] - hosts = ["houdini"] label = "Validate Output Node (VDB)" actions = [SelectInvalidAction] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py index efc581b5bd..e1cd0c6caa 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/validate_workfile_paths.py @@ -17,7 +17,6 @@ class ValidateWorkfilePaths( order = pyblish.api.ValidatorOrder families = ["workfile"] - hosts = ["houdini"] label = "Validate Workfile Paths" actions = [RepairAction] optional = True @@ -25,8 +24,6 @@ class ValidateWorkfilePaths( node_types = ["file", "alembic"] prohibited_vars = ["$HIP", "$JOB"] - settings_category = "houdini" - def process(self, instance): if not self.is_active(instance.data): return From a0d49c7146a1252b554c5f79fd0eb2783b56fee7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 16:36:05 +0200 Subject: [PATCH 421/469] fix import in deadline --- .../modules/deadline/plugins/publish/submit_fusion_deadline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py index 6c70119628..9eea4d6549 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_fusion_deadline.py @@ -79,7 +79,7 @@ class FusionSubmitDeadline( else: context.data[key] = True - from ayon_core.hosts.fusion.api.lib import get_frame_path + from ayon_fusion.api.lib import get_frame_path deadline_url = instance.data["deadline"]["url"] assert deadline_url, "Requires Deadline Webservice URL" From d99245f495f2dadd6b4fac372e21146360037ed5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:01:51 +0200 Subject: [PATCH 422/469] added settings category to photoshop plugins --- .../plugins/publish/collect_color_coded_instances.py | 1 + .../client/ayon_photoshop/plugins/publish/collect_review.py | 1 + .../client/ayon_photoshop/plugins/publish/collect_version.py | 1 + .../client/ayon_photoshop/plugins/publish/extract_image.py | 1 + .../client/ayon_photoshop/plugins/publish/extract_review.py | 1 + .../client/ayon_photoshop/plugins/publish/validate_naming.py | 1 + 6 files changed, 6 insertions(+) diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py index 52df60dd8a..072eb82179 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py @@ -33,6 +33,7 @@ class CollectColorCodedInstances(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder hosts = ["photoshop"] targets = ["automated"] + settings_category = "photoshop" # configurable by Settings color_code_mapping = [] diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py index 1ffbadf022..d9a29f9b74 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py @@ -16,6 +16,7 @@ class CollectReview(pyblish.api.ContextPlugin): label = "Collect Review" hosts = ["photoshop"] order = pyblish.api.CollectorOrder + 0.1 + settings_category = "photoshop" def process(self, context): for instance in context: diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py index cda71d8643..bc9f05ab50 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py @@ -22,6 +22,7 @@ class CollectVersion(pyblish.api.InstancePlugin): hosts = ["photoshop"] families = ["image", "review", "workfile"] + settings_category = "photoshop" def process(self, instance): workfile_version = instance.context.data["version"] diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py index 0d8824af2d..33599d37bb 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py @@ -22,6 +22,7 @@ class ExtractImage(pyblish.api.ContextPlugin): families = ["image", "background"] formats = ["png", "jpg"] + settings_category = "photoshop" def process(self, context): stub = photoshop.stub() diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py index 11bb47a886..0f36d31648 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py @@ -29,6 +29,7 @@ class ExtractReview(publish.Extractor): label = "Extract Review" hosts = ["photoshop"] families = ["review"] + settings_category = "photoshop" # Extract Options jpg_options = None diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py index 2b5492d878..e5f826b07e 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py @@ -16,6 +16,7 @@ class ValidateNamingRepair(pyblish.api.Action): label = "Repair" icon = "wrench" on = "failed" + settings_category = "photoshop" def process(self, context, plugin): From 24c74cf8edb261e6fddccf1f6e3e216156d2e782 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:02:43 +0200 Subject: [PATCH 423/469] bump photoshop version to '0.2.1' --- server_addon/photoshop/client/ayon_photoshop/version.py | 2 +- server_addon/photoshop/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/photoshop/client/ayon_photoshop/version.py b/server_addon/photoshop/client/ayon_photoshop/version.py index f04558d6c6..31a969addf 100644 --- a/server_addon/photoshop/client/ayon_photoshop/version.py +++ b/server_addon/photoshop/client/ayon_photoshop/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring AYON addon 'photoshop' version.""" -__version__ = "0.2.0" +__version__ = "0.2.1" diff --git a/server_addon/photoshop/package.py b/server_addon/photoshop/package.py index 3c57a9c79e..d04973ebc3 100644 --- a/server_addon/photoshop/package.py +++ b/server_addon/photoshop/package.py @@ -1,6 +1,6 @@ name = "photoshop" title = "Photoshop" -version = "0.2.0" +version = "0.2.1" client_dir = "ayon_photoshop" From 8f823ac02a6d21c616d5c5f99f8cfe5e09fb3066 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:06:54 +0200 Subject: [PATCH 424/469] added settings category to loader --- .../client/ayon_harmony/plugins/load/load_imagesequence.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py b/server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py index a1b890300c..cc588a3442 100644 --- a/server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py +++ b/server_addon/harmony/client/ayon_harmony/plugins/load/load_imagesequence.py @@ -30,6 +30,7 @@ class ImageSequenceLoader(load.LoaderPlugin): } representations = {"*"} extensions = {"jpeg", "png", "jpg"} + settings_category = "harmony" def load(self, context, name=None, namespace=None, data=None): """Plugin entry point. From 9cbb4a36f1bd2014fd3929ac92b6f72bd80da3c4 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:10:09 +0200 Subject: [PATCH 425/469] add settings category to tvpaint load plugins --- .../tvpaint/client/ayon_tvpaint/plugins/load/load_image.py | 1 + .../client/ayon_tvpaint/plugins/load/load_reference_image.py | 1 + 2 files changed, 2 insertions(+) diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py index de61992d3f..18b06c9632 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_image.py @@ -8,6 +8,7 @@ class ImportImage(plugin.Loader): product_types = {"render", "image", "background", "plate", "review"} representations = {"*"} + settings_category = "tvpaint" label = "Import Image" order = 1 diff --git a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py index ce08aa9cd9..88bf738999 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/plugins/load/load_reference_image.py @@ -19,6 +19,7 @@ class LoadImage(plugin.Loader): product_types = {"render", "image", "background", "plate", "review"} representations = {"*"} + settings_category = "tvpaint" label = "Load Image" order = 1 From 9074120b6a165527bfeac8cade7e300637be23f4 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Fri, 31 May 2024 18:11:50 +0300 Subject: [PATCH 426/469] implement `HoudiniExtractorPlugin` and use it in all extractor plugins --- .../houdini/client/ayon_houdini/api/plugin.py | 18 +++++++++++++++++- .../publish/extract_active_view_thumbnail.py | 2 +- .../plugins/publish/extract_alembic.py | 2 +- .../plugins/publish/extract_ass.py | 2 +- .../plugins/publish/extract_bgeo.py | 2 +- .../plugins/publish/extract_composite.py | 2 +- .../plugins/publish/extract_fbx.py | 2 +- .../plugins/publish/extract_hda.py | 2 +- .../plugins/publish/extract_mantra_ifd.py | 2 +- .../plugins/publish/extract_opengl.py | 2 +- .../plugins/publish/extract_redshift_proxy.py | 2 +- .../plugins/publish/extract_render.py | 2 +- .../plugins/publish/extract_usd.py | 2 +- .../plugins/publish/extract_usd_layered.py | 2 +- .../plugins/publish/extract_vdb_cache.py | 2 +- 15 files changed, 31 insertions(+), 15 deletions(-) diff --git a/server_addon/houdini/client/ayon_houdini/api/plugin.py b/server_addon/houdini/client/ayon_houdini/api/plugin.py index 22a2b40dd4..9c6bba925a 100644 --- a/server_addon/houdini/client/ayon_houdini/api/plugin.py +++ b/server_addon/houdini/client/ayon_houdini/api/plugin.py @@ -15,7 +15,8 @@ from ayon_core.pipeline import ( CreatedInstance, AYON_INSTANCE_ID, AVALON_INSTANCE_ID, - load + load, + publish ) from ayon_core.lib import BoolDef @@ -376,3 +377,18 @@ class HoudiniContextPlugin(pyblish.api.ContextPlugin): hosts = ["houdini"] settings_category = SETTINGS_CATEGORY + + +class HoudiniExtractorPlugin(publish.Extractor): + """Base class for Houdini extract plugins. + + Note: + The `HoudiniExtractorPlugin` is a subclass of `publish.Extractor`, + which in turn is a subclass of `pyblish.api.InstancePlugin`. + Should there be a requirement to create an extractor that operates + as a context plugin, it would be beneficial to incorporate + the functionalities present in `publish.Extractor`. + """ + + hosts = ["houdini"] + settings_category = SETTINGS_CATEGORY diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index ef35a505c4..c4d51c0808 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -4,7 +4,7 @@ from ayon_houdini.api import lib, plugin from ayon_houdini.api.pipeline import IS_HEADLESS -class ExtractActiveViewThumbnail(plugin.HoudiniInstancePlugin): +class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py index 4016dd05fb..e82f07284a 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_alembic.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractAlembic(plugin.HoudiniInstancePlugin): +class ExtractAlembic(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract Alembic" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py index cb450b9524..a796bbf4b3 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_ass.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractAss(plugin.HoudiniInstancePlugin): +class ExtractAss(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Ass" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py index f867bc98a8..ab8837065d 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_bgeo.py @@ -6,7 +6,7 @@ import pyblish.api from ayon_houdini.api import lib, plugin -class ExtractBGEO(plugin.HoudiniInstancePlugin): +class ExtractBGEO(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract BGEO" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py index 41e4e4bb14..cab462aef6 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_composite.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop, splitext -class ExtractComposite(plugin.HoudiniInstancePlugin, +class ExtractComposite(plugin.HoudiniExtractorPlugin, publish.ColormanagedPyblishPluginMixin): order = pyblish.api.ExtractorOrder diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py index f12ca666d8..49b3fa07ca 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_fbx.py @@ -8,7 +8,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractFBX(plugin.HoudiniInstancePlugin): +class ExtractFBX(plugin.HoudiniExtractorPlugin): label = "Extract FBX" families = ["fbx"] diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py index d93113b0a6..e4449d11f8 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_hda.py @@ -6,7 +6,7 @@ import pyblish.api from ayon_houdini.api import plugin -class ExtractHDA(plugin.HoudiniInstancePlugin): +class ExtractHDA(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract HDA" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py index fd36759aa7..b424f2e452 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_mantra_ifd.py @@ -6,7 +6,7 @@ import pyblish.api from ayon_houdini.api import plugin -class ExtractMantraIFD(plugin.HoudiniInstancePlugin): +class ExtractMantraIFD(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract Mantra ifd" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py index 8fa0cf0d25..bee1bf871f 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_opengl.py @@ -8,7 +8,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractOpenGL(plugin.HoudiniInstancePlugin, +class ExtractOpenGL(plugin.HoudiniExtractorPlugin, publish.ColormanagedPyblishPluginMixin): order = pyblish.api.ExtractorOrder - 0.01 diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py index b46f5a15a3..3e8a79df00 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_redshift_proxy.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractRedshiftProxy(plugin.HoudiniInstancePlugin): +class ExtractRedshiftProxy(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract Redshift Proxy" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py index 62ad394e73..8ff8590650 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_render.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractRender(plugin.HoudiniInstancePlugin): +class ExtractRender(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract Render" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py index c816a9a4ea..40e6211e63 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractUSD(plugin.HoudiniInstancePlugin): +class ExtractUSD(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract USD" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py index 68f0516c6e..6a377c57cf 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_usd_layered.py @@ -152,7 +152,7 @@ def parm_values(overrides): parm.set(value) -class ExtractUSDLayered(plugin.HoudiniInstancePlugin): +class ExtractUSDLayered(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract Layered USD" diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py index 4afa26036b..a944d81e9b 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_vdb_cache.py @@ -7,7 +7,7 @@ from ayon_houdini.api import plugin from ayon_houdini.api.lib import render_rop -class ExtractVDBCache(plugin.HoudiniInstancePlugin): +class ExtractVDBCache(plugin.HoudiniExtractorPlugin): order = pyblish.api.ExtractorOrder + 0.1 label = "Extract VDB Cache" From a49d2e174742e74913ac32cec354f8944e844a1d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:12:56 +0200 Subject: [PATCH 427/469] bump version --- server_addon/tvpaint/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/tvpaint/package.py b/server_addon/tvpaint/package.py index 3ab35f727e..eddb112b16 100644 --- a/server_addon/tvpaint/package.py +++ b/server_addon/tvpaint/package.py @@ -1,6 +1,6 @@ name = "tvpaint" title = "TVPaint" -version = "0.2.0" +version = "0.2.1" client_dir = "ayon_tvpaint" ayon_required_addons = { From 4d2b9b2abc38b8fe5d5031ca6c32a3e5929da8c7 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:13:06 +0200 Subject: [PATCH 428/469] added pyproject toml to client --- server_addon/tvpaint/pyproject.toml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 server_addon/tvpaint/pyproject.toml diff --git a/server_addon/tvpaint/pyproject.toml b/server_addon/tvpaint/pyproject.toml new file mode 100644 index 0000000000..46d0611d74 --- /dev/null +++ b/server_addon/tvpaint/pyproject.toml @@ -0,0 +1,6 @@ +[project] +name="tvpaint" +description="AYON TVPaint addon." + +[ayon.runtimeDependencies] +aiohttp_json_rpc = "*" From b32291fb1c48a55f34c09a1aa7109b4e05bcd150 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:13:14 +0200 Subject: [PATCH 429/469] added version to client --- server_addon/tvpaint/client/ayon_tvpaint/__init__.py | 3 +++ server_addon/tvpaint/client/ayon_tvpaint/addon.py | 3 +++ server_addon/tvpaint/client/ayon_tvpaint/version.py | 3 +++ 3 files changed, 9 insertions(+) create mode 100644 server_addon/tvpaint/client/ayon_tvpaint/version.py diff --git a/server_addon/tvpaint/client/ayon_tvpaint/__init__.py b/server_addon/tvpaint/client/ayon_tvpaint/__init__.py index b98680f204..2c4a052234 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/__init__.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( get_launch_script_path, TVPaintAddon, @@ -6,6 +7,8 @@ from .addon import ( __all__ = ( + "__version__", + "get_launch_script_path", "TVPaintAddon", "TVPAINT_ROOT_DIR", diff --git a/server_addon/tvpaint/client/ayon_tvpaint/addon.py b/server_addon/tvpaint/client/ayon_tvpaint/addon.py index 6756b274f9..c98c929a96 100644 --- a/server_addon/tvpaint/client/ayon_tvpaint/addon.py +++ b/server_addon/tvpaint/client/ayon_tvpaint/addon.py @@ -1,6 +1,8 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + TVPAINT_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -14,6 +16,7 @@ def get_launch_script_path(): class TVPaintAddon(AYONAddon, IHostAddon): name = "tvpaint" + version = __version__ host_name = "tvpaint" def add_implementation_envs(self, env, _app): diff --git a/server_addon/tvpaint/client/ayon_tvpaint/version.py b/server_addon/tvpaint/client/ayon_tvpaint/version.py new file mode 100644 index 0000000000..03419cd02e --- /dev/null +++ b/server_addon/tvpaint/client/ayon_tvpaint/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'tvpaint' version.""" +__version__ = "0.2.1" From fa3edd79c0c6a48d62759c200ab3c467029c7313 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:25:23 +0200 Subject: [PATCH 430/469] moved blender integration next to server codebase --- .../blender/client/ayon_blender}/__init__.py | 0 .../blender/client/ayon_blender}/addon.py | 0 .../blender/client/ayon_blender}/api/__init__.py | 0 .../blender/client/ayon_blender}/api/action.py | 0 .../blender/client/ayon_blender}/api/capture.py | 0 .../blender/client/ayon_blender}/api/colorspace.py | 0 .../ayon_blender}/api/icons/pyblish-32x32.png | Bin .../blender/client/ayon_blender}/api/lib.py | 0 .../blender/client/ayon_blender}/api/ops.py | 0 .../blender/client/ayon_blender}/api/pipeline.py | 0 .../blender/client/ayon_blender}/api/plugin.py | 0 .../blender/client/ayon_blender}/api/render_lib.py | 0 .../blender/client/ayon_blender}/api/workio.py | 0 .../ayon_blender}/blender_addon/startup/init.py | 0 .../hooks/pre_add_run_python_script_arg.py | 0 .../ayon_blender}/hooks/pre_pyside_install.py | 0 .../ayon_blender}/hooks/pre_windows_console.py | 0 .../ayon_blender}/plugins/create/convert_legacy.py | 0 .../ayon_blender}/plugins/create/create_action.py | 0 .../plugins/create/create_animation.py | 0 .../plugins/create/create_blendScene.py | 0 .../ayon_blender}/plugins/create/create_camera.py | 0 .../ayon_blender}/plugins/create/create_layout.py | 0 .../ayon_blender}/plugins/create/create_model.py | 0 .../plugins/create/create_pointcache.py | 0 .../ayon_blender}/plugins/create/create_render.py | 0 .../ayon_blender}/plugins/create/create_review.py | 0 .../ayon_blender}/plugins/create/create_rig.py | 0 .../ayon_blender}/plugins/create/create_usd.py | 0 .../ayon_blender}/plugins/create/create_workfile.py | 0 .../ayon_blender}/plugins/load/import_workfile.py | 0 .../ayon_blender}/plugins/load/load_action.py | 0 .../ayon_blender}/plugins/load/load_animation.py | 0 .../client/ayon_blender}/plugins/load/load_audio.py | 0 .../client/ayon_blender}/plugins/load/load_blend.py | 0 .../ayon_blender}/plugins/load/load_blendscene.py | 0 .../client/ayon_blender}/plugins/load/load_cache.py | 0 .../ayon_blender}/plugins/load/load_camera_abc.py | 0 .../ayon_blender}/plugins/load/load_camera_fbx.py | 0 .../client/ayon_blender}/plugins/load/load_fbx.py | 0 .../ayon_blender}/plugins/load/load_layout_json.py | 0 .../client/ayon_blender}/plugins/load/load_look.py | 0 .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_instance.py | 0 .../ayon_blender}/plugins/publish/collect_render.py | 0 .../ayon_blender}/plugins/publish/collect_review.py | 0 .../plugins/publish/collect_workfile.py | 0 .../ayon_blender}/plugins/publish/extract_abc.py | 0 .../plugins/publish/extract_abc_animation.py | 0 .../ayon_blender}/plugins/publish/extract_blend.py | 0 .../plugins/publish/extract_blend_animation.py | 0 .../plugins/publish/extract_camera_abc.py | 0 .../plugins/publish/extract_camera_fbx.py | 0 .../ayon_blender}/plugins/publish/extract_fbx.py | 0 .../plugins/publish/extract_fbx_animation.py | 0 .../ayon_blender}/plugins/publish/extract_layout.py | 0 .../plugins/publish/extract_playblast.py | 0 .../plugins/publish/extract_thumbnail.py | 0 .../ayon_blender}/plugins/publish/extract_usd.py | 0 .../plugins/publish/increment_workfile_version.py | 0 .../plugins/publish/integrate_animation.py | 0 .../publish/validate_camera_zero_keyframe.py | 0 .../plugins/publish/validate_deadline_publish.py | 0 .../plugins/publish/validate_file_saved.py | 0 .../plugins/publish/validate_instance_empty.py | 0 .../plugins/publish/validate_mesh_has_uv.py | 0 .../publish/validate_mesh_no_negative_scale.py | 0 .../plugins/publish/validate_model_uv_map1.py | 0 .../plugins/publish/validate_no_colons_in_name.py | 0 .../plugins/publish/validate_object_mode.py | 0 .../publish/validate_render_camera_is_set.py | 0 .../plugins/publish/validate_transform_zero.py | 0 72 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/__init__.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/addon.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/__init__.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/action.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/capture.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/colorspace.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/icons/pyblish-32x32.png (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/lib.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/ops.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/pipeline.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/plugin.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/render_lib.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/api/workio.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/blender_addon/startup/init.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/hooks/pre_add_run_python_script_arg.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/hooks/pre_pyside_install.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/hooks/pre_windows_console.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/convert_legacy.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_action.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_blendScene.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_camera.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_layout.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_model.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_pointcache.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_render.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_review.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_rig.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_usd.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/import_workfile.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_action.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_audio.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_blend.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_blendscene.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_cache.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_camera_abc.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_camera_fbx.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_fbx.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_layout_json.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/load/load_look.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/collect_instance.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/collect_render.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/collect_review.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_abc.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_abc_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_blend.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_blend_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_camera_abc.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_camera_fbx.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_fbx.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_fbx_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_layout.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_playblast.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_thumbnail.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/extract_usd.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/increment_workfile_version.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/integrate_animation.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_camera_zero_keyframe.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_deadline_publish.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_file_saved.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_instance_empty.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_mesh_has_uv.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_mesh_no_negative_scale.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_model_uv_map1.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_no_colons_in_name.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_object_mode.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_render_camera_is_set.py (100%) rename {client/ayon_core/hosts/blender => server_addon/blender/client/ayon_blender}/plugins/publish/validate_transform_zero.py (100%) diff --git a/client/ayon_core/hosts/blender/__init__.py b/server_addon/blender/client/ayon_blender/__init__.py similarity index 100% rename from client/ayon_core/hosts/blender/__init__.py rename to server_addon/blender/client/ayon_blender/__init__.py diff --git a/client/ayon_core/hosts/blender/addon.py b/server_addon/blender/client/ayon_blender/addon.py similarity index 100% rename from client/ayon_core/hosts/blender/addon.py rename to server_addon/blender/client/ayon_blender/addon.py diff --git a/client/ayon_core/hosts/blender/api/__init__.py b/server_addon/blender/client/ayon_blender/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/blender/api/__init__.py rename to server_addon/blender/client/ayon_blender/api/__init__.py diff --git a/client/ayon_core/hosts/blender/api/action.py b/server_addon/blender/client/ayon_blender/api/action.py similarity index 100% rename from client/ayon_core/hosts/blender/api/action.py rename to server_addon/blender/client/ayon_blender/api/action.py diff --git a/client/ayon_core/hosts/blender/api/capture.py b/server_addon/blender/client/ayon_blender/api/capture.py similarity index 100% rename from client/ayon_core/hosts/blender/api/capture.py rename to server_addon/blender/client/ayon_blender/api/capture.py diff --git a/client/ayon_core/hosts/blender/api/colorspace.py b/server_addon/blender/client/ayon_blender/api/colorspace.py similarity index 100% rename from client/ayon_core/hosts/blender/api/colorspace.py rename to server_addon/blender/client/ayon_blender/api/colorspace.py diff --git a/client/ayon_core/hosts/blender/api/icons/pyblish-32x32.png b/server_addon/blender/client/ayon_blender/api/icons/pyblish-32x32.png similarity index 100% rename from client/ayon_core/hosts/blender/api/icons/pyblish-32x32.png rename to server_addon/blender/client/ayon_blender/api/icons/pyblish-32x32.png diff --git a/client/ayon_core/hosts/blender/api/lib.py b/server_addon/blender/client/ayon_blender/api/lib.py similarity index 100% rename from client/ayon_core/hosts/blender/api/lib.py rename to server_addon/blender/client/ayon_blender/api/lib.py diff --git a/client/ayon_core/hosts/blender/api/ops.py b/server_addon/blender/client/ayon_blender/api/ops.py similarity index 100% rename from client/ayon_core/hosts/blender/api/ops.py rename to server_addon/blender/client/ayon_blender/api/ops.py diff --git a/client/ayon_core/hosts/blender/api/pipeline.py b/server_addon/blender/client/ayon_blender/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/blender/api/pipeline.py rename to server_addon/blender/client/ayon_blender/api/pipeline.py diff --git a/client/ayon_core/hosts/blender/api/plugin.py b/server_addon/blender/client/ayon_blender/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/blender/api/plugin.py rename to server_addon/blender/client/ayon_blender/api/plugin.py diff --git a/client/ayon_core/hosts/blender/api/render_lib.py b/server_addon/blender/client/ayon_blender/api/render_lib.py similarity index 100% rename from client/ayon_core/hosts/blender/api/render_lib.py rename to server_addon/blender/client/ayon_blender/api/render_lib.py diff --git a/client/ayon_core/hosts/blender/api/workio.py b/server_addon/blender/client/ayon_blender/api/workio.py similarity index 100% rename from client/ayon_core/hosts/blender/api/workio.py rename to server_addon/blender/client/ayon_blender/api/workio.py diff --git a/client/ayon_core/hosts/blender/blender_addon/startup/init.py b/server_addon/blender/client/ayon_blender/blender_addon/startup/init.py similarity index 100% rename from client/ayon_core/hosts/blender/blender_addon/startup/init.py rename to server_addon/blender/client/ayon_blender/blender_addon/startup/init.py diff --git a/client/ayon_core/hosts/blender/hooks/pre_add_run_python_script_arg.py b/server_addon/blender/client/ayon_blender/hooks/pre_add_run_python_script_arg.py similarity index 100% rename from client/ayon_core/hosts/blender/hooks/pre_add_run_python_script_arg.py rename to server_addon/blender/client/ayon_blender/hooks/pre_add_run_python_script_arg.py diff --git a/client/ayon_core/hosts/blender/hooks/pre_pyside_install.py b/server_addon/blender/client/ayon_blender/hooks/pre_pyside_install.py similarity index 100% rename from client/ayon_core/hosts/blender/hooks/pre_pyside_install.py rename to server_addon/blender/client/ayon_blender/hooks/pre_pyside_install.py diff --git a/client/ayon_core/hosts/blender/hooks/pre_windows_console.py b/server_addon/blender/client/ayon_blender/hooks/pre_windows_console.py similarity index 100% rename from client/ayon_core/hosts/blender/hooks/pre_windows_console.py rename to server_addon/blender/client/ayon_blender/hooks/pre_windows_console.py diff --git a/client/ayon_core/hosts/blender/plugins/create/convert_legacy.py b/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/convert_legacy.py rename to server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_action.py b/server_addon/blender/client/ayon_blender/plugins/create/create_action.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_action.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_action.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_animation.py b/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_animation.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_blendScene.py b/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_blendScene.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_camera.py b/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_camera.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_camera.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_layout.py b/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_layout.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_layout.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_model.py b/server_addon/blender/client/ayon_blender/plugins/create/create_model.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_model.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_model.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_pointcache.py b/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_pointcache.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_render.py b/server_addon/blender/client/ayon_blender/plugins/create/create_render.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_render.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_render.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_review.py b/server_addon/blender/client/ayon_blender/plugins/create/create_review.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_review.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_review.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_rig.py b/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_rig.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_rig.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_usd.py b/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_usd.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_usd.py diff --git a/client/ayon_core/hosts/blender/plugins/create/create_workfile.py b/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/create/create_workfile.py rename to server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/blender/plugins/load/import_workfile.py b/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/import_workfile.py rename to server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_action.py b/server_addon/blender/client/ayon_blender/plugins/load/load_action.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_action.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_action.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_animation.py b/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_animation.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_audio.py b/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_audio.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_audio.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_blend.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_blend.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_blend.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_blendscene.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_blendscene.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_cache.py b/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_cache.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_cache.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_camera_abc.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_camera_fbx.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_fbx.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_layout_json.py b/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_layout_json.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py diff --git a/client/ayon_core/hosts/blender/plugins/load/load_look.py b/server_addon/blender/client/ayon_blender/plugins/load/load_look.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/load/load_look.py rename to server_addon/blender/client/ayon_blender/plugins/load/load_look.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_current_file.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/collect_current_file.py rename to server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_instance.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/collect_instance.py rename to server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_render.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/collect_render.py rename to server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_review.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/collect_review.py rename to server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/collect_workfile.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/collect_workfile.py rename to server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_abc.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_abc_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_abc_animation.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_blend.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_blend.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_blend_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_blend_animation.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_camera_abc.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_camera_fbx.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_fbx.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_fbx_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_fbx_animation.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_layout.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_layout.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_playblast.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_playblast.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_thumbnail.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_thumbnail.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/extract_usd.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/extract_usd.py rename to server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/increment_workfile_version.py b/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/increment_workfile_version.py rename to server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/integrate_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/integrate_animation.py rename to server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_camera_zero_keyframe.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_camera_zero_keyframe.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_deadline_publish.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_deadline_publish.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_file_saved.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_file_saved.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_instance_empty.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_instance_empty.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_mesh_has_uv.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_mesh_has_uv.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_mesh_no_negative_scale.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_model_uv_map1.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_model_uv_map1.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_no_colons_in_name.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_no_colons_in_name.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_object_mode.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_object_mode.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_render_camera_is_set.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_render_camera_is_set.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py diff --git a/client/ayon_core/hosts/blender/plugins/publish/validate_transform_zero.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py similarity index 100% rename from client/ayon_core/hosts/blender/plugins/publish/validate_transform_zero.py rename to server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py From 5ef9b5d17c2ebaa527b635e480a02da7fbe9d1c0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:28:03 +0200 Subject: [PATCH 431/469] fix imports --- server_addon/blender/client/ayon_blender/addon.py | 6 +++--- .../blender/client/ayon_blender/api/pipeline.py | 13 ++++++------- .../blender/client/ayon_blender/api/plugin.py | 2 +- .../ayon_blender/blender_addon/startup/init.py | 2 +- .../ayon_blender/plugins/create/convert_legacy.py | 2 +- .../ayon_blender/plugins/create/create_action.py | 2 +- .../ayon_blender/plugins/create/create_animation.py | 2 +- .../plugins/create/create_blendScene.py | 2 +- .../ayon_blender/plugins/create/create_camera.py | 4 ++-- .../ayon_blender/plugins/create/create_layout.py | 2 +- .../ayon_blender/plugins/create/create_model.py | 2 +- .../plugins/create/create_pointcache.py | 2 +- .../ayon_blender/plugins/create/create_render.py | 6 +++--- .../ayon_blender/plugins/create/create_review.py | 2 +- .../ayon_blender/plugins/create/create_rig.py | 2 +- .../ayon_blender/plugins/create/create_usd.py | 2 +- .../ayon_blender/plugins/create/create_workfile.py | 4 ++-- .../ayon_blender/plugins/load/import_workfile.py | 2 +- .../client/ayon_blender/plugins/load/load_action.py | 4 ++-- .../ayon_blender/plugins/load/load_animation.py | 4 ++-- .../client/ayon_blender/plugins/load/load_audio.py | 4 ++-- .../client/ayon_blender/plugins/load/load_blend.py | 6 +++--- .../ayon_blender/plugins/load/load_blendscene.py | 6 +++--- .../client/ayon_blender/plugins/load/load_cache.py | 4 ++-- .../ayon_blender/plugins/load/load_camera_abc.py | 4 ++-- .../ayon_blender/plugins/load/load_camera_fbx.py | 4 ++-- .../client/ayon_blender/plugins/load/load_fbx.py | 4 ++-- .../ayon_blender/plugins/load/load_layout_json.py | 4 ++-- .../client/ayon_blender/plugins/load/load_look.py | 4 ++-- .../plugins/publish/collect_current_file.py | 2 +- .../plugins/publish/collect_instance.py | 2 +- .../ayon_blender/plugins/publish/collect_render.py | 2 +- .../ayon_blender/plugins/publish/extract_abc.py | 2 +- .../plugins/publish/extract_abc_animation.py | 2 +- .../plugins/publish/extract_camera_abc.py | 2 +- .../plugins/publish/extract_camera_fbx.py | 2 +- .../ayon_blender/plugins/publish/extract_fbx.py | 2 +- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../ayon_blender/plugins/publish/extract_layout.py | 4 ++-- .../plugins/publish/extract_playblast.py | 4 ++-- .../plugins/publish/extract_thumbnail.py | 4 ++-- .../ayon_blender/plugins/publish/extract_usd.py | 2 +- .../plugins/publish/increment_workfile_version.py | 2 +- .../publish/validate_camera_zero_keyframe.py | 4 ++-- .../plugins/publish/validate_deadline_publish.py | 2 +- .../plugins/publish/validate_mesh_has_uv.py | 4 ++-- .../publish/validate_mesh_no_negative_scale.py | 4 ++-- .../plugins/publish/validate_model_uv_map1.py | 4 ++-- .../plugins/publish/validate_no_colons_in_name.py | 4 ++-- .../plugins/publish/validate_object_mode.py | 4 ++-- .../plugins/publish/validate_transform_zero.py | 6 +++--- 51 files changed, 87 insertions(+), 88 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/addon.py b/server_addon/blender/client/ayon_blender/addon.py index 6a4b325365..d9a20e8dab 100644 --- a/server_addon/blender/client/ayon_blender/addon.py +++ b/server_addon/blender/client/ayon_blender/addon.py @@ -1,7 +1,7 @@ import os from ayon_core.addon import AYONAddon, IHostAddon -BLENDER_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +BLENDER_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class BlenderAddon(AYONAddon, IHostAddon): @@ -12,7 +12,7 @@ class BlenderAddon(AYONAddon, IHostAddon): """Modify environments to contain all required for implementation.""" # Prepare path to implementation script implementation_user_script_path = os.path.join( - BLENDER_ROOT_DIR, + BLENDER_ADDON_ROOT, "blender_addon" ) @@ -61,7 +61,7 @@ class BlenderAddon(AYONAddon, IHostAddon): if app.host_name != self.host_name: return [] return [ - os.path.join(BLENDER_ROOT_DIR, "hooks") + os.path.join(BLENDER_ADDON_ROOT, "hooks") ] def get_workfile_extensions(self): diff --git a/server_addon/blender/client/ayon_blender/api/pipeline.py b/server_addon/blender/client/ayon_blender/api/pipeline.py index 84e78d0883..d2ff129a48 100644 --- a/server_addon/blender/client/ayon_blender/api/pipeline.py +++ b/server_addon/blender/client/ayon_blender/api/pipeline.py @@ -5,9 +5,6 @@ from typing import Callable, Dict, Iterator, List, Optional import bpy -from . import lib -from . import ops - import pyblish.api import ayon_api @@ -33,8 +30,12 @@ from ayon_core.lib import ( register_event_callback, emit_event ) -import ayon_core.hosts.blender from ayon_core.settings import get_project_settings +from ayon_blender import BLENDER_ADDON_ROOT + +from . import lib +from . import ops + from .workio import ( open_file, save_file, @@ -44,9 +45,7 @@ from .workio import ( work_root, ) - -HOST_DIR = os.path.dirname(os.path.abspath(ayon_core.hosts.blender.__file__)) -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(BLENDER_ADDON_ROOT, "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") diff --git a/server_addon/blender/client/ayon_blender/api/plugin.py b/server_addon/blender/client/ayon_blender/api/plugin.py index e00e127f70..2d82a6857f 100644 --- a/server_addon/blender/client/ayon_blender/api/plugin.py +++ b/server_addon/blender/client/ayon_blender/api/plugin.py @@ -496,7 +496,7 @@ class AssetLoader(LoaderPlugin): # Only containerise if it's not already a collection from a .blend file. # representation = context["representation"]["name"] # if representation != "blend": - # from ayon_core.hosts.blender.api.pipeline import containerise + # from ayon_blender.api.pipeline import containerise # return containerise( # name=name, # namespace=namespace, diff --git a/server_addon/blender/client/ayon_blender/blender_addon/startup/init.py b/server_addon/blender/client/ayon_blender/blender_addon/startup/init.py index 816f30f73f..bd0d52627c 100644 --- a/server_addon/blender/client/ayon_blender/blender_addon/startup/init.py +++ b/server_addon/blender/client/ayon_blender/blender_addon/startup/init.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import install_host -from ayon_core.hosts.blender.api import BlenderHost +from ayon_blender.api import BlenderHost def register(): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py b/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py index 613574eee0..c51e58dbcb 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Converter for legacy Houdini products.""" from ayon_core.pipeline.create.creator_plugins import ProductConvertorPlugin -from ayon_core.hosts.blender.api.lib import imprint +from ayon_blender.api.lib import imprint class BlenderLegacyConvertor(ProductConvertorPlugin): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_action.py b/server_addon/blender/client/ayon_blender/plugins/create/create_action.py index 070b9843c3..90e351e877 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_action.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_action.py @@ -2,7 +2,7 @@ import bpy -from ayon_core.hosts.blender.api import lib, plugin +from ayon_blender.api import lib, plugin class CreateAction(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py b/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py index b806a5a7ca..89d836ec0d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py @@ -1,6 +1,6 @@ """Create an animation asset.""" -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateAnimation(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py b/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py index 51250bf18b..66ac812b6b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py @@ -2,7 +2,7 @@ import bpy -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateBlendScene(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py b/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py index cd82bec236..3780344abc 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py @@ -2,8 +2,8 @@ import bpy -from ayon_core.hosts.blender.api import plugin, lib -from ayon_core.hosts.blender.api.pipeline import AVALON_INSTANCES +from ayon_blender.api import plugin, lib +from ayon_blender.api.pipeline import AVALON_INSTANCES class CreateCamera(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py b/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py index 289c39fc38..c781b8a683 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py @@ -2,7 +2,7 @@ import bpy -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateLayout(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_model.py b/server_addon/blender/client/ayon_blender/plugins/create/create_model.py index 837ba47417..b55fd5e76b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_model.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_model.py @@ -2,7 +2,7 @@ import bpy -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateModel(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py b/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py index 0aa2d62c17..4aa088da5c 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py @@ -1,6 +1,6 @@ """Create a pointcache asset.""" -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreatePointcache(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_render.py b/server_addon/blender/client/ayon_blender/plugins/create/create_render.py index bf3d1e62b3..6b6ebbce0a 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_render.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_render.py @@ -2,9 +2,9 @@ import bpy from ayon_core.lib import version_up -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.render_lib import prepare_rendering -from ayon_core.hosts.blender.api.workio import save_file +from ayon_blender.api import plugin +from ayon_blender.api.render_lib import prepare_rendering +from ayon_blender.api.workio import save_file class CreateRenderlayer(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_review.py b/server_addon/blender/client/ayon_blender/plugins/create/create_review.py index b478ec59f4..d28ee596d3 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_review.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_review.py @@ -1,6 +1,6 @@ """Create review.""" -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateReview(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py b/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py index 10b6b20d36..36307c0a34 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py @@ -2,7 +2,7 @@ import bpy -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateRig(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py b/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py index 2c2d0c46c6..a893b6bdaa 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py @@ -1,6 +1,6 @@ """Create a USD Export.""" -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CreateUSD(plugin.BaseCreator): diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py b/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py index 296a03e317..ae4e7d033a 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py @@ -2,8 +2,8 @@ import bpy import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.blender.api.plugin import BaseCreator -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api.plugin import BaseCreator +from ayon_blender.api.pipeline import ( AVALON_PROPERTY, AVALON_CONTAINERS ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py b/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py index d2e58c7752..e690980b6a 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py @@ -1,6 +1,6 @@ import bpy -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin def append_workfile(context, fname, do_import): diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_action.py b/server_addon/blender/client/ayon_blender/plugins/load/load_action.py index 8135df042a..2ea77785fb 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_action.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_action.py @@ -7,8 +7,8 @@ from typing import Dict, List, Optional import bpy from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import ( containerise_existing, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py b/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py index c9f3b33a6f..1367cab175 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py @@ -4,8 +4,8 @@ from typing import Dict, List, Optional import bpy -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import AVALON_PROPERTY class BlendAnimationLoader(plugin.AssetLoader): diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py b/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py index 3d2f412e2b..62f585363c 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py @@ -10,8 +10,8 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py index f9377d615c..026afe6244 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py @@ -9,9 +9,9 @@ from ayon_core.pipeline import ( registered_host ) from ayon_core.pipeline.create import CreateContext -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.lib import imprint -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin +from ayon_blender.api.lib import imprint +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py index f91d828d83..9e0de26a8b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py @@ -7,9 +7,9 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.lib import imprint -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin +from ayon_blender.api.lib import imprint +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py b/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py index 30c847f89d..570f5086f2 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py @@ -11,11 +11,11 @@ from ayon_core.pipeline import ( AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class CacheModelLoader(plugin.AssetLoader): diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py index a49bb40d9a..6df035994b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py @@ -10,8 +10,8 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api import plugin, lib -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin, lib +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py index a510d42850..a9a9fcbeb3 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py @@ -10,8 +10,8 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api import plugin, lib -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin, lib +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py index e323d49dea..9959a04ab5 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py @@ -10,8 +10,8 @@ from ayon_core.pipeline import ( get_representation_path, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api import plugin, lib -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin, lib +from ayon_blender.api.pipeline import ( AVALON_CONTAINERS, AVALON_PROPERTY, ) diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py b/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py index d20eaad9fc..93a8543f2e 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py @@ -15,12 +15,12 @@ from ayon_core.pipeline import ( loaders_from_representation, AVALON_CONTAINER_ID, ) -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api.pipeline import ( AVALON_INSTANCES, AVALON_CONTAINERS, AVALON_PROPERTY, ) -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class JsonLayoutLoader(plugin.AssetLoader): diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_look.py b/server_addon/blender/client/ayon_blender/plugins/load/load_look.py index 75401f94ec..01e90b317d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_look.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_look.py @@ -9,8 +9,8 @@ import json import bpy from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import ( +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import ( containerise_existing, AVALON_PROPERTY ) diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py index 7370f6cbe8..e22bfa8e61 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py @@ -1,5 +1,5 @@ import pyblish.api -from ayon_core.hosts.blender.api import workio +from ayon_blender.api import workio class CollectBlenderCurrentFile(pyblish.api.ContextPlugin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py index 314ffd368a..73ae1c941e 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py @@ -3,7 +3,7 @@ import bpy import pyblish.api from ayon_core.pipeline.publish import KnownPublishError -from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY +from ayon_blender.api.pipeline import AVALON_PROPERTY class CollectBlenderInstanceData(pyblish.api.InstancePlugin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py index 1ad2de2b7d..917039b3f6 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py @@ -6,7 +6,7 @@ import re import bpy -from ayon_core.hosts.blender.api import colorspace +from ayon_blender.api import colorspace import pyblish.api diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py index 6590be515c..84327b9cf7 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py @@ -4,7 +4,7 @@ import bpy from ayon_core.lib import BoolDef from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class ExtractABC(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py index f33af13282..78555b99f8 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py @@ -3,7 +3,7 @@ import os import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class ExtractAnimationABC( diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py index c60c92dee1..ee02491f3f 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py @@ -3,7 +3,7 @@ import os import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class ExtractCameraABC(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py index bcaf9ebc44..acaeb0fae7 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py @@ -3,7 +3,7 @@ import os import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class ExtractCamera(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py index e6367dbc0d..fde4877014 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py @@ -3,7 +3,7 @@ import os import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin +from ayon_blender.api import plugin class ExtractFBX(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py index ae02909152..c825718b7c 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py @@ -6,8 +6,8 @@ import bpy_extras import bpy_extras.anim_utils from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import AVALON_PROPERTY def get_all_parents(obj): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py index 0679483dd5..9d1073691b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py @@ -8,8 +8,8 @@ import bpy_extras.anim_utils from ayon_api import get_representations from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin -from ayon_core.hosts.blender.api.pipeline import AVALON_PROPERTY +from ayon_blender.api import plugin +from ayon_blender.api.pipeline import AVALON_PROPERTY class ExtractLayout(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py index ce6f40f967..deb950acb7 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py @@ -7,8 +7,8 @@ import pyblish.api import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import capture -from ayon_core.hosts.blender.api.lib import maintained_time +from ayon_blender.api import capture +from ayon_blender.api.lib import maintained_time class ExtractPlayblast(publish.Extractor, publish.OptionalPyblishPluginMixin): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py index 4330c57d99..8c569de5fd 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py @@ -4,8 +4,8 @@ import json import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import capture -from ayon_core.hosts.blender.api.lib import maintained_time +from ayon_blender.api import capture +from ayon_blender.api.lib import maintained_time import bpy diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py index 1d4fa3d7ac..3d62e4bb90 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py @@ -3,7 +3,7 @@ import os import bpy from ayon_core.pipeline import publish -from ayon_core.hosts.blender.api import plugin, lib +from ayon_blender.api import plugin, lib class ExtractUSD(publish.Extractor): diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py b/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py index b6e0ea3e19..4af5a726a5 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py @@ -1,6 +1,6 @@ import pyblish.api from ayon_core.pipeline.publish import OptionalPyblishPluginMixin -from ayon_core.hosts.blender.api.workio import save_file +from ayon_blender.api.workio import save_file class IncrementWorkfileVersion( diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py index cce95e9cf9..aafae315d0 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py @@ -4,7 +4,7 @@ import bpy import pyblish.api -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -25,7 +25,7 @@ class ValidateCameraZeroKeyframe(pyblish.api.InstancePlugin, hosts = ["blender"] families = ["camera"] label = "Zero Keyframe" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction] + actions = [ayon_blender.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance) -> List: diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py index a86e73ba81..099e909dc7 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.blender.api.render_lib import prepare_rendering +from ayon_blender.api.render_lib import prepare_rendering class ValidateDeadlinePublish(pyblish.api.InstancePlugin, diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py index 9871dfeb4e..8f5f5aede8 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action class ValidateMeshHasUvs( @@ -22,7 +22,7 @@ class ValidateMeshHasUvs( hosts = ["blender"] families = ["model"] label = "Mesh Has UVs" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction] + actions = [ayon_blender.api.action.SelectInvalidAction] optional = True @staticmethod diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py index fb16bb7f8d..de81400bda 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py @@ -9,7 +9,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, @@ -20,7 +20,7 @@ class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, hosts = ["blender"] families = ["model"] label = "Mesh No Negative Scale" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction] + actions = [ayon_blender.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance) -> List: diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py index 752bc5fa58..fa2ff377da 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py @@ -11,7 +11,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction ) -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action class ValidateModelMeshUvMap1( @@ -27,7 +27,7 @@ class ValidateModelMeshUvMap1( hosts = ["blender"] families = ["model"] label = "Mesh UVs named map1" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction, + actions = [ayon_blender.api.action.SelectInvalidAction, RepairAction] optional = True enabled = False diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py index 5620946f1e..14fdba2996 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py @@ -4,7 +4,7 @@ import bpy import pyblish.api -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -25,7 +25,7 @@ class ValidateNoColonsInName(pyblish.api.InstancePlugin, hosts = ["blender"] families = ["model", "rig"] label = "No Colons in names" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction] + actions = [ayon_blender.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance) -> List: diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py index d215ffc1be..3832275560 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -import ayon_core.hosts.blender.api.action +import ayon_blender.api.action class ValidateObjectIsInObjectMode( @@ -20,7 +20,7 @@ class ValidateObjectIsInObjectMode( hosts = ["blender"] families = ["model", "rig", "layout"] label = "Validate Object Mode" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction] + actions = [ayon_blender.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py index 465ec15d7b..21e3467ab1 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py @@ -6,8 +6,8 @@ import bpy import pyblish.api -from ayon_core.hosts.blender.api import plugin, lib -import ayon_core.hosts.blender.api.action +from ayon_blender.api import plugin, lib +import ayon_blender.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -24,7 +24,7 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, hosts = ["blender"] families = ["model"] label = "Transform Zero" - actions = [ayon_core.hosts.blender.api.action.SelectInvalidAction, + actions = [ayon_blender.api.action.SelectInvalidAction, RepairAction] _identity = mathutils.Matrix() From 18667e202ecf9d547de8ff8bab85cead267f4b88 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:38:18 +0200 Subject: [PATCH 432/469] remove unused class 'Loader' --- server_addon/blender/client/ayon_blender/api/__init__.py | 2 -- server_addon/blender/client/ayon_blender/api/plugin.py | 6 ------ 2 files changed, 8 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/api/__init__.py b/server_addon/blender/client/ayon_blender/api/__init__.py index ce2b444997..da2a6fbbbb 100644 --- a/server_addon/blender/client/ayon_blender/api/__init__.py +++ b/server_addon/blender/client/ayon_blender/api/__init__.py @@ -15,7 +15,6 @@ from .pipeline import ( from .plugin import ( Creator, - Loader, ) from .workio import ( @@ -51,7 +50,6 @@ __all__ = [ "BlenderHost", "Creator", - "Loader", # Workfiles API "open_file", diff --git a/server_addon/blender/client/ayon_blender/api/plugin.py b/server_addon/blender/client/ayon_blender/api/plugin.py index 2d82a6857f..31a78d6149 100644 --- a/server_addon/blender/client/ayon_blender/api/plugin.py +++ b/server_addon/blender/client/ayon_blender/api/plugin.py @@ -376,12 +376,6 @@ class BaseCreator(Creator): ] -class Loader(LoaderPlugin): - """Base class for Loader plug-ins.""" - - hosts = ["blender"] - - class AssetLoader(LoaderPlugin): """A basic AssetLoader for Blender From 0e67a3ed39167e0a8a0eadddd069225e494c5d1d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:52:37 +0200 Subject: [PATCH 433/469] added settings category --- .../blender/client/ayon_blender/api/plugin.py | 16 ++++++++++++++++ .../plugins/publish/collect_current_file.py | 4 ++-- .../plugins/publish/collect_instance.py | 3 ++- .../plugins/publish/collect_render.py | 6 +++--- .../plugins/publish/collect_review.py | 4 ++-- .../plugins/publish/collect_workfile.py | 5 +++-- .../ayon_blender/plugins/publish/extract_abc.py | 2 +- .../plugins/publish/extract_abc_animation.py | 4 ++-- .../plugins/publish/extract_blend.py | 5 ++++- .../plugins/publish/extract_blend_animation.py | 5 +++-- .../plugins/publish/extract_camera_abc.py | 4 +++- .../plugins/publish/extract_camera_fbx.py | 4 +++- .../ayon_blender/plugins/publish/extract_fbx.py | 4 +++- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../plugins/publish/extract_layout.py | 4 +++- .../plugins/publish/extract_playblast.py | 6 ++++-- .../plugins/publish/extract_thumbnail.py | 5 ++--- .../ayon_blender/plugins/publish/extract_usd.py | 6 +++--- .../publish/increment_workfile_version.py | 5 +++-- .../plugins/publish/integrate_animation.py | 5 +++-- .../publish/validate_camera_zero_keyframe.py | 9 +++++---- .../plugins/publish/validate_deadline_publish.py | 8 +++++--- .../plugins/publish/validate_file_saved.py | 7 +++++-- .../plugins/publish/validate_instance_empty.py | 3 ++- .../plugins/publish/validate_mesh_has_uv.py | 7 +++---- .../publish/validate_mesh_no_negative_scale.py | 9 +++++---- .../plugins/publish/validate_model_uv_map1.py | 5 +++-- .../publish/validate_no_colons_in_name.py | 9 +++++---- .../plugins/publish/validate_object_mode.py | 5 +++-- .../publish/validate_render_camera_is_set.py | 7 +++++-- .../plugins/publish/validate_transform_zero.py | 8 ++++---- 31 files changed, 112 insertions(+), 66 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/api/plugin.py b/server_addon/blender/client/ayon_blender/api/plugin.py index 31a78d6149..f4266bc3a2 100644 --- a/server_addon/blender/client/ayon_blender/api/plugin.py +++ b/server_addon/blender/client/ayon_blender/api/plugin.py @@ -4,6 +4,7 @@ import itertools from pathlib import Path from typing import Dict, List, Optional +import pyblish.api import bpy from ayon_core.pipeline import ( @@ -13,6 +14,7 @@ from ayon_core.pipeline import ( AVALON_INSTANCE_ID, AYON_INSTANCE_ID, ) +from ayon_core.pipeline.publish import Extractor from ayon_core.lib import BoolDef from .pipeline import ( @@ -161,10 +163,23 @@ def deselect_all(): bpy.context.view_layer.objects.active = active +class BlenderInstancePlugin(pyblish.api.InstancePlugin): + settings_category = "blender" + + +class BlenderContextPlugin(pyblish.api.ContextPlugin): + settings_category = "blender" + + +class BlenderExtractor(Extractor): + settings_category = "blender" + + class BaseCreator(Creator): """Base class for Blender Creator plug-ins.""" defaults = ['Main'] + settings_category = "blender" create_as_asset_group = False @staticmethod @@ -386,6 +401,7 @@ class AssetLoader(LoaderPlugin): it's different for different types (e.g. model, rig, animation, etc.). """ + settings_category = "blender" @staticmethod def _get_instance_empty(instance_name: str, nodes: List) -> Optional[bpy.types.Object]: diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py index e22bfa8e61..6568372169 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_current_file.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_blender.api import workio +from ayon_blender.api import workio, plugin -class CollectBlenderCurrentFile(pyblish.api.ContextPlugin): +class CollectBlenderCurrentFile(plugin.BlenderContextPlugin): """Inject the current working file into context""" order = pyblish.api.CollectorOrder - 0.5 diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py index 73ae1c941e..7d6f841ba3 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_instance.py @@ -3,10 +3,11 @@ import bpy import pyblish.api from ayon_core.pipeline.publish import KnownPublishError +from ayon_blender.api import plugin from ayon_blender.api.pipeline import AVALON_PROPERTY -class CollectBlenderInstanceData(pyblish.api.InstancePlugin): +class CollectBlenderInstanceData(plugin.BlenderInstancePlugin): """Validator to verify that the instance is not empty""" order = pyblish.api.CollectorOrder diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py index 917039b3f6..ac5dc5bf6f 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_render.py @@ -5,12 +5,12 @@ import os import re import bpy - -from ayon_blender.api import colorspace import pyblish.api +from ayon_blender.api import colorspace, plugin -class CollectBlenderRender(pyblish.api.InstancePlugin): + +class CollectBlenderRender(plugin.BlenderInstancePlugin): """Gather all publishable render instances.""" order = pyblish.api.CollectorOrder + 0.01 diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py index 2c077398da..c013910b5a 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_review.py @@ -1,9 +1,9 @@ import bpy - import pyblish.api +from ayon_blender.api import plugin -class CollectReview(pyblish.api.InstancePlugin): +class CollectReview(plugin.BlenderInstancePlugin): """Collect Review data """ diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py b/server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py index 6561c89605..347a5caf01 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/collect_workfile.py @@ -1,9 +1,10 @@ from pathlib import Path -from pyblish.api import InstancePlugin, CollectorOrder +from pyblish.api import CollectorOrder +from ayon_blender.api import plugin -class CollectWorkfile(InstancePlugin): +class CollectWorkfile(plugin.BlenderInstancePlugin): """Inject workfile data into its instance.""" order = CollectorOrder diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py index 84327b9cf7..5da0258586 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc.py @@ -7,7 +7,7 @@ from ayon_core.pipeline import publish from ayon_blender.api import plugin -class ExtractABC(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractABC(plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin): """Extract as ABC.""" label = "Extract ABC" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py index 78555b99f8..503593c8d3 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_abc_animation.py @@ -7,8 +7,8 @@ from ayon_blender.api import plugin class ExtractAnimationABC( - publish.Extractor, - publish.OptionalPyblishPluginMixin, + plugin.BlenderExtractor, + publish.OptionalPyblishPluginMixin, ): """Extract as ABC.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py index 19fe9c6271..520bc274a1 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend.py @@ -3,9 +3,12 @@ import os import bpy from ayon_core.pipeline import publish +from ayon_blender.api import plugin -class ExtractBlend(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractBlend( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """Extract a blend file.""" label = "Extract Blend" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py index 315fbb19af..cca8ab2dd6 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_blend_animation.py @@ -3,11 +3,12 @@ import os import bpy from ayon_core.pipeline import publish +from ayon_blender.api import plugin class ExtractBlendAnimation( - publish.Extractor, - publish.OptionalPyblishPluginMixin, + plugin.BlenderExtractor, + publish.OptionalPyblishPluginMixin, ): """Extract a blend file.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py index ee02491f3f..278cd293c5 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_abc.py @@ -6,7 +6,9 @@ from ayon_core.pipeline import publish from ayon_blender.api import plugin -class ExtractCameraABC(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractCameraABC( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """Extract camera as ABC.""" label = "Extract Camera (ABC)" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py index acaeb0fae7..9094355a72 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_camera_fbx.py @@ -6,7 +6,9 @@ from ayon_core.pipeline import publish from ayon_blender.api import plugin -class ExtractCamera(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractCamera( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """Extract as the camera as FBX.""" label = "Extract Camera (FBX)" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py index fde4877014..085f7b18c3 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx.py @@ -6,7 +6,9 @@ from ayon_core.pipeline import publish from ayon_blender.api import plugin -class ExtractFBX(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractFBX( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """Extract as FBX.""" label = "Extract FBX" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py index c825718b7c..7f49e919db 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_fbx_animation.py @@ -42,8 +42,8 @@ def get_highest_root(objects): class ExtractAnimationFBX( - publish.Extractor, - publish.OptionalPyblishPluginMixin, + plugin.BlenderExtractor, + publish.OptionalPyblishPluginMixin, ): """Extract as animation.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py index 9d1073691b..0732d29c9d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_layout.py @@ -12,7 +12,9 @@ from ayon_blender.api import plugin from ayon_blender.api.pipeline import AVALON_PROPERTY -class ExtractLayout(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractLayout( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """Extract a layout.""" label = "Extract Layout (JSON)" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py index deb950acb7..0f769c296d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_playblast.py @@ -7,11 +7,13 @@ import pyblish.api import bpy from ayon_core.pipeline import publish -from ayon_blender.api import capture +from ayon_blender.api import capture, plugin from ayon_blender.api.lib import maintained_time -class ExtractPlayblast(publish.Extractor, publish.OptionalPyblishPluginMixin): +class ExtractPlayblast( + plugin.BlenderExtractor, publish.OptionalPyblishPluginMixin +): """ Extract viewport playblast. diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py index 8c569de5fd..40097aaa89 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_thumbnail.py @@ -3,14 +3,13 @@ import glob import json import pyblish.api -from ayon_core.pipeline import publish -from ayon_blender.api import capture +from ayon_blender.api import capture, plugin from ayon_blender.api.lib import maintained_time import bpy -class ExtractThumbnail(publish.Extractor): +class ExtractThumbnail(plugin.BlenderExtractor): """Extract viewport thumbnail. Takes review camera and creates a thumbnail based on viewport diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py b/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py index 3d62e4bb90..7ea89ae3dc 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/extract_usd.py @@ -2,11 +2,11 @@ import os import bpy -from ayon_core.pipeline import publish +from ayon_core.pipeline import KnownPublishError from ayon_blender.api import plugin, lib -class ExtractUSD(publish.Extractor): +class ExtractUSD(plugin.BlenderExtractor): """Extract as USD.""" label = "Extract USD" @@ -40,7 +40,7 @@ class ExtractUSD(publish.Extractor): root = lib.get_highest_root(objects=instance[:]) if not root: instance_node = instance.data["transientData"]["instance_node"] - raise publish.KnownPublishError( + raise KnownPublishError( f"No root object found in instance: {instance_node.name}" ) self.log.debug(f"Exporting using active root: {root.name}") diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py b/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py index 4af5a726a5..50d16ea54a 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/increment_workfile_version.py @@ -1,11 +1,12 @@ import pyblish.api from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_blender.api.workio import save_file +from ayon_blender.api import plugin class IncrementWorkfileVersion( - pyblish.api.ContextPlugin, - OptionalPyblishPluginMixin + plugin.BlenderContextPlugin, + OptionalPyblishPluginMixin ): """Increment current workfile version.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py b/server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py index 5d3a1dac93..b95c280ab0 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/integrate_animation.py @@ -2,11 +2,12 @@ import json import pyblish.api from ayon_core.pipeline.publish import OptionalPyblishPluginMixin +from ayon_blender.api import plugin class IntegrateAnimation( - pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin, + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin, ): """Generate a JSON file for animation.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py index aafae315d0..df66f71dc5 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_camera_zero_keyframe.py @@ -2,9 +2,8 @@ from typing import List import bpy -import pyblish.api - import ayon_blender.api.action +from ayon_blender.api import plugin from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -12,8 +11,10 @@ from ayon_core.pipeline.publish import ( ) -class ValidateCameraZeroKeyframe(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateCameraZeroKeyframe( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """Camera must have a keyframe at frame 0. Unreal shifts the first keyframe to frame 0. Forcing the camera to have diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py index 099e909dc7..fe544ee310 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_deadline_publish.py @@ -2,18 +2,20 @@ import os import bpy -import pyblish.api from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_blender.api import plugin from ayon_blender.api.render_lib import prepare_rendering -class ValidateDeadlinePublish(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateDeadlinePublish( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """Validates Render File Directory is not the same in every submission """ diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py index aa73525555..e6b7b01c71 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_file_saved.py @@ -6,6 +6,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) +from ayon_blender.api import plugin class SaveWorkfileAction(pyblish.api.Action): @@ -18,8 +19,10 @@ class SaveWorkfileAction(pyblish.api.Action): bpy.ops.wm.avalon_workfiles() -class ValidateFileSaved(pyblish.api.ContextPlugin, - OptionalPyblishPluginMixin): +class ValidateFileSaved( + plugin.BlenderContextPlugin, + OptionalPyblishPluginMixin +): """Validate that the workfile has been saved.""" order = pyblish.api.ValidatorOrder - 0.01 diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py index f0f4106379..9561cc7020 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_instance_empty.py @@ -1,8 +1,9 @@ import pyblish.api from ayon_core.pipeline.publish import PublishValidationError +from ayon_blender.api import plugin -class ValidateInstanceEmpty(pyblish.api.InstancePlugin): +class ValidateInstanceEmpty(plugin.BlenderInstancePlugin): """Validator to verify that the instance is not empty""" order = pyblish.api.ValidatorOrder - 0.01 diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py index 8f5f5aede8..3dd49e0e45 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_has_uv.py @@ -2,19 +2,18 @@ from typing import List import bpy -import pyblish.api - from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, PublishValidationError ) import ayon_blender.api.action +from ayon_blender.api import plugin class ValidateMeshHasUvs( - pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin, + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin, ): """Validate that the current mesh has UV's.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py index de81400bda..91de310e46 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_mesh_no_negative_scale.py @@ -2,18 +2,19 @@ from typing import List import bpy -import pyblish.api - from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, PublishValidationError ) import ayon_blender.api.action +from ayon_blender.api import plugin -class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateMeshNoNegativeScale( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """Ensure that meshes don't have a negative scale.""" order = ValidateContentsOrder diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py index fa2ff377da..fff4abc98d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py @@ -12,11 +12,12 @@ from ayon_core.pipeline.publish import ( RepairAction ) import ayon_blender.api.action +from ayon_blender.api import plugin class ValidateModelMeshUvMap1( - pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin, + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin, ): """Validate model mesh uvs are named `map1`. diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py index 14fdba2996..dbafb53263 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_no_colons_in_name.py @@ -2,9 +2,8 @@ from typing import List import bpy -import pyblish.api - import ayon_blender.api.action +from ayon_blender.api import plugin from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -12,8 +11,10 @@ from ayon_core.pipeline.publish import ( ) -class ValidateNoColonsInName(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateNoColonsInName( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """There cannot be colons in names Object or bone names cannot include colons. Other software do not diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py index 3832275560..4dc2c39949 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_object_mode.py @@ -8,11 +8,12 @@ from ayon_core.pipeline.publish import ( PublishValidationError ) import ayon_blender.api.action +from ayon_blender.api import plugin class ValidateObjectIsInObjectMode( - pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin, + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin, ): """Validate that the objects in the instance are in Object Mode.""" diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py index 46bfe45739..15eb64d2ad 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_render_camera_is_set.py @@ -6,10 +6,13 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) +from ayon_blender.api import plugin -class ValidateRenderCameraIsSet(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateRenderCameraIsSet( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """Validate that there is a camera set as active for rendering.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py index 21e3467ab1..c7bfc6e8a6 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_transform_zero.py @@ -4,8 +4,6 @@ from typing import List import mathutils import bpy -import pyblish.api - from ayon_blender.api import plugin, lib import ayon_blender.api.action from ayon_core.pipeline.publish import ( @@ -16,8 +14,10 @@ from ayon_core.pipeline.publish import ( ) -class ValidateTransformZero(pyblish.api.InstancePlugin, - OptionalPyblishPluginMixin): +class ValidateTransformZero( + plugin.BlenderInstancePlugin, + OptionalPyblishPluginMixin +): """Transforms can't have any values""" order = ValidateContentsOrder From 9f8fbae1940b07601650f25010b4e2da2a590557 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:53:03 +0200 Subject: [PATCH 434/469] renamed base plugin class names --- server_addon/blender/client/ayon_blender/api/ops.py | 2 +- server_addon/blender/client/ayon_blender/api/plugin.py | 8 ++++---- .../client/ayon_blender/plugins/create/convert_legacy.py | 2 +- .../client/ayon_blender/plugins/create/create_action.py | 2 +- .../ayon_blender/plugins/create/create_animation.py | 2 +- .../ayon_blender/plugins/create/create_blendScene.py | 2 +- .../client/ayon_blender/plugins/create/create_camera.py | 2 +- .../client/ayon_blender/plugins/create/create_layout.py | 2 +- .../client/ayon_blender/plugins/create/create_model.py | 2 +- .../ayon_blender/plugins/create/create_pointcache.py | 2 +- .../client/ayon_blender/plugins/create/create_render.py | 2 +- .../client/ayon_blender/plugins/create/create_review.py | 2 +- .../client/ayon_blender/plugins/create/create_rig.py | 2 +- .../client/ayon_blender/plugins/create/create_usd.py | 2 +- .../client/ayon_blender/plugins/create/create_workfile.py | 4 ++-- .../client/ayon_blender/plugins/load/import_workfile.py | 4 ++-- .../client/ayon_blender/plugins/load/load_action.py | 2 +- .../client/ayon_blender/plugins/load/load_animation.py | 2 +- .../client/ayon_blender/plugins/load/load_audio.py | 2 +- .../client/ayon_blender/plugins/load/load_blend.py | 2 +- .../client/ayon_blender/plugins/load/load_blendscene.py | 2 +- .../client/ayon_blender/plugins/load/load_cache.py | 2 +- .../client/ayon_blender/plugins/load/load_camera_abc.py | 2 +- .../client/ayon_blender/plugins/load/load_camera_fbx.py | 2 +- .../blender/client/ayon_blender/plugins/load/load_fbx.py | 2 +- .../client/ayon_blender/plugins/load/load_layout_json.py | 2 +- .../blender/client/ayon_blender/plugins/load/load_look.py | 2 +- 27 files changed, 32 insertions(+), 32 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/api/ops.py b/server_addon/blender/client/ayon_blender/api/ops.py index c03ec98d0c..7cf9600067 100644 --- a/server_addon/blender/client/ayon_blender/api/ops.py +++ b/server_addon/blender/client/ayon_blender/api/ops.py @@ -305,7 +305,7 @@ class LaunchCreator(LaunchQtApp): class LaunchLoader(LaunchQtApp): - """Launch Avalon Loader.""" + """Launch AYON Loader.""" bl_idname = "wm.avalon_loader" bl_label = "Load..." diff --git a/server_addon/blender/client/ayon_blender/api/plugin.py b/server_addon/blender/client/ayon_blender/api/plugin.py index f4266bc3a2..e72bf20287 100644 --- a/server_addon/blender/client/ayon_blender/api/plugin.py +++ b/server_addon/blender/client/ayon_blender/api/plugin.py @@ -175,7 +175,7 @@ class BlenderExtractor(Extractor): settings_category = "blender" -class BaseCreator(Creator): +class BlenderCreator(Creator): """Base class for Blender Creator plug-ins.""" defaults = ['Main'] @@ -280,7 +280,7 @@ class BaseCreator(Creator): return instance_node def collect_instances(self): - """Override abstract method from BaseCreator. + """Override abstract method from BlenderCreator. Collect existing instances related to this creator plugin.""" # Cache instances in shared data @@ -307,7 +307,7 @@ class BaseCreator(Creator): self._add_instance_to_context(instance) def update_instances(self, update_list): - """Override abstract method from BaseCreator. + """Override abstract method from BlenderCreator. Store changes of existing instances so they can be recollected. Args: @@ -391,7 +391,7 @@ class BaseCreator(Creator): ] -class AssetLoader(LoaderPlugin): +class BlenderLoader(LoaderPlugin): """A basic AssetLoader for Blender This will implement the basic logic for linking/appending assets diff --git a/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py b/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py index c51e58dbcb..095f3ab919 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/convert_legacy.py @@ -42,7 +42,7 @@ class BlenderLegacyConvertor(ProductConvertorPlugin): parameter on them. This is using cached entries done in - :py:meth:`~BaseCreator.cache_instance_data()` + :py:meth:`~BlenderCreator.cache_instance_data()` """ self.legacy_instances = self.collection_shared_data.get( diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_action.py b/server_addon/blender/client/ayon_blender/plugins/create/create_action.py index 90e351e877..123a2e0df1 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_action.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_action.py @@ -5,7 +5,7 @@ import bpy from ayon_blender.api import lib, plugin -class CreateAction(plugin.BaseCreator): +class CreateAction(plugin.BlenderCreator): """Action output for character rigs.""" identifier = "io.openpype.creators.blender.action" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py b/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py index 89d836ec0d..cfb2c254ef 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_animation.py @@ -3,7 +3,7 @@ from ayon_blender.api import plugin, lib -class CreateAnimation(plugin.BaseCreator): +class CreateAnimation(plugin.BlenderCreator): """Animation output for character rigs.""" identifier = "io.openpype.creators.blender.animation" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py b/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py index 66ac812b6b..363a35883b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_blendScene.py @@ -5,7 +5,7 @@ import bpy from ayon_blender.api import plugin, lib -class CreateBlendScene(plugin.BaseCreator): +class CreateBlendScene(plugin.BlenderCreator): """Generic group of assets.""" identifier = "io.openpype.creators.blender.blendscene" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py b/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py index 3780344abc..8cfe8f989b 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_camera.py @@ -6,7 +6,7 @@ from ayon_blender.api import plugin, lib from ayon_blender.api.pipeline import AVALON_INSTANCES -class CreateCamera(plugin.BaseCreator): +class CreateCamera(plugin.BlenderCreator): """Polygonal static geometry.""" identifier = "io.openpype.creators.blender.camera" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py b/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py index c781b8a683..1e0f8effdd 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_layout.py @@ -5,7 +5,7 @@ import bpy from ayon_blender.api import plugin, lib -class CreateLayout(plugin.BaseCreator): +class CreateLayout(plugin.BlenderCreator): """Layout output for character rigs.""" identifier = "io.openpype.creators.blender.layout" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_model.py b/server_addon/blender/client/ayon_blender/plugins/create/create_model.py index b55fd5e76b..7e8bf566ea 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_model.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_model.py @@ -5,7 +5,7 @@ import bpy from ayon_blender.api import plugin, lib -class CreateModel(plugin.BaseCreator): +class CreateModel(plugin.BlenderCreator): """Polygonal static geometry.""" identifier = "io.openpype.creators.blender.model" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py b/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py index 4aa088da5c..9730ddb89d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_pointcache.py @@ -3,7 +3,7 @@ from ayon_blender.api import plugin, lib -class CreatePointcache(plugin.BaseCreator): +class CreatePointcache(plugin.BlenderCreator): """Polygonal static geometry.""" identifier = "io.openpype.creators.blender.pointcache" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_render.py b/server_addon/blender/client/ayon_blender/plugins/create/create_render.py index 6b6ebbce0a..6bbedb957f 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_render.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_render.py @@ -7,7 +7,7 @@ from ayon_blender.api.render_lib import prepare_rendering from ayon_blender.api.workio import save_file -class CreateRenderlayer(plugin.BaseCreator): +class CreateRenderlayer(plugin.BlenderCreator): """Single baked camera.""" identifier = "io.openpype.creators.blender.render" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_review.py b/server_addon/blender/client/ayon_blender/plugins/create/create_review.py index d28ee596d3..dbef9e371f 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_review.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_review.py @@ -3,7 +3,7 @@ from ayon_blender.api import plugin, lib -class CreateReview(plugin.BaseCreator): +class CreateReview(plugin.BlenderCreator): """Single baked camera.""" identifier = "io.openpype.creators.blender.review" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py b/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py index 36307c0a34..aad24bda69 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_rig.py @@ -5,7 +5,7 @@ import bpy from ayon_blender.api import plugin, lib -class CreateRig(plugin.BaseCreator): +class CreateRig(plugin.BlenderCreator): """Artist-friendly rig with controls to direct motion.""" identifier = "io.openpype.creators.blender.rig" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py b/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py index a893b6bdaa..d7770b15f7 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_usd.py @@ -3,7 +3,7 @@ from ayon_blender.api import plugin, lib -class CreateUSD(plugin.BaseCreator): +class CreateUSD(plugin.BlenderCreator): """Create USD Export""" identifier = "io.openpype.creators.blender.usd" diff --git a/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py b/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py index ae4e7d033a..03cfc322a9 100644 --- a/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py +++ b/server_addon/blender/client/ayon_blender/plugins/create/create_workfile.py @@ -2,14 +2,14 @@ import bpy import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_blender.api.plugin import BaseCreator +from ayon_blender.api.plugin import BlenderCreator from ayon_blender.api.pipeline import ( AVALON_PROPERTY, AVALON_CONTAINERS ) -class CreateWorkfile(BaseCreator, AutoCreator): +class CreateWorkfile(BlenderCreator, AutoCreator): """Workfile auto-creator. The workfile instance stores its data on the `AVALON_CONTAINERS` collection diff --git a/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py b/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py index e690980b6a..16cba6913d 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/import_workfile.py @@ -34,7 +34,7 @@ def append_workfile(context, fname, do_import): collection.children.link(coll) -class AppendBlendLoader(plugin.AssetLoader): +class AppendBlendLoader(plugin.BlenderLoader): """Append workfile in Blender (unmanaged) Warning: @@ -59,7 +59,7 @@ class AppendBlendLoader(plugin.AssetLoader): return -class ImportBlendLoader(plugin.AssetLoader): +class ImportBlendLoader(plugin.BlenderLoader): """Import workfile in the current Blender scene (unmanaged) Warning: diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_action.py b/server_addon/blender/client/ayon_blender/plugins/load/load_action.py index 2ea77785fb..ddfaa94044 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_action.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_action.py @@ -16,7 +16,7 @@ from ayon_blender.api.pipeline import ( logger = logging.getLogger("ayon").getChild("blender").getChild("load_action") -class BlendActionLoader(plugin.AssetLoader): +class BlendActionLoader(plugin.BlenderLoader): """Load action from a .blend file. Warning: diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py b/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py index 1367cab175..241b76b600 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_animation.py @@ -8,7 +8,7 @@ from ayon_blender.api import plugin from ayon_blender.api.pipeline import AVALON_PROPERTY -class BlendAnimationLoader(plugin.AssetLoader): +class BlendAnimationLoader(plugin.BlenderLoader): """Load animations from a .blend file. Warning: diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py b/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py index 62f585363c..b8682e7c13 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_audio.py @@ -17,7 +17,7 @@ from ayon_blender.api.pipeline import ( ) -class AudioLoader(plugin.AssetLoader): +class AudioLoader(plugin.BlenderLoader): """Load audio in Blender.""" product_types = {"audio"} diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py index 026afe6244..c9f3ec0c71 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_blend.py @@ -17,7 +17,7 @@ from ayon_blender.api.pipeline import ( ) -class BlendLoader(plugin.AssetLoader): +class BlendLoader(plugin.BlenderLoader): """Load assets from a .blend file.""" product_types = {"model", "rig", "layout", "camera"} diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py b/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py index 9e0de26a8b..590ab0079e 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_blendscene.py @@ -15,7 +15,7 @@ from ayon_blender.api.pipeline import ( ) -class BlendSceneLoader(plugin.AssetLoader): +class BlendSceneLoader(plugin.BlenderLoader): """Load assets from a .blend file.""" product_types = {"blendScene"} diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py b/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py index 570f5086f2..599610ff39 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_cache.py @@ -18,7 +18,7 @@ from ayon_blender.api.pipeline import ( from ayon_blender.api import plugin, lib -class CacheModelLoader(plugin.AssetLoader): +class CacheModelLoader(plugin.BlenderLoader): """Load cache models. Stores the imported asset in a collection named after the asset. diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py index 6df035994b..7305afd423 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_abc.py @@ -17,7 +17,7 @@ from ayon_blender.api.pipeline import ( ) -class AbcCameraLoader(plugin.AssetLoader): +class AbcCameraLoader(plugin.BlenderLoader): """Load a camera from Alembic file. Stores the imported asset in an empty named after the asset. diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py index a9a9fcbeb3..d2900c6c3f 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_camera_fbx.py @@ -17,7 +17,7 @@ from ayon_blender.api.pipeline import ( ) -class FbxCameraLoader(plugin.AssetLoader): +class FbxCameraLoader(plugin.BlenderLoader): """Load a camera from FBX. Stores the imported asset in an empty named after the asset. diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py b/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py index 9959a04ab5..fe3d747dab 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_fbx.py @@ -17,7 +17,7 @@ from ayon_blender.api.pipeline import ( ) -class FbxModelLoader(plugin.AssetLoader): +class FbxModelLoader(plugin.BlenderLoader): """Load FBX models. Stores the imported asset in an empty named after the asset. diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py b/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py index 93a8543f2e..9a2d17b4fc 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_layout_json.py @@ -23,7 +23,7 @@ from ayon_blender.api.pipeline import ( from ayon_blender.api import plugin -class JsonLayoutLoader(plugin.AssetLoader): +class JsonLayoutLoader(plugin.BlenderLoader): """Load layout published from Unreal.""" product_types = {"layout"} diff --git a/server_addon/blender/client/ayon_blender/plugins/load/load_look.py b/server_addon/blender/client/ayon_blender/plugins/load/load_look.py index 01e90b317d..d214917d3e 100644 --- a/server_addon/blender/client/ayon_blender/plugins/load/load_look.py +++ b/server_addon/blender/client/ayon_blender/plugins/load/load_look.py @@ -16,7 +16,7 @@ from ayon_blender.api.pipeline import ( ) -class BlendLookLoader(plugin.AssetLoader): +class BlendLookLoader(plugin.BlenderLoader): """Load models from a .blend file. Because they come from a .blend file we can simply link the collection that From d6eb124e90aad155fb7088602f1c8ff89aa180da Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:54:50 +0200 Subject: [PATCH 435/469] fix import --- server_addon/blender/client/ayon_blender/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server_addon/blender/client/ayon_blender/__init__.py b/server_addon/blender/client/ayon_blender/__init__.py index 2a6603606a..d67afbde0b 100644 --- a/server_addon/blender/client/ayon_blender/__init__.py +++ b/server_addon/blender/client/ayon_blender/__init__.py @@ -1,6 +1,10 @@ -from .addon import BlenderAddon +from .addon import ( + BlenderAddon, + BLENDER_ADDON_ROOT, +) __all__ = ( "BlenderAddon", + "BLENDER_ADDON_ROOT", ) From bf67d300fdc6196ca769c66709f772c9ba7d3f07 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 17:55:15 +0200 Subject: [PATCH 436/469] bump version and add more information to package.py --- client/ayon_core/addon/base.py | 1 + server_addon/blender/client/ayon_blender/__init__.py | 3 +++ server_addon/blender/client/ayon_blender/addon.py | 3 +++ server_addon/blender/client/ayon_blender/version.py | 3 +++ server_addon/blender/package.py | 10 +++++++++- 5 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 server_addon/blender/client/ayon_blender/version.py diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 56d5c46858..afe102f51a 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "blender": VersionInfo(0, 2, 0), "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), diff --git a/server_addon/blender/client/ayon_blender/__init__.py b/server_addon/blender/client/ayon_blender/__init__.py index d67afbde0b..221dcd4138 100644 --- a/server_addon/blender/client/ayon_blender/__init__.py +++ b/server_addon/blender/client/ayon_blender/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( BlenderAddon, BLENDER_ADDON_ROOT, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "BlenderAddon", "BLENDER_ADDON_ROOT", ) diff --git a/server_addon/blender/client/ayon_blender/addon.py b/server_addon/blender/client/ayon_blender/addon.py index d9a20e8dab..9711580369 100644 --- a/server_addon/blender/client/ayon_blender/addon.py +++ b/server_addon/blender/client/ayon_blender/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + BLENDER_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class BlenderAddon(AYONAddon, IHostAddon): name = "blender" + version = __version__ host_name = "blender" def add_implementation_envs(self, env, _app): diff --git a/server_addon/blender/client/ayon_blender/version.py b/server_addon/blender/client/ayon_blender/version.py new file mode 100644 index 0000000000..365c44e71b --- /dev/null +++ b/server_addon/blender/client/ayon_blender/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'blender' version.""" +__version__ = "0.2.0" diff --git a/server_addon/blender/package.py b/server_addon/blender/package.py index d2c02a4909..4e0ac112e1 100644 --- a/server_addon/blender/package.py +++ b/server_addon/blender/package.py @@ -1,3 +1,11 @@ name = "blender" title = "Blender" -version = "0.1.9" +version = "0.2.0" + +client_dir = "ayon_blender" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} + From fb30e3d8b6f883f786f313e0ec9202887beb18af Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 11:25:13 +0200 Subject: [PATCH 437/469] removed unused import --- .../ayon_blender/plugins/publish/validate_model_uv_map1.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py index fff4abc98d..74f550b6db 100644 --- a/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py +++ b/server_addon/blender/client/ayon_blender/plugins/publish/validate_model_uv_map1.py @@ -3,8 +3,6 @@ from typing import List import bpy -import pyblish.api - from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, From 5e8aca34204e3c065217e314880ea89b2d2373af Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:36:26 +0200 Subject: [PATCH 438/469] added version property to addon class --- client/ayon_core/addon/base.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d2c072c50c..9eb5773927 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -8,7 +8,7 @@ import inspect import logging import threading import collections - +import warnings from uuid import uuid4 from abc import ABCMeta, abstractmethod @@ -551,6 +551,9 @@ class AYONAddon(object): enabled = True _id = None + # Temporary variable for 'version' property + _missing_version_warned = False + def __init__(self, manager, settings): self.manager = manager @@ -581,6 +584,25 @@ class AYONAddon(object): pass + @property + def version(self): + """Addon version. + + Todo: + Should be abstract property (required). Introduced in + ayon-core 0.3.3 . + + Returns: + str: Addon version as semver compatible string. + + """ + if not self.__class__._missing_version_warned: + self.__class__._missing_version_warned = True + warnings.warn( + f"Addon '{self.name}' does not have defined version." + ) + return "0.0.0" + def initialize(self, settings): """Initialization of addon attributes. From 8f0522ac3e846cb62fb29cf6fb0059274cc60231 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:36:40 +0200 Subject: [PATCH 439/469] log addon version and show it in report --- client/ayon_core/addon/base.py | 98 ++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 29 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 9eb5773927..a70c1b7961 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -718,6 +718,30 @@ class OpenPypeAddOn(OpenPypeModule): enabled = True +class _AddonReportInfo: + def __init__( + self, class_name, name, version, report_value_by_label + ): + self.class_name = class_name + self.name = name + self.version = version + self.report_value_by_label = report_value_by_label + + @classmethod + def from_addon(cls, addon, report): + class_name = addon.__class__.__name__ + report_value_by_label = { + label: reported.get(class_name) + for label, reported in report.items() + } + return cls( + addon.__class__.__name__, + addon.name, + addon.version, + report_value_by_label + ) + + class AddonsManager: """Manager of addons that helps to load and prepare them to work. @@ -894,10 +918,10 @@ class AddonsManager: name_alias = getattr(addon, "openpype_alias", None) if name_alias: aliased_names.append((name_alias, addon)) - enabled_str = "X" - if not addon.enabled: - enabled_str = " " - self.log.debug("[{}] {}".format(enabled_str, name)) + enabled_str = "X" if addon.enabled else " " + self.log.debug( + f"[{enabled_str}] {addon.name} ({addon.version})" + ) now = time.time() report[addon.__class__.__name__] = now - prev_start_time @@ -1197,39 +1221,55 @@ class AddonsManager: available_col_names |= set(addon_names.keys()) # Prepare ordered dictionary for columns - cols = collections.OrderedDict() - # Add addon names to first columnt - cols["Addon name"] = list(sorted( - addon.__class__.__name__ + addons_info = [ + _AddonReportInfo.from_addon(addon, self._report) for addon in self.addons if addon.__class__.__name__ in available_col_names - )) + ] + addons_info.sort(key=lambda x: x.name) + + addon_name_rows = [ + addon_info.name + for addon_info in addons_info + ] + addon_version_rows = [ + addon_info.version + for addon_info in addons_info + ] + # Add total key (as last addon) - cols["Addon name"].append(self._report_total_key) + addon_name_rows.append(self._report_total_key) + addon_version_rows.append(f"({len(addons_info)})") + + cols = collections.OrderedDict() + # Add addon names to first columnt + cols["Addon name"] = addon_name_rows + cols["Version"] = addon_version_rows # Add columns from report + total_by_addon = { + row: 0 + for row in addon_name_rows + } for label in self._report.keys(): - cols[label] = [] - - total_addon_times = {} - for addon_name in cols["Addon name"]: - total_addon_times[addon_name] = 0 - - for label, reported in self._report.items(): - for addon_name in cols["Addon name"]: - col_time = reported.get(addon_name) - if col_time is None: - cols[label].append("N/A") + rows = [] + col_total = 0 + for addon_info in addons_info: + value = addon_info.report_value_by_label.get(label) + if value is None: + rows.append("N/A") continue - cols[label].append("{:.3f}".format(col_time)) - total_addon_times[addon_name] += col_time - + rows.append("{:.3f}".format(value)) + total_by_addon[addon_info.name] += value + col_total += value + total_by_addon[self._report_total_key] += col_total + rows.append("{:.3f}".format(col_total)) + cols[label] = rows # Add to also total column that should sum the row - cols[self._report_total_key] = [] - for addon_name in cols["Addon name"]: - cols[self._report_total_key].append( - "{:.3f}".format(total_addon_times[addon_name]) - ) + cols[self._report_total_key] = [ + "{:.3f}".format(total_by_addon[addon_name]) + for addon_name in cols["Addon name"] + ] # Prepare column widths and total row count # - column width is by From 3e9c08205ee83d1b4006c9f25d3f3bd50c62d03a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:40:18 +0200 Subject: [PATCH 440/469] added version to job queue --- client/ayon_core/modules/job_queue/__init__.py | 3 +++ client/ayon_core/modules/job_queue/addon.py | 3 +++ client/ayon_core/modules/job_queue/version.py | 1 + 3 files changed, 7 insertions(+) create mode 100644 client/ayon_core/modules/job_queue/version.py diff --git a/client/ayon_core/modules/job_queue/__init__.py b/client/ayon_core/modules/job_queue/__init__.py index 0a4c62abfb..041782dd29 100644 --- a/client/ayon_core/modules/job_queue/__init__.py +++ b/client/ayon_core/modules/job_queue/__init__.py @@ -1,6 +1,9 @@ +from .version import __version__ from .addon import JobQueueAddon __all__ = ( + "__version__", + "JobQueueAddon", ) diff --git a/client/ayon_core/modules/job_queue/addon.py b/client/ayon_core/modules/job_queue/addon.py index 0fa54eb2f0..96f6ff0d4d 100644 --- a/client/ayon_core/modules/job_queue/addon.py +++ b/client/ayon_core/modules/job_queue/addon.py @@ -44,9 +44,12 @@ import platform from ayon_core.addon import AYONAddon, click_wrap from ayon_core.settings import get_studio_settings +from .version import __version__ + class JobQueueAddon(AYONAddon): name = "job_queue" + version = __version__ def initialize(self, studio_settings): addon_settings = studio_settings.get(self.name) or {} diff --git a/client/ayon_core/modules/job_queue/version.py b/client/ayon_core/modules/job_queue/version.py new file mode 100644 index 0000000000..5becc17c04 --- /dev/null +++ b/client/ayon_core/modules/job_queue/version.py @@ -0,0 +1 @@ +__version__ = "1.0.0" From b7e2b83efce5ee9f5d2c22a03f4fe3562f230acd Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:40:29 +0200 Subject: [PATCH 441/469] added version to timers manager --- client/ayon_core/modules/timers_manager/__init__.py | 3 +++ client/ayon_core/modules/timers_manager/timers_manager.py | 2 ++ client/ayon_core/modules/timers_manager/version.py | 1 + 3 files changed, 6 insertions(+) create mode 100644 client/ayon_core/modules/timers_manager/version.py diff --git a/client/ayon_core/modules/timers_manager/__init__.py b/client/ayon_core/modules/timers_manager/__init__.py index 5d7a4166d3..1ec0d9b74b 100644 --- a/client/ayon_core/modules/timers_manager/__init__.py +++ b/client/ayon_core/modules/timers_manager/__init__.py @@ -1,7 +1,10 @@ +from .version import __version__ from .timers_manager import ( TimersManager ) __all__ = ( + "__version__", + "TimersManager", ) diff --git a/client/ayon_core/modules/timers_manager/timers_manager.py b/client/ayon_core/modules/timers_manager/timers_manager.py index 4212ff6b25..2aac7b2a49 100644 --- a/client/ayon_core/modules/timers_manager/timers_manager.py +++ b/client/ayon_core/modules/timers_manager/timers_manager.py @@ -10,6 +10,7 @@ from ayon_core.addon import ( ) from ayon_core.lib.events import register_event_callback +from .version import __version__ from .exceptions import InvalidContextError TIMER_MODULE_DIR = os.path.dirname(os.path.abspath(__file__)) @@ -96,6 +97,7 @@ class TimersManager( See `ExampleTimersManagerConnector`. """ name = "timers_manager" + version = __version__ label = "Timers Service" _required_methods = ( diff --git a/client/ayon_core/modules/timers_manager/version.py b/client/ayon_core/modules/timers_manager/version.py new file mode 100644 index 0000000000..5becc17c04 --- /dev/null +++ b/client/ayon_core/modules/timers_manager/version.py @@ -0,0 +1 @@ +__version__ = "1.0.0" From 090208d8bc1cd2653487babb9d0af19820fd1362 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:43:05 +0200 Subject: [PATCH 442/469] fix timers manager version --- client/ayon_core/modules/timers_manager/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/timers_manager/version.py b/client/ayon_core/modules/timers_manager/version.py index 5becc17c04..485f44ac21 100644 --- a/client/ayon_core/modules/timers_manager/version.py +++ b/client/ayon_core/modules/timers_manager/version.py @@ -1 +1 @@ -__version__ = "1.0.0" +__version__ = "0.1.1" From 75f55101f8a70bc09106813ab8a1054fc2ab2cbb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:43:24 +0200 Subject: [PATCH 443/469] added version to webserver --- client/ayon_core/modules/webserver/__init__.py | 3 +++ client/ayon_core/modules/webserver/version.py | 1 + client/ayon_core/modules/webserver/webserver_module.py | 3 +++ 3 files changed, 7 insertions(+) create mode 100644 client/ayon_core/modules/webserver/version.py diff --git a/client/ayon_core/modules/webserver/__init__.py b/client/ayon_core/modules/webserver/__init__.py index 0d3f767638..a978b94bc4 100644 --- a/client/ayon_core/modules/webserver/__init__.py +++ b/client/ayon_core/modules/webserver/__init__.py @@ -1,8 +1,11 @@ +from .version import __version__ from .webserver_module import ( WebServerAddon ) __all__ = ( + "__version__", + "WebServerAddon", ) diff --git a/client/ayon_core/modules/webserver/version.py b/client/ayon_core/modules/webserver/version.py new file mode 100644 index 0000000000..5becc17c04 --- /dev/null +++ b/client/ayon_core/modules/webserver/version.py @@ -0,0 +1 @@ +__version__ = "1.0.0" diff --git a/client/ayon_core/modules/webserver/webserver_module.py b/client/ayon_core/modules/webserver/webserver_module.py index c324e0dd18..997b6f754c 100644 --- a/client/ayon_core/modules/webserver/webserver_module.py +++ b/client/ayon_core/modules/webserver/webserver_module.py @@ -26,9 +26,12 @@ import socket from ayon_core import resources from ayon_core.addon import AYONAddon, ITrayService +from .version import __version__ + class WebServerAddon(AYONAddon, ITrayService): name = "webserver" + version = __version__ label = "WebServer" webserver_url_env = "AYON_WEBSERVER_URL" From c687ec7430497ab7fd306cf03830d1784e5bebff Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:43:59 +0200 Subject: [PATCH 444/469] use version in deadline addon --- client/ayon_core/modules/deadline/deadline_module.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/client/ayon_core/modules/deadline/deadline_module.py b/client/ayon_core/modules/deadline/deadline_module.py index b1089bbfe2..ea0350d2d9 100644 --- a/client/ayon_core/modules/deadline/deadline_module.py +++ b/client/ayon_core/modules/deadline/deadline_module.py @@ -7,6 +7,8 @@ import six from ayon_core.lib import Logger from ayon_core.modules import AYONAddon, IPluginPaths +from .version import __version__ + class DeadlineWebserviceError(Exception): """ @@ -16,6 +18,7 @@ class DeadlineWebserviceError(Exception): class DeadlineModule(AYONAddon, IPluginPaths): name = "deadline" + version = __version__ def initialize(self, studio_settings): # This module is always enabled From 1bf0421e7af8104c89ffe21c3cdd99e1d708c2bd Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:44:09 +0200 Subject: [PATCH 445/469] define version if actions --- client/ayon_core/modules/launcher_action.py | 1 + client/ayon_core/modules/loader_action.py | 1 + 2 files changed, 2 insertions(+) diff --git a/client/ayon_core/modules/launcher_action.py b/client/ayon_core/modules/launcher_action.py index 38e88d36ca..344b0bc389 100644 --- a/client/ayon_core/modules/launcher_action.py +++ b/client/ayon_core/modules/launcher_action.py @@ -7,6 +7,7 @@ from ayon_core.addon import AYONAddon, ITrayAction class LauncherAction(AYONAddon, ITrayAction): label = "Launcher" name = "launcher_tool" + version = "1.0.0" def initialize(self, settings): diff --git a/client/ayon_core/modules/loader_action.py b/client/ayon_core/modules/loader_action.py index 1e45db05dc..a58d7fd456 100644 --- a/client/ayon_core/modules/loader_action.py +++ b/client/ayon_core/modules/loader_action.py @@ -3,6 +3,7 @@ from ayon_core.addon import AYONAddon, ITrayAddon class LoaderAddon(AYONAddon, ITrayAddon): name = "loader_tool" + version = "1.0.0" def initialize(self, settings): # Tray attributes From 8e27a2238d3474c3f394422328206425e85e4454 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:45:50 +0200 Subject: [PATCH 446/469] added version to royal render --- client/ayon_core/modules/royalrender/__init__.py | 3 +++ client/ayon_core/modules/royalrender/addon.py | 3 +++ client/ayon_core/modules/royalrender/version.py | 1 + 3 files changed, 7 insertions(+) create mode 100644 client/ayon_core/modules/royalrender/version.py diff --git a/client/ayon_core/modules/royalrender/__init__.py b/client/ayon_core/modules/royalrender/__init__.py index 121530beda..8bf207e7db 100644 --- a/client/ayon_core/modules/royalrender/__init__.py +++ b/client/ayon_core/modules/royalrender/__init__.py @@ -1,6 +1,9 @@ +from .version import __version__ from .addon import RoyalRenderAddon __all__ = ( + "__version__", + "RoyalRenderAddon", ) diff --git a/client/ayon_core/modules/royalrender/addon.py b/client/ayon_core/modules/royalrender/addon.py index e69cf9feec..264d3516c1 100644 --- a/client/ayon_core/modules/royalrender/addon.py +++ b/client/ayon_core/modules/royalrender/addon.py @@ -4,10 +4,13 @@ import os from ayon_core.addon import AYONAddon, IPluginPaths +from .version import __version__ + class RoyalRenderAddon(AYONAddon, IPluginPaths): """Class providing basic Royal Render implementation logic.""" name = "royalrender" + version = __version__ # _rr_api = None # @property diff --git a/client/ayon_core/modules/royalrender/version.py b/client/ayon_core/modules/royalrender/version.py new file mode 100644 index 0000000000..485f44ac21 --- /dev/null +++ b/client/ayon_core/modules/royalrender/version.py @@ -0,0 +1 @@ +__version__ = "0.1.1" From 807e931d0a9513ed79c4bf970332ecd5468c1241 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:46:04 +0200 Subject: [PATCH 447/469] added version to python console action --- client/ayon_core/modules/python_console_interpreter/addon.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/modules/python_console_interpreter/addon.py b/client/ayon_core/modules/python_console_interpreter/addon.py index ffad3ce707..b0dce2585e 100644 --- a/client/ayon_core/modules/python_console_interpreter/addon.py +++ b/client/ayon_core/modules/python_console_interpreter/addon.py @@ -4,6 +4,7 @@ from ayon_core.addon import AYONAddon, ITrayAction class PythonInterpreterAction(AYONAddon, ITrayAction): label = "Console" name = "python_interpreter" + version = "1.0.0" admin_action = True def initialize(self, settings): From 8ae140fc6cfb70f1e6d19a311e3f4355c47ca3a5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:47:20 +0200 Subject: [PATCH 448/469] change warning to print --- client/ayon_core/addon/base.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index a70c1b7961..bbefc4ca1d 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -8,7 +8,6 @@ import inspect import logging import threading import collections -import warnings from uuid import uuid4 from abc import ABCMeta, abstractmethod @@ -598,8 +597,9 @@ class AYONAddon(object): """ if not self.__class__._missing_version_warned: self.__class__._missing_version_warned = True - warnings.warn( - f"Addon '{self.name}' does not have defined version." + print( + f"DEV WARNING: Addon '{self.name}' does not have" + f" defined version." ) return "0.0.0" From e531b94981b76b91197c3590cfd1c5d90a503880 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 13:49:34 +0200 Subject: [PATCH 449/469] make sure '_initializing_addons' is set to 'False' --- client/ayon_core/tools/tray/tray.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/tray/tray.py b/client/ayon_core/tools/tray/tray.py index 957518afe4..eca87eb11d 100644 --- a/client/ayon_core/tools/tray/tray.py +++ b/client/ayon_core/tools/tray/tray.py @@ -447,8 +447,10 @@ class SystemTrayIcon(QtWidgets.QSystemTrayIcon): def initialize_addons(self): self._initializing_addons = True - self.tray_man.initialize_addons() - self._initializing_addons = False + try: + self.tray_man.initialize_addons() + finally: + self._initializing_addons = False def _click_timer_timeout(self): self._click_timer.stop() From 48ec3a73c012bfc38e1483eb0050bf17e0934e36 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:00:13 +0200 Subject: [PATCH 450/469] moved hiero integratoin next to server codebase --- .../hiero/client/ayon_hiero}/__init__.py | 0 .../hiero/client/ayon_hiero}/addon.py | 0 .../hiero/client/ayon_hiero}/api/__init__.py | 0 .../hiero/client/ayon_hiero}/api/constants.py | 0 .../hiero/client/ayon_hiero}/api/events.py | 0 .../hiero/client/ayon_hiero}/api/launchforhiero.py | 0 .../hiero/client/ayon_hiero}/api/lib.py | 0 .../hiero/client/ayon_hiero}/api/menu.py | 0 .../hiero/client/ayon_hiero}/api/otio/__init__.py | 0 .../client/ayon_hiero}/api/otio/hiero_export.py | 0 .../client/ayon_hiero}/api/otio/hiero_import.py | 0 .../hiero/client/ayon_hiero}/api/otio/utils.py | 0 .../hiero/client/ayon_hiero}/api/pipeline.py | 0 .../hiero/client/ayon_hiero}/api/plugin.py | 0 .../api/startup/HieroPlayer/PlayerPresets.hrox | 0 .../api/startup/Icons/1_add_handles_end.png | Bin .../ayon_hiero}/api/startup/Icons/2_add_handles.png | Bin .../client/ayon_hiero}/api/startup/Icons/3D.png | Bin .../api/startup/Icons/3_add_handles_start.png | Bin .../client/ayon_hiero}/api/startup/Icons/4_2D.png | Bin .../client/ayon_hiero}/api/startup/Icons/edit.png | Bin .../client/ayon_hiero}/api/startup/Icons/fusion.png | Bin .../ayon_hiero}/api/startup/Icons/hierarchy.png | Bin .../ayon_hiero}/api/startup/Icons/houdini.png | Bin .../client/ayon_hiero}/api/startup/Icons/layers.psd | Bin .../client/ayon_hiero}/api/startup/Icons/lense.png | Bin .../client/ayon_hiero}/api/startup/Icons/lense1.png | Bin .../client/ayon_hiero}/api/startup/Icons/maya.png | Bin .../client/ayon_hiero}/api/startup/Icons/nuke.png | Bin .../ayon_hiero}/api/startup/Icons/pype_icon.png | Bin .../ayon_hiero}/api/startup/Icons/resolution.png | Bin .../ayon_hiero}/api/startup/Icons/resolution.psd | Bin .../ayon_hiero}/api/startup/Icons/retiming.png | Bin .../ayon_hiero}/api/startup/Icons/retiming.psd | Bin .../client/ayon_hiero}/api/startup/Icons/review.png | Bin .../client/ayon_hiero}/api/startup/Icons/review.psd | Bin .../client/ayon_hiero}/api/startup/Icons/volume.png | Bin .../ayon_hiero}/api/startup/Icons/z_layer_bg.png | Bin .../ayon_hiero}/api/startup/Icons/z_layer_fg.png | Bin .../ayon_hiero}/api/startup/Icons/z_layer_main.png | Bin .../api/startup/Python/Startup/SpreadsheetExport.py | 0 .../api/startup/Python/Startup/Startup.py | 0 .../Python/Startup/otioexporter/OTIOExportTask.py | 0 .../Python/Startup/otioexporter/OTIOExportUI.py | 0 .../startup/Python/Startup/otioexporter/__init__.py | 0 .../api/startup/Python/Startup/project_helpers.py | 0 .../api/startup/Python/Startup/selection_tracker.py | 0 .../api/startup/Python/Startup/setFrameRate.py | 0 .../startup/Python/StartupUI/PimpMySpreadsheet.py | 0 .../api/startup/Python/StartupUI/Purge.py | 0 .../Python/StartupUI/nukeStyleKeyboardShortcuts.py | 0 .../Python/StartupUI/otioimporter/OTIOImport.py | 0 .../Python/StartupUI/otioimporter/__init__.py | 0 .../api/startup/Python/StartupUI/setPosterFrame.py | 0 .../pipeline.xml | 0 .../pipeline.xml | 0 .../pipeline.xml | 0 .../hiero/client/ayon_hiero}/api/style.css | 0 .../hiero/client/ayon_hiero}/api/tags.py | 0 .../hiero/client/ayon_hiero}/api/workio.py | 0 .../ayon_hiero}/plugins/create/create_shot_clip.py | 0 .../client/ayon_hiero}/plugins/load/load_clip.py | 0 .../client/ayon_hiero}/plugins/load/load_effects.py | 0 .../plugins/publish/collect_clip_effects.py | 0 .../plugins/publish/collect_frame_tag_instances.py | 0 .../plugins/publish/collect_tag_tasks.py | 0 .../plugins/publish/extract_clip_effects.py | 0 .../ayon_hiero}/plugins/publish/extract_frames.py | 0 .../plugins/publish/extract_thumbnail.py | 0 .../publish/integrate_version_up_workfile.py | 0 .../plugins/publish/precollect_instances.py | 0 .../plugins/publish/precollect_workfile.py | 0 .../publish_old_workflow/collect_tag_comments.py | 0 .../publish_old_workflow/precollect_retime.py | 0 .../ayon_hiero}/vendor/google/protobuf/__init__.py | 0 .../ayon_hiero}/vendor/google/protobuf/any_pb2.py | 0 .../ayon_hiero}/vendor/google/protobuf/api_pb2.py | 0 .../vendor/google/protobuf/compiler/__init__.py | 0 .../vendor/google/protobuf/compiler/plugin_pb2.py | 0 .../vendor/google/protobuf/descriptor.py | 0 .../vendor/google/protobuf/descriptor_database.py | 0 .../vendor/google/protobuf/descriptor_pb2.py | 0 .../vendor/google/protobuf/descriptor_pool.py | 0 .../vendor/google/protobuf/duration_pb2.py | 0 .../ayon_hiero}/vendor/google/protobuf/empty_pb2.py | 0 .../vendor/google/protobuf/field_mask_pb2.py | 0 .../vendor/google/protobuf/internal/__init__.py | 0 .../google/protobuf/internal/_parameterized.py | 0 .../google/protobuf/internal/api_implementation.py | 0 .../vendor/google/protobuf/internal/builder.py | 0 .../vendor/google/protobuf/internal/containers.py | 0 .../vendor/google/protobuf/internal/decoder.py | 0 .../vendor/google/protobuf/internal/encoder.py | 0 .../google/protobuf/internal/enum_type_wrapper.py | 0 .../google/protobuf/internal/extension_dict.py | 0 .../google/protobuf/internal/message_listener.py | 0 .../protobuf/internal/message_set_extensions_pb2.py | 0 .../protobuf/internal/missing_enum_values_pb2.py | 0 .../internal/more_extensions_dynamic_pb2.py | 0 .../google/protobuf/internal/more_extensions_pb2.py | 0 .../google/protobuf/internal/more_messages_pb2.py | 0 .../google/protobuf/internal/no_package_pb2.py | 0 .../google/protobuf/internal/python_message.py | 0 .../google/protobuf/internal/type_checkers.py | 0 .../google/protobuf/internal/well_known_types.py | 0 .../vendor/google/protobuf/internal/wire_format.py | 0 .../vendor/google/protobuf/json_format.py | 0 .../ayon_hiero}/vendor/google/protobuf/message.py | 0 .../vendor/google/protobuf/message_factory.py | 0 .../vendor/google/protobuf/proto_builder.py | 0 .../vendor/google/protobuf/pyext/__init__.py | 0 .../vendor/google/protobuf/pyext/cpp_message.py | 0 .../vendor/google/protobuf/pyext/python_pb2.py | 0 .../vendor/google/protobuf/reflection.py | 0 .../ayon_hiero}/vendor/google/protobuf/service.py | 0 .../vendor/google/protobuf/service_reflection.py | 0 .../vendor/google/protobuf/source_context_pb2.py | 0 .../vendor/google/protobuf/struct_pb2.py | 0 .../vendor/google/protobuf/symbol_database.py | 0 .../vendor/google/protobuf/text_encoding.py | 0 .../vendor/google/protobuf/text_format.py | 0 .../vendor/google/protobuf/timestamp_pb2.py | 0 .../ayon_hiero}/vendor/google/protobuf/type_pb2.py | 0 .../vendor/google/protobuf/util/__init__.py | 0 .../vendor/google/protobuf/util/json_format_pb2.py | 0 .../google/protobuf/util/json_format_proto3_pb2.py | 0 .../vendor/google/protobuf/wrappers_pb2.py | 0 127 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/addon.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/constants.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/events.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/launchforhiero.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/lib.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/menu.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/otio/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/otio/hiero_export.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/otio/hiero_import.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/otio/utils.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/pipeline.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/plugin.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/HieroPlayer/PlayerPresets.hrox (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/1_add_handles_end.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/2_add_handles.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/3D.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/3_add_handles_start.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/4_2D.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/edit.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/fusion.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/hierarchy.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/houdini.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/layers.psd (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/lense.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/lense1.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/maya.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/nuke.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/pype_icon.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/resolution.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/resolution.psd (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/retiming.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/retiming.psd (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/review.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/review.psd (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/volume.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/z_layer_bg.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/z_layer_fg.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Icons/z_layer_main.png (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/SpreadsheetExport.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/Startup.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/otioexporter/OTIOExportTask.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/otioexporter/OTIOExportUI.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/otioexporter/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/project_helpers.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/selection_tracker.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/Startup/setFrameRate.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/PimpMySpreadsheet.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/Purge.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/nukeStyleKeyboardShortcuts.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/otioimporter/OTIOImport.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/otioimporter/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/Python/StartupUI/setPosterFrame.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/TaskPresets/10.5/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/TaskPresets/11.1/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/startup/TaskPresets/11.2/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/style.css (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/tags.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/api/workio.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/create/create_shot_clip.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/load/load_clip.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/load/load_effects.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/collect_clip_effects.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/collect_frame_tag_instances.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/collect_tag_tasks.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/extract_clip_effects.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/extract_frames.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/extract_thumbnail.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/integrate_version_up_workfile.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/precollect_instances.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish/precollect_workfile.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish_old_workflow/collect_tag_comments.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/plugins/publish_old_workflow/precollect_retime.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/any_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/api_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/compiler/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/compiler/plugin_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/descriptor.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/descriptor_database.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/descriptor_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/descriptor_pool.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/duration_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/empty_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/field_mask_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/_parameterized.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/api_implementation.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/builder.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/containers.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/decoder.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/encoder.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/enum_type_wrapper.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/extension_dict.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/message_listener.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/message_set_extensions_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/missing_enum_values_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/more_extensions_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/more_messages_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/no_package_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/python_message.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/type_checkers.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/well_known_types.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/internal/wire_format.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/json_format.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/message.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/message_factory.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/proto_builder.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/pyext/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/pyext/cpp_message.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/pyext/python_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/reflection.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/service.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/service_reflection.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/source_context_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/struct_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/symbol_database.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/text_encoding.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/text_format.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/timestamp_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/type_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/util/__init__.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/util/json_format_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/util/json_format_proto3_pb2.py (100%) rename {client/ayon_core/hosts/hiero => server_addon/hiero/client/ayon_hiero}/vendor/google/protobuf/wrappers_pb2.py (100%) diff --git a/client/ayon_core/hosts/hiero/__init__.py b/server_addon/hiero/client/ayon_hiero/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/__init__.py rename to server_addon/hiero/client/ayon_hiero/__init__.py diff --git a/client/ayon_core/hosts/hiero/addon.py b/server_addon/hiero/client/ayon_hiero/addon.py similarity index 100% rename from client/ayon_core/hosts/hiero/addon.py rename to server_addon/hiero/client/ayon_hiero/addon.py diff --git a/client/ayon_core/hosts/hiero/api/__init__.py b/server_addon/hiero/client/ayon_hiero/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/__init__.py rename to server_addon/hiero/client/ayon_hiero/api/__init__.py diff --git a/client/ayon_core/hosts/hiero/api/constants.py b/server_addon/hiero/client/ayon_hiero/api/constants.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/constants.py rename to server_addon/hiero/client/ayon_hiero/api/constants.py diff --git a/client/ayon_core/hosts/hiero/api/events.py b/server_addon/hiero/client/ayon_hiero/api/events.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/events.py rename to server_addon/hiero/client/ayon_hiero/api/events.py diff --git a/client/ayon_core/hosts/hiero/api/launchforhiero.py b/server_addon/hiero/client/ayon_hiero/api/launchforhiero.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/launchforhiero.py rename to server_addon/hiero/client/ayon_hiero/api/launchforhiero.py diff --git a/client/ayon_core/hosts/hiero/api/lib.py b/server_addon/hiero/client/ayon_hiero/api/lib.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/lib.py rename to server_addon/hiero/client/ayon_hiero/api/lib.py diff --git a/client/ayon_core/hosts/hiero/api/menu.py b/server_addon/hiero/client/ayon_hiero/api/menu.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/menu.py rename to server_addon/hiero/client/ayon_hiero/api/menu.py diff --git a/client/ayon_core/hosts/hiero/api/otio/__init__.py b/server_addon/hiero/client/ayon_hiero/api/otio/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/otio/__init__.py rename to server_addon/hiero/client/ayon_hiero/api/otio/__init__.py diff --git a/client/ayon_core/hosts/hiero/api/otio/hiero_export.py b/server_addon/hiero/client/ayon_hiero/api/otio/hiero_export.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/otio/hiero_export.py rename to server_addon/hiero/client/ayon_hiero/api/otio/hiero_export.py diff --git a/client/ayon_core/hosts/hiero/api/otio/hiero_import.py b/server_addon/hiero/client/ayon_hiero/api/otio/hiero_import.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/otio/hiero_import.py rename to server_addon/hiero/client/ayon_hiero/api/otio/hiero_import.py diff --git a/client/ayon_core/hosts/hiero/api/otio/utils.py b/server_addon/hiero/client/ayon_hiero/api/otio/utils.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/otio/utils.py rename to server_addon/hiero/client/ayon_hiero/api/otio/utils.py diff --git a/client/ayon_core/hosts/hiero/api/pipeline.py b/server_addon/hiero/client/ayon_hiero/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/pipeline.py rename to server_addon/hiero/client/ayon_hiero/api/pipeline.py diff --git a/client/ayon_core/hosts/hiero/api/plugin.py b/server_addon/hiero/client/ayon_hiero/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/plugin.py rename to server_addon/hiero/client/ayon_hiero/api/plugin.py diff --git a/client/ayon_core/hosts/hiero/api/startup/HieroPlayer/PlayerPresets.hrox b/server_addon/hiero/client/ayon_hiero/api/startup/HieroPlayer/PlayerPresets.hrox similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/HieroPlayer/PlayerPresets.hrox rename to server_addon/hiero/client/ayon_hiero/api/startup/HieroPlayer/PlayerPresets.hrox diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/1_add_handles_end.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/1_add_handles_end.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/1_add_handles_end.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/1_add_handles_end.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/2_add_handles.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/2_add_handles.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/2_add_handles.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/2_add_handles.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/3D.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/3D.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/3D.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/3D.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/3_add_handles_start.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/3_add_handles_start.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/3_add_handles_start.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/3_add_handles_start.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/4_2D.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/4_2D.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/4_2D.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/4_2D.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/edit.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/edit.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/edit.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/edit.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/fusion.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/fusion.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/fusion.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/fusion.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/hierarchy.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/hierarchy.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/hierarchy.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/hierarchy.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/houdini.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/houdini.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/houdini.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/houdini.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/layers.psd b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/layers.psd similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/layers.psd rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/layers.psd diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/lense.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/lense.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/lense.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/lense.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/lense1.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/lense1.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/lense1.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/lense1.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/maya.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/maya.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/maya.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/maya.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/nuke.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/nuke.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/nuke.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/nuke.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/pype_icon.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/pype_icon.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/pype_icon.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/pype_icon.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/resolution.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/resolution.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/resolution.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/resolution.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/resolution.psd b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/resolution.psd similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/resolution.psd rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/resolution.psd diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/retiming.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/retiming.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/retiming.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/retiming.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/retiming.psd b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/retiming.psd similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/retiming.psd rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/retiming.psd diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/review.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/review.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/review.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/review.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/review.psd b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/review.psd similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/review.psd rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/review.psd diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/volume.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/volume.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/volume.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/volume.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_bg.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_bg.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_bg.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_bg.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_fg.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_fg.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_fg.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_fg.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_main.png b/server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_main.png similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Icons/z_layer_main.png rename to server_addon/hiero/client/ayon_hiero/api/startup/Icons/z_layer_main.png diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/SpreadsheetExport.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/SpreadsheetExport.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/SpreadsheetExport.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/SpreadsheetExport.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/Startup.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/Startup.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/__init__.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/otioexporter/__init__.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/__init__.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/project_helpers.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/project_helpers.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/project_helpers.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/project_helpers.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/selection_tracker.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/selection_tracker.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/selection_tracker.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/selection_tracker.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/Startup/setFrameRate.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/setFrameRate.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/Startup/setFrameRate.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/setFrameRate.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/PimpMySpreadsheet.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/PimpMySpreadsheet.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/PimpMySpreadsheet.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/PimpMySpreadsheet.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/Purge.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/Purge.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/Purge.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/Purge.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/nukeStyleKeyboardShortcuts.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/nukeStyleKeyboardShortcuts.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/nukeStyleKeyboardShortcuts.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/nukeStyleKeyboardShortcuts.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/otioimporter/OTIOImport.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/OTIOImport.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/otioimporter/OTIOImport.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/OTIOImport.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/otioimporter/__init__.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/otioimporter/__init__.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py diff --git a/client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/setPosterFrame.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/setPosterFrame.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/Python/StartupUI/setPosterFrame.py rename to server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/setPosterFrame.py diff --git a/client/ayon_core/hosts/hiero/api/startup/TaskPresets/10.5/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml b/server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/10.5/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/TaskPresets/10.5/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml rename to server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/10.5/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml diff --git a/client/ayon_core/hosts/hiero/api/startup/TaskPresets/11.1/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml b/server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/11.1/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/TaskPresets/11.1/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml rename to server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/11.1/Processors/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml diff --git a/client/ayon_core/hosts/hiero/api/startup/TaskPresets/11.2/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml b/server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/11.2/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml similarity index 100% rename from client/ayon_core/hosts/hiero/api/startup/TaskPresets/11.2/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml rename to server_addon/hiero/client/ayon_hiero/api/startup/TaskPresets/11.2/hiero.exporters.FnShotProcessor.ShotProcessor/pipeline.xml diff --git a/client/ayon_core/hosts/hiero/api/style.css b/server_addon/hiero/client/ayon_hiero/api/style.css similarity index 100% rename from client/ayon_core/hosts/hiero/api/style.css rename to server_addon/hiero/client/ayon_hiero/api/style.css diff --git a/client/ayon_core/hosts/hiero/api/tags.py b/server_addon/hiero/client/ayon_hiero/api/tags.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/tags.py rename to server_addon/hiero/client/ayon_hiero/api/tags.py diff --git a/client/ayon_core/hosts/hiero/api/workio.py b/server_addon/hiero/client/ayon_hiero/api/workio.py similarity index 100% rename from client/ayon_core/hosts/hiero/api/workio.py rename to server_addon/hiero/client/ayon_hiero/api/workio.py diff --git a/client/ayon_core/hosts/hiero/plugins/create/create_shot_clip.py b/server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/create/create_shot_clip.py rename to server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py diff --git a/client/ayon_core/hosts/hiero/plugins/load/load_clip.py b/server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/load/load_clip.py rename to server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py diff --git a/client/ayon_core/hosts/hiero/plugins/load/load_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/load/load_effects.py rename to server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/collect_clip_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/collect_clip_effects.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/collect_frame_tag_instances.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_frame_tag_instances.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/collect_frame_tag_instances.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/collect_frame_tag_instances.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/collect_tag_tasks.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_tag_tasks.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/collect_tag_tasks.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/collect_tag_tasks.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/extract_clip_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/extract_clip_effects.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/extract_frames.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_frames.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/extract_frames.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/extract_frames.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/extract_thumbnail.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_thumbnail.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/extract_thumbnail.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/extract_thumbnail.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/integrate_version_up_workfile.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/integrate_version_up_workfile.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/integrate_version_up_workfile.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/integrate_version_up_workfile.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/precollect_instances.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/precollect_instances.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish/precollect_workfile.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish/precollect_workfile.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish_old_workflow/collect_tag_comments.py b/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/collect_tag_comments.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish_old_workflow/collect_tag_comments.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/collect_tag_comments.py diff --git a/client/ayon_core/hosts/hiero/plugins/publish_old_workflow/precollect_retime.py b/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py similarity index 100% rename from client/ayon_core/hosts/hiero/plugins/publish_old_workflow/precollect_retime.py rename to server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/__init__.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/__init__.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/__init__.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/any_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/any_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/any_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/any_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/api_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/api_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/api_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/api_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/compiler/__init__.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/compiler/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/compiler/__init__.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/compiler/__init__.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/compiler/plugin_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/compiler/plugin_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/compiler/plugin_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/compiler/plugin_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_database.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_database.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_database.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_database.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_pool.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_pool.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/descriptor_pool.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/descriptor_pool.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/duration_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/duration_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/duration_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/duration_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/empty_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/empty_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/empty_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/empty_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/field_mask_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/field_mask_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/field_mask_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/field_mask_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/__init__.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/__init__.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/__init__.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/_parameterized.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/_parameterized.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/_parameterized.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/_parameterized.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/api_implementation.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/api_implementation.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/api_implementation.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/api_implementation.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/builder.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/builder.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/builder.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/builder.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/containers.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/containers.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/containers.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/containers.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/decoder.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/decoder.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/decoder.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/decoder.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/encoder.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/encoder.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/encoder.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/encoder.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/enum_type_wrapper.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/enum_type_wrapper.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/enum_type_wrapper.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/enum_type_wrapper.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/extension_dict.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/extension_dict.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/extension_dict.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/extension_dict.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/message_listener.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/message_listener.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/message_listener.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/message_listener.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/message_set_extensions_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/message_set_extensions_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/message_set_extensions_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/message_set_extensions_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/missing_enum_values_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/missing_enum_values_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/missing_enum_values_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/missing_enum_values_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_extensions_dynamic_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_extensions_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_extensions_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_extensions_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_extensions_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_messages_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_messages_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/more_messages_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/more_messages_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/no_package_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/no_package_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/no_package_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/no_package_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/python_message.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/python_message.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/python_message.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/python_message.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/type_checkers.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/type_checkers.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/type_checkers.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/type_checkers.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/well_known_types.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/well_known_types.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/well_known_types.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/well_known_types.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/wire_format.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/wire_format.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/internal/wire_format.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/internal/wire_format.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/json_format.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/json_format.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/json_format.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/json_format.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/message.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/message.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/message.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/message.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/message_factory.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/message_factory.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/message_factory.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/message_factory.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/proto_builder.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/proto_builder.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/proto_builder.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/proto_builder.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/__init__.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/__init__.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/__init__.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/cpp_message.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/cpp_message.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/cpp_message.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/cpp_message.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/python_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/python_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/pyext/python_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/pyext/python_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/reflection.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/reflection.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/reflection.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/reflection.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/service.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/service.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/service.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/service.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/service_reflection.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/service_reflection.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/service_reflection.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/service_reflection.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/source_context_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/source_context_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/source_context_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/source_context_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/struct_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/struct_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/struct_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/struct_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/symbol_database.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/symbol_database.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/symbol_database.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/symbol_database.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/text_encoding.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/text_encoding.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/text_encoding.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/text_encoding.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/text_format.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/text_format.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/text_format.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/text_format.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/timestamp_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/timestamp_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/timestamp_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/timestamp_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/type_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/type_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/type_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/type_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/util/__init__.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/__init__.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/util/__init__.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/__init__.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/util/json_format_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/json_format_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/util/json_format_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/json_format_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/util/json_format_proto3_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/json_format_proto3_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/util/json_format_proto3_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/util/json_format_proto3_pb2.py diff --git a/client/ayon_core/hosts/hiero/vendor/google/protobuf/wrappers_pb2.py b/server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/wrappers_pb2.py similarity index 100% rename from client/ayon_core/hosts/hiero/vendor/google/protobuf/wrappers_pb2.py rename to server_addon/hiero/client/ayon_hiero/vendor/google/protobuf/wrappers_pb2.py From 21c02e023cf9d894927ebf2ef8f084050474e63e Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:02:01 +0200 Subject: [PATCH 451/469] added more info to package py and added version.py --- server_addon/hiero/client/ayon_hiero/__init__.py | 3 +++ server_addon/hiero/client/ayon_hiero/addon.py | 3 +++ server_addon/hiero/client/ayon_hiero/version.py | 3 +++ server_addon/hiero/package.py | 8 +++++++- 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 server_addon/hiero/client/ayon_hiero/version.py diff --git a/server_addon/hiero/client/ayon_hiero/__init__.py b/server_addon/hiero/client/ayon_hiero/__init__.py index e6744d5aec..73a2343f66 100644 --- a/server_addon/hiero/client/ayon_hiero/__init__.py +++ b/server_addon/hiero/client/ayon_hiero/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( HIERO_ROOT_DIR, HieroAddon, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "HIERO_ROOT_DIR", "HieroAddon", ) diff --git a/server_addon/hiero/client/ayon_hiero/addon.py b/server_addon/hiero/client/ayon_hiero/addon.py index f612493ca1..1d2c36c0b3 100644 --- a/server_addon/hiero/client/ayon_hiero/addon.py +++ b/server_addon/hiero/client/ayon_hiero/addon.py @@ -2,11 +2,14 @@ import os import platform from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + HIERO_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) class HieroAddon(AYONAddon, IHostAddon): name = "hiero" + version = __version__ host_name = "hiero" def add_implementation_envs(self, env, _app): diff --git a/server_addon/hiero/client/ayon_hiero/version.py b/server_addon/hiero/client/ayon_hiero/version.py new file mode 100644 index 0000000000..6a2d180afb --- /dev/null +++ b/server_addon/hiero/client/ayon_hiero/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'hiero' version.""" +__version__ = "0.2.0" diff --git a/server_addon/hiero/package.py b/server_addon/hiero/package.py index 54c2f74fa7..1948d50e6d 100644 --- a/server_addon/hiero/package.py +++ b/server_addon/hiero/package.py @@ -1,3 +1,9 @@ name = "hiero" title = "Hiero" -version = "0.1.3" +version = "0.2.0" +client_dir = "ayon_hiero" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From a07820cb8cac98cb43f37eb9fe1976e9619cf0d5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:05:23 +0200 Subject: [PATCH 452/469] fix imports --- server_addon/hiero/client/ayon_hiero/api/lib.py | 8 ++++---- server_addon/hiero/client/ayon_hiero/api/pipeline.py | 8 ++++---- server_addon/hiero/client/ayon_hiero/api/plugin.py | 2 +- .../ayon_hiero/api/startup/Python/Startup/Startup.py | 6 +++--- .../startup/Python/Startup/otioexporter/OTIOExportTask.py | 2 +- .../startup/Python/Startup/otioexporter/OTIOExportUI.py | 2 +- .../api/startup/Python/StartupUI/otioimporter/__init__.py | 2 +- .../client/ayon_hiero/plugins/create/create_shot_clip.py | 4 ++-- .../hiero/client/ayon_hiero/plugins/load/load_clip.py | 2 +- .../hiero/client/ayon_hiero/plugins/load/load_effects.py | 2 +- .../ayon_hiero/plugins/publish/extract_clip_effects.py | 1 - .../ayon_hiero/plugins/publish/precollect_instances.py | 4 ++-- .../ayon_hiero/plugins/publish/precollect_workfile.py | 2 +- .../plugins/publish_old_workflow/precollect_retime.py | 2 +- 14 files changed, 23 insertions(+), 24 deletions(-) diff --git a/server_addon/hiero/client/ayon_hiero/api/lib.py b/server_addon/hiero/client/ayon_hiero/api/lib.py index 456a68f125..2a6038fb98 100644 --- a/server_addon/hiero/client/ayon_hiero/api/lib.py +++ b/server_addon/hiero/client/ayon_hiero/api/lib.py @@ -453,19 +453,19 @@ def get_track_openpype_data(track, container_name=None): ) -@deprecated("ayon_core.hosts.hiero.api.lib.get_trackitem_openpype_tag") +@deprecated("ayon_hiero.api.lib.get_trackitem_openpype_tag") def get_track_item_pype_tag(track_item): # backward compatibility alias return get_trackitem_openpype_tag(track_item) -@deprecated("ayon_core.hosts.hiero.api.lib.set_trackitem_openpype_tag") +@deprecated("ayon_hiero.api.lib.set_trackitem_openpype_tag") def set_track_item_pype_tag(track_item, data=None): # backward compatibility alias return set_trackitem_openpype_tag(track_item, data) -@deprecated("ayon_core.hosts.hiero.api.lib.get_trackitem_openpype_data") +@deprecated("ayon_hiero.api.lib.get_trackitem_openpype_data") def get_track_item_pype_data(track_item): # backward compatibility alias return get_trackitem_openpype_data(track_item) @@ -802,7 +802,7 @@ class PublishAction(QtWidgets.QAction): # # ''' # import hiero.core -# from ayon_core.hosts.nuke.api.lib import ( +# from ayon_nuke.api.lib import ( # BuildWorkfile, # imprint # ) diff --git a/server_addon/hiero/client/ayon_hiero/api/pipeline.py b/server_addon/hiero/client/ayon_hiero/api/pipeline.py index 327a4ae29c..4a8930ac39 100644 --- a/server_addon/hiero/client/ayon_hiero/api/pipeline.py +++ b/server_addon/hiero/client/ayon_hiero/api/pipeline.py @@ -308,9 +308,9 @@ def reload_config(): import importlib for module in ( - "ayon_core.hosts.hiero.lib", - "ayon_core.hosts.hiero.menu", - "ayon_core.hosts.hiero.tags" + "ayon_hiero.lib", + "ayon_hiero.menu", + "ayon_hiero.tags" ): log.info("Reloading module: {}...".format(module)) try: @@ -328,7 +328,7 @@ def on_pyblish_instance_toggled(instance, old_value, new_value): log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) - from ayon_core.hosts.hiero.api import ( + from ayon_hiero.api import ( get_trackitem_openpype_tag, set_publish_attribute ) diff --git a/server_addon/hiero/client/ayon_hiero/api/plugin.py b/server_addon/hiero/client/ayon_hiero/api/plugin.py index 1353673b31..b9f42a88e0 100644 --- a/server_addon/hiero/client/ayon_hiero/api/plugin.py +++ b/server_addon/hiero/client/ayon_hiero/api/plugin.py @@ -600,7 +600,7 @@ class Creator(LegacyCreator): def __init__(self, *args, **kwargs): super(Creator, self).__init__(*args, **kwargs) - import ayon_core.hosts.hiero.api as phiero + import ayon_hiero.api as phiero self.presets = get_current_project_settings()[ "hiero"]["create"].get(self.__class__.__name__, {}) diff --git a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py index cffab8067c..c916bf37e9 100644 --- a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py +++ b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/Startup.py @@ -2,11 +2,11 @@ import traceback # activate hiero from pype from ayon_core.pipeline import install_host -import ayon_core.hosts.hiero.api as phiero +import ayon_hiero.api as phiero install_host(phiero) try: - __import__("ayon_core.hosts.hiero.api") + __import__("ayon_hiero.api") __import__("pyblish") except ImportError as e: @@ -15,5 +15,5 @@ except ImportError as e: else: # Setup integration - import ayon_core.hosts.hiero.api as phiero + import ayon_hiero.api as phiero phiero.lib.setup() diff --git a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py index bd5048a832..d4cb342c72 100644 --- a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py +++ b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportTask.py @@ -8,7 +8,7 @@ import hiero.core from hiero.core import util import opentimelineio as otio -from ayon_core.hosts.hiero.api.otio import hiero_export +from ayon_hiero.api.otio import hiero_export class OTIOExportTask(hiero.core.TaskBase): diff --git a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py index 25aa8bb0cf..131b385f53 100644 --- a/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py +++ b/server_addon/hiero/client/ayon_hiero/api/startup/Python/Startup/otioexporter/OTIOExportUI.py @@ -22,7 +22,7 @@ except ImportError: FormLayout = QFormLayout # lint:ok -from ayon_core.hosts.hiero.api.otio import hiero_export +from ayon_hiero.api.otio import hiero_export class OTIOExportUI(hiero.ui.TaskUIBase): def __init__(self, preset): diff --git a/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py index 29507db975..c0f1cc9c67 100644 --- a/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py +++ b/server_addon/hiero/client/ayon_hiero/api/startup/Python/StartupUI/otioimporter/__init__.py @@ -9,7 +9,7 @@ import hiero.core import PySide2.QtWidgets as qw -from ayon_core.hosts.hiero.api.otio.hiero_import import load_otio +from ayon_hiero.api.otio.hiero_import import load_otio class OTIOProjectSelect(qw.QDialog): diff --git a/server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py b/server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py index 1fc808fdd1..201cf382e2 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/create/create_shot_clip.py @@ -1,6 +1,6 @@ from copy import deepcopy -import ayon_core.hosts.hiero.api as phiero -# from ayon_core.hosts.hiero.api import plugin, lib +import ayon_hiero.api as phiero +# from ayon_hiero.api import plugin, lib # reload(lib) # reload(plugin) # reload(phiero) diff --git a/server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py b/server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py index 715e8c508e..d93730c735 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/load/load_clip.py @@ -5,7 +5,7 @@ from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, IMAGE_EXTENSIONS ) -import ayon_core.hosts.hiero.api as phiero +import ayon_hiero.api as phiero class LoadClip(phiero.SequenceLoader): diff --git a/server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py index 92aa2de325..24130f7485 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/load/load_effects.py @@ -7,7 +7,7 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.hiero import api as phiero +from ayon_hiero import api as phiero from ayon_core.lib import Logger diff --git a/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py index 25b52968fa..7ee979c37a 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/publish/extract_clip_effects.py @@ -1,4 +1,3 @@ -# from ayon_core import plugins import os import json import pyblish.api diff --git a/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py index b7a508f0b5..fa2c56182e 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_instances.py @@ -3,8 +3,8 @@ import pyblish from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID from ayon_core.pipeline.editorial import is_overlapping_otio_ranges -from ayon_core.hosts.hiero import api as phiero -from ayon_core.hosts.hiero.api.otio import hiero_export +from ayon_hiero import api as phiero +from ayon_hiero.api.otio import hiero_export import hiero # # developer reload modules diff --git a/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py index 0b6b34ea6c..1dd21b3f21 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/publish/precollect_workfile.py @@ -7,7 +7,7 @@ from qtpy.QtGui import QPixmap import hiero.ui -from ayon_core.hosts.hiero.api.otio import hiero_export +from ayon_hiero.api.otio import hiero_export class PrecollectWorkfile(pyblish.api.ContextPlugin): diff --git a/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py b/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py index 8503a0b6a7..c511b40abc 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/publish_old_workflow/precollect_retime.py @@ -1,7 +1,7 @@ from pyblish import api import hiero import math -from ayon_core.hosts.hiero.api.otio.hiero_export import create_otio_time_range +from ayon_hiero.api.otio.hiero_export import create_otio_time_range class PrecollectRetime(api.InstancePlugin): """Calculate Retiming of selected track items.""" From 2b7338b97af79c8581c485af5d0ca44159fb28ff Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:08:49 +0200 Subject: [PATCH 453/469] added settings category --- .../client/ayon_hiero/plugins/publish/collect_clip_effects.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py b/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py index bfc63f2551..bd8af3b51a 100644 --- a/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py +++ b/server_addon/hiero/client/ayon_hiero/plugins/publish/collect_clip_effects.py @@ -9,6 +9,7 @@ class CollectClipEffects(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder - 0.078 label = "Collect Clip Effects Instances" families = ["clip"] + settings_category = "hiero" effect_categories = [] From 9457a82ce66227929e17b231efa3f85675d79466 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:09:17 +0200 Subject: [PATCH 454/469] added hiero milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d2c072c50c..a8721c55b6 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -55,6 +55,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), "fusion": VersionInfo(0, 2, 0), + "hiero": VersionInfo(0, 2, 0), "max": VersionInfo(0, 2, 0), "photoshop": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), From 87fa03bbb81772d3270e89c0c2f73bcf83f30c25 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:11:48 +0200 Subject: [PATCH 455/469] remove settings for not existing plugins --- .../hiero/server/settings/publish_plugins.py | 39 ------------------- 1 file changed, 39 deletions(-) diff --git a/server_addon/hiero/server/settings/publish_plugins.py b/server_addon/hiero/server/settings/publish_plugins.py index 0e43d4ce3a..632bb15241 100644 --- a/server_addon/hiero/server/settings/publish_plugins.py +++ b/server_addon/hiero/server/settings/publish_plugins.py @@ -7,13 +7,6 @@ from ayon_server.settings import ( ) -class CollectInstanceVersionModel(BaseSettingsModel): - enabled: bool = SettingsField( - True, - title="Enabled" - ) - - class CollectClipEffectsDefModel(BaseSettingsModel): _layout = "expanded" name: str = SettingsField("", title="Name") @@ -38,46 +31,14 @@ class CollectClipEffectsModel(BaseSettingsModel): return value -class ExtractReviewCutUpVideoModel(BaseSettingsModel): - enabled: bool = SettingsField( - True, - title="Enabled" - ) - tags_addition: list[str] = SettingsField( - default_factory=list, - title="Additional tags" - ) - - class PublishPluginsModel(BaseSettingsModel): - CollectInstanceVersion: CollectInstanceVersionModel = SettingsField( - default_factory=CollectInstanceVersionModel, - title="Collect Instance Version" - ) CollectClipEffects: CollectClipEffectsModel = SettingsField( default_factory=CollectClipEffectsModel, title="Collect Clip Effects" ) - """# TODO: enhance settings with host api: - Rename class name and plugin name - to match title (it makes more sense) - """ - ExtractReviewCutUpVideo: ExtractReviewCutUpVideoModel = SettingsField( - default_factory=ExtractReviewCutUpVideoModel, - title="Exctract Review Trim" - ) DEFAULT_PUBLISH_PLUGIN_SETTINGS = { - "CollectInstanceVersion": { - "enabled": False, - }, - "ExtractReviewCutUpVideo": { - "enabled": True, - "tags_addition": [ - "review" - ] - }, "CollectClipEffectsModel": { "effect_categories": [] } From ceab71cfa97cc8498beb2e4656e659c5a52a2ac5 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:13:47 +0200 Subject: [PATCH 456/469] renamed 'HIERO_ROOT_DIR' to 'HIERO_ADDON_ROOT' --- server_addon/hiero/client/ayon_hiero/__init__.py | 4 ++-- server_addon/hiero/client/ayon_hiero/addon.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server_addon/hiero/client/ayon_hiero/__init__.py b/server_addon/hiero/client/ayon_hiero/__init__.py index 73a2343f66..2dc490c1e9 100644 --- a/server_addon/hiero/client/ayon_hiero/__init__.py +++ b/server_addon/hiero/client/ayon_hiero/__init__.py @@ -1,6 +1,6 @@ from .version import __version__ from .addon import ( - HIERO_ROOT_DIR, + HIERO_ADDON_ROOT, HieroAddon, ) @@ -8,6 +8,6 @@ from .addon import ( __all__ = ( "__version__", - "HIERO_ROOT_DIR", + "HIERO_ADDON_ROOT", "HieroAddon", ) diff --git a/server_addon/hiero/client/ayon_hiero/addon.py b/server_addon/hiero/client/ayon_hiero/addon.py index 1d2c36c0b3..671e29151b 100644 --- a/server_addon/hiero/client/ayon_hiero/addon.py +++ b/server_addon/hiero/client/ayon_hiero/addon.py @@ -4,7 +4,7 @@ from ayon_core.addon import AYONAddon, IHostAddon from .version import __version__ -HIERO_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +HIERO_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class HieroAddon(AYONAddon, IHostAddon): @@ -15,7 +15,7 @@ class HieroAddon(AYONAddon, IHostAddon): def add_implementation_envs(self, env, _app): # Add requirements to HIERO_PLUGIN_PATH new_hiero_paths = [ - os.path.join(HIERO_ROOT_DIR, "api", "startup") + os.path.join(HIERO_ADDON_ROOT, "api", "startup") ] old_hiero_path = env.get("HIERO_PLUGIN_PATH") or "" for path in old_hiero_path.split(os.pathsep): @@ -39,7 +39,7 @@ class HieroAddon(AYONAddon, IHostAddon): python_path_parts = [] if python_path: python_path_parts = python_path.split(os.pathsep) - vendor_path = os.path.join(HIERO_ROOT_DIR, "vendor") + vendor_path = os.path.join(HIERO_ADDON_ROOT, "vendor") python_path_parts.insert(0, vendor_path) env["PYTHONPATH"] = os.pathsep.join(python_path_parts) From 6cf485c733f322ffeb677a21e5b7cce63ec72f4a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:14:44 +0200 Subject: [PATCH 457/469] use 'HIERO_ADDON_ROOT' in api --- server_addon/hiero/client/ayon_hiero/api/pipeline.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server_addon/hiero/client/ayon_hiero/api/pipeline.py b/server_addon/hiero/client/ayon_hiero/api/pipeline.py index 4a8930ac39..58045c4331 100644 --- a/server_addon/hiero/client/ayon_hiero/api/pipeline.py +++ b/server_addon/hiero/client/ayon_hiero/api/pipeline.py @@ -6,7 +6,9 @@ import os import contextlib from collections import OrderedDict +import hiero from pyblish import api as pyblish + from ayon_core.lib import Logger from ayon_core.pipeline import ( schema, @@ -18,15 +20,14 @@ from ayon_core.pipeline import ( AYON_CONTAINER_ID, ) from ayon_core.tools.utils import host_tools +from ayon_hiero import HIERO_ADDON_ROOT + from . import lib, menu, events -import hiero log = Logger.get_logger(__name__) # plugin paths -API_DIR = os.path.dirname(os.path.abspath(__file__)) -HOST_DIR = os.path.dirname(API_DIR) -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(HIERO_ADDON_ROOT, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish").replace("\\", "/") LOAD_PATH = os.path.join(PLUGINS_DIR, "load").replace("\\", "/") CREATE_PATH = os.path.join(PLUGINS_DIR, "create").replace("\\", "/") From 3128c2fc673e7049d977d3e996b93be5f6f32c1b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:25:00 +0200 Subject: [PATCH 458/469] fix ruff ignore --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 63d7434c06..dcb2c65417 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" exclude = [ "client/ayon_core/hosts/unreal/integration/*", "client/ayon_core/hosts/aftereffects/api/extension/js/libs/*", - "client/ayon_core/hosts/hiero/api/startup/*", + "client/ayon_core/server_addon/hiero/client/ayon_hiero/api/startup/*", "client/ayon_core/modules/deadline/repository/custom/plugins/CelAction/*", "client/ayon_core/modules/deadline/repository/custom/plugins/HarmonyAYON/*", "client/ayon_core/modules/click_wrap.py", From 24c8acdb5fab012d3f40fcd80e631910f38b21a1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 14:37:38 +0200 Subject: [PATCH 459/469] fix ruff ignore one more time --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index dcb2c65417..ca887f2299 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,11 +80,11 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" exclude = [ "client/ayon_core/hosts/unreal/integration/*", "client/ayon_core/hosts/aftereffects/api/extension/js/libs/*", - "client/ayon_core/server_addon/hiero/client/ayon_hiero/api/startup/*", "client/ayon_core/modules/deadline/repository/custom/plugins/CelAction/*", "client/ayon_core/modules/deadline/repository/custom/plugins/HarmonyAYON/*", "client/ayon_core/modules/click_wrap.py", - "client/ayon_core/scripts/slates/__init__.py" + "client/ayon_core/scripts/slates/__init__.py", + "server_addon/hiero/client/ayon_hiero/api/startup/*" ] [tool.ruff.lint.per-file-ignores] From 52a82a911004a90e16a6b1e10fd0ea86c3c5eb5c Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 15:29:58 +0200 Subject: [PATCH 460/469] log debug for missing settings --- client/ayon_core/pipeline/publish/lib.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/pipeline/publish/lib.py b/client/ayon_core/pipeline/publish/lib.py index 8d3644637b..94acf64047 100644 --- a/client/ayon_core/pipeline/publish/lib.py +++ b/client/ayon_core/pipeline/publish/lib.py @@ -343,7 +343,7 @@ def get_plugin_settings(plugin, project_settings, log, category=None): [plugin.__name__] ) except KeyError: - log.warning(( + log.debug(( "Couldn't find plugin '{}' settings" " under settings category '{}'" ).format(plugin.__name__, settings_category)) From 1c1489af848ae00bf70b0738f8eb0615c4df7ac6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:01:40 +0200 Subject: [PATCH 461/469] warn about missing category and ignore missing publish plugin --- client/ayon_core/pipeline/publish/lib.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/client/ayon_core/pipeline/publish/lib.py b/client/ayon_core/pipeline/publish/lib.py index 94acf64047..7f63089d33 100644 --- a/client/ayon_core/pipeline/publish/lib.py +++ b/client/ayon_core/pipeline/publish/lib.py @@ -336,17 +336,16 @@ def get_plugin_settings(plugin, project_settings, log, category=None): settings_category = getattr(plugin, "settings_category", None) if settings_category: try: - return ( - project_settings - [settings_category] - ["publish"] - [plugin.__name__] - ) + category_settings = project_settings[settings_category] + except KeyError: + log.warning(( + "Couldn't find settings category '{}' in project settings" + ).format(settings_category)) + return {} + + try: + return category_settings["publish"][plugin.__name__] except KeyError: - log.debug(( - "Couldn't find plugin '{}' settings" - " under settings category '{}'" - ).format(plugin.__name__, settings_category)) return {} # Use project settings based on a category name From 34432b299fe666d7cf208ae880b64b5c75e75d51 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 3 Jun 2024 16:41:29 +0200 Subject: [PATCH 462/469] Bump version --- server_addon/maya/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/maya/package.py b/server_addon/maya/package.py index 274f74869b..0331fb2fb6 100644 --- a/server_addon/maya/package.py +++ b/server_addon/maya/package.py @@ -1,6 +1,6 @@ name = "maya" title = "Maya" -version = "0.2.0" +version = "0.2.1" ayon_required_addons = { "core": ">0.3.2", From 33bd9a82eb3fef006bb549c6f0a36f8a4e9d05c8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 16:56:58 +0200 Subject: [PATCH 463/469] log addons alphabetically --- client/ayon_core/addon/base.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index bbefc4ca1d..87c40b096c 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -918,10 +918,6 @@ class AddonsManager: name_alias = getattr(addon, "openpype_alias", None) if name_alias: aliased_names.append((name_alias, addon)) - enabled_str = "X" if addon.enabled else " " - self.log.debug( - f"[{enabled_str}] {addon.name} ({addon.version})" - ) now = time.time() report[addon.__class__.__name__] = now - prev_start_time @@ -933,6 +929,13 @@ class AddonsManager: exc_info=True ) + for addon_name in sorted(self._addons_by_name.keys()): + addon = self._addons_by_name[addon_name] + enabled_str = "X" if addon.enabled else " " + self.log.debug( + f"[{enabled_str}] {addon.name} ({addon.version})" + ) + for item in aliased_names: name_alias, addon = item if name_alias not in self._addons_by_name: From 91edccbd703154e23692998ba3f453f0e58efae9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:15:46 +0200 Subject: [PATCH 464/469] fix indentation --- client/ayon_core/addon/base.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 3fbba6c619..13f1550e6e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -930,12 +930,12 @@ class AddonsManager: exc_info=True ) - for addon_name in sorted(self._addons_by_name.keys()): - addon = self._addons_by_name[addon_name] - enabled_str = "X" if addon.enabled else " " - self.log.debug( - f"[{enabled_str}] {addon.name} ({addon.version})" - ) + for addon_name in sorted(self._addons_by_name.keys()): + addon = self._addons_by_name[addon_name] + enabled_str = "X" if addon.enabled else " " + self.log.debug( + f"[{enabled_str}] {addon.name} ({addon.version})" + ) for item in aliased_names: name_alias, addon = item From fa158d3f4633dc0f7d336f55110eecb142b295d7 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 3 Jun 2024 23:07:57 +0200 Subject: [PATCH 465/469] Expand tooltip --- .../plugins/workfile_build/assign_look_placeholder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py index 8c888a1a1f..572c567d04 100644 --- a/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py @@ -60,7 +60,10 @@ class AssignLookPlaceholderPlugin(MayaPlaceholderPlugin): "recurse", label="Recursive", tooltip="Assign look also to potential sub containers / " - "placeholders loaded from the load placeholder.", + "placeholders loaded from the load placeholder.\n" + "This will make sure that any placeholder contained " + "that itself loaded new geometry will recursively " + "also get the look assignment triggered.", default=options.get("recurse", False) ), ] From 76b9655a64ee06c1d34286b9ce210dcec9188dea Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 3 Jun 2024 23:09:22 +0200 Subject: [PATCH 466/469] Refactor imports --- .../plugins/workfile_build/assign_look_placeholder.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py index 572c567d04..aaecdd78b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/assign_look_placeholder.py @@ -7,10 +7,8 @@ from ayon_core.lib import ( BoolDef ) from ayon_core.lib.events import weakref_partial -from ayon_core.hosts.maya.api.workfile_template_builder import ( - MayaPlaceholderPlugin, -) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.workfile_template_builder import MayaPlaceholderPlugin +from ayon_maya.api.lib import ( get_all_children, assign_look, ) From 213742c877e1ea57755591d9fbf9e6028891f1c8 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 4 Jun 2024 14:55:48 +0200 Subject: [PATCH 467/469] fixing missing families in loader plugin procedure merging https://github.com/ynput/ayon-core/pull/589 --- server_addon/hiero/client/ayon_hiero/api/plugin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server_addon/hiero/client/ayon_hiero/api/plugin.py b/server_addon/hiero/client/ayon_hiero/api/plugin.py index b9f42a88e0..16eb1d55f3 100644 --- a/server_addon/hiero/client/ayon_hiero/api/plugin.py +++ b/server_addon/hiero/client/ayon_hiero/api/plugin.py @@ -550,7 +550,8 @@ class ClipLoader: log.debug("__ self.timeline_out: {}".format(self.timeline_out)) # check if slate is included - slate_on = "slate" in self.context["version"]["data"]["families"] + slate_on = "slate" in self.context["version"]["data"].get( + "families", []) log.debug("__ slate_on: {}".format(slate_on)) # if slate is on then remove the slate frame from beginning From 3e86be2783efc3acd32997f8f2b52817b83235ef Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Jun 2024 12:48:37 +0200 Subject: [PATCH 468/469] Refactor loop to handle empty sequence case Adjusted loop to handle empty current sequence by appending an empty list if no tracks are present. --- server_addon/hiero/client/ayon_hiero/api/pipeline.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/hiero/client/ayon_hiero/api/pipeline.py b/server_addon/hiero/client/ayon_hiero/api/pipeline.py index 58045c4331..d14d255a87 100644 --- a/server_addon/hiero/client/ayon_hiero/api/pipeline.py +++ b/server_addon/hiero/client/ayon_hiero/api/pipeline.py @@ -130,7 +130,7 @@ def ls(): all_items = lib.get_track_items() # append all video tracks - for track in lib.get_current_sequence(): + for track in (lib.get_current_sequence() or []): if type(track) != hiero.core.VideoTrack: continue all_items.append(track) From 48367f2638ebb714d7e187ce71f33a97e8cf01c8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:47:22 +0200 Subject: [PATCH 469/469] fix circular import --- client/ayon_core/modules/webserver/__init__.py | 2 ++ .../modules/webserver/host_console_listener.py | 18 +++++++----------- .../ayon_core/modules/webserver/structures.py | 6 ++++++ client/ayon_core/tools/stdout_broker/broker.py | 10 +++++----- 4 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 client/ayon_core/modules/webserver/structures.py diff --git a/client/ayon_core/modules/webserver/__init__.py b/client/ayon_core/modules/webserver/__init__.py index a978b94bc4..32f2c55f65 100644 --- a/client/ayon_core/modules/webserver/__init__.py +++ b/client/ayon_core/modules/webserver/__init__.py @@ -1,4 +1,5 @@ from .version import __version__ +from .structures import HostMsgAction from .webserver_module import ( WebServerAddon ) @@ -7,5 +8,6 @@ from .webserver_module import ( __all__ = ( "__version__", + "HostMsgAction", "WebServerAddon", ) diff --git a/client/ayon_core/modules/webserver/host_console_listener.py b/client/ayon_core/modules/webserver/host_console_listener.py index ed8a32b9f2..2efd768e24 100644 --- a/client/ayon_core/modules/webserver/host_console_listener.py +++ b/client/ayon_core/modules/webserver/host_console_listener.py @@ -9,22 +9,18 @@ from qtpy import QtWidgets from ayon_core.addon import ITrayService from ayon_core.tools.stdout_broker.window import ConsoleDialog +from .structures import HostMsgAction + log = logging.getLogger(__name__) +# Host listener icon type class IconType: IDLE = "idle" RUNNING = "running" FAILED = "failed" -class MsgAction: - CONNECTING = "connecting" - INITIALIZED = "initialized" - ADD = "add" - CLOSE = "close" - - class HostListener: def __init__(self, webserver, module): self._window_per_id = {} @@ -96,22 +92,22 @@ class HostListener: if msg.type == aiohttp.WSMsgType.TEXT: host_name, action, text = self._parse_message(msg) - if action == MsgAction.CONNECTING: + if action == HostMsgAction.CONNECTING: self._action_per_id[host_name] = None # must be sent to main thread, or action wont trigger self.module.execute_in_main_thread( lambda: self._host_is_connecting(host_name, text)) - elif action == MsgAction.CLOSE: + elif action == HostMsgAction.CLOSE: # clean close self._close(host_name) await ws.close() - elif action == MsgAction.INITIALIZED: + elif action == HostMsgAction.INITIALIZED: self.module.execute_in_main_thread( # must be queued as _host_is_connecting might not # be triggered/finished yet lambda: self._set_host_icon(host_name, IconType.RUNNING)) - elif action == MsgAction.ADD: + elif action == HostMsgAction.ADD: self.module.execute_in_main_thread( lambda: self._add_text(host_name, text)) elif msg.type == aiohttp.WSMsgType.ERROR: diff --git a/client/ayon_core/modules/webserver/structures.py b/client/ayon_core/modules/webserver/structures.py new file mode 100644 index 0000000000..a598e3342a --- /dev/null +++ b/client/ayon_core/modules/webserver/structures.py @@ -0,0 +1,6 @@ +# Host listener message actions +class HostMsgAction: + CONNECTING = "connecting" + INITIALIZED = "initialized" + ADD = "add" + CLOSE = "close" diff --git a/client/ayon_core/tools/stdout_broker/broker.py b/client/ayon_core/tools/stdout_broker/broker.py index e31eb0057e..291936008b 100644 --- a/client/ayon_core/tools/stdout_broker/broker.py +++ b/client/ayon_core/tools/stdout_broker/broker.py @@ -8,7 +8,7 @@ from datetime import datetime import websocket from ayon_core.lib import Logger -from ayon_core.modules.webserver.host_console_listener import MsgAction +from ayon_core.modules.webserver import HostMsgAction log = Logger.get_logger(__name__) @@ -65,7 +65,7 @@ class StdOutBroker: payload = { "host": self.host_id, - "action": MsgAction.INITIALIZED, + "action": HostMsgAction.INITIALIZED, "text": "Integration with {}".format( str.capitalize(self.host_name)) } @@ -99,7 +99,7 @@ class StdOutBroker: payload = { "host": self.host_id, - "action": MsgAction.CONNECTING, + "action": HostMsgAction.CONNECTING, "text": "Integration with {}".format( str.capitalize(self.host_name)) } @@ -113,7 +113,7 @@ class StdOutBroker: payload = { "host": self.host_id, - "action": MsgAction.CLOSE, + "action": HostMsgAction.CLOSE, "text": "Integration with {}".format( str.capitalize(self.host_name)) } @@ -157,7 +157,7 @@ class StdOutBroker: if lines: payload = { "host": self.host_id, - "action": MsgAction.ADD, + "action": HostMsgAction.ADD, "text": "\n".join(lines) }