From c2167056720a93764eb3f4409350820fba476330 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Wed, 20 Mar 2024 16:59:48 +0100 Subject: [PATCH 01/33] 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 .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 @@ def _process(self, libpath, asset_group, group_name): 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 @@ def process_asset( 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 02/33] 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 @@ def process(self, instance): 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 03/33] 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 @@ def process_asset( 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 78da85398d2ffb86673acf0f88dba94c54ad140a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 4 Apr 2024 15:39:04 +0200 Subject: [PATCH 04/33] 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 6bb585c6a92b62f70fbfb2355ed45e3ff70f0d9a Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 3 May 2024 20:31:40 +0200 Subject: [PATCH 05/33] 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 06/33] 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 @@ def process(self, instance): 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 @@ class PublishPluginsModel(BaseSettingsModel): }, 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 07/33] 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 08/33] 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 09/33] 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 @@ def process(self, instance): 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 475d1db69bc518522b57f270f174799842f6d031 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Thu, 9 May 2024 15:05:54 +0300 Subject: [PATCH 10/33] 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 b2b8cb132f78b4bc807e0dcaf0ef71d906f10f73 Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Mon, 13 May 2024 17:59:23 +0300 Subject: [PATCH 11/33] 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 @@ class CreatePluginsModel(BaseSettingsModel): "enabled": True, "default_variants": ["Main"] }, + "CreateModel": { + "enabled": True, + "default_variants": ["Main"] + }, "CreatePointCache": { "enabled": True, "default_variants": ["Main"] 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 12/33] 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 13/33] 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 | 23 ++++++++----------- .../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, 37 insertions(+), 34 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 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 @@ def initialize(self, studio_settings): # 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 @@ def get_plugin_paths(self): 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 @@ def set_menu_visibility(self): 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.''' - - #: 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 + """Synchronise project names and task types.""" + + 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 @@ def launch(self, session, entities, event): '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 14/33] 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 @@ # - 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 15/33] 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 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 16/33] 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 @@ def get_action_items(self, project_name, folder_id, task_id): 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 dd29bd8fa8f88853fb8cf4ea4ec496ec8e2a41cf Mon Sep 17 00:00:00 2001 From: MustafaJafar Date: Wed, 22 May 2024 15:46:03 +0300 Subject: [PATCH 17/33] 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 @@ def process(self, instance): raise RuntimeError("Failed to complete render extraction. " "Missing output files: {}".format( missing_frames)) + + # Remove original render instance + instance.context.remove(instance) 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 18/33] 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 19/33] 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 @@ def process(self, instance): 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 20/33] 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 @@ def process(self, instance): "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 21/33] 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 @@ def paint(self, painter, option, index): 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 @@ def __init__(self, controller, parent): 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 22/33] 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 @@ def get_action_items(self, project_name, folder_id, task_id): 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 23/33] 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 @@ def process(self, instance): ] }) - # 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 @@ def process(self, instance): 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 24/33] 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.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 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 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 @@ def execute(self): 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 @@ 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 @@ 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 @@ 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 @@ 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 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 @@ 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 @@ 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 @@ 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 @@ 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 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 25/33] 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 .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 26/33] 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 27/33] 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 @@ # - 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 28/33] 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 @@ def _custom_get_product_name( class TVPaintCreator(Creator, TVPaintCreatorCommon): + settings_category = "tvpaint" + def collect_instances(self): self._collect_create_instances() @@ -140,6 +142,8 @@ def _store_new_instance(self, new_instance): class TVPaintAutoCreator(AutoCreator, TVPaintCreatorCommon): + settings_category = "tvpaint" + def collect_instances(self): self._collect_create_instances() @@ -152,6 +156,7 @@ def get_product_name(self, *args, **kwargs): 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 29/33] 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 4bef6c9911ff47edf88dfa1b45fbb36c945e90e6 Mon Sep 17 00:00:00 2001 From: Mustafa Taher Date: Thu, 23 May 2024 12:34:54 +0300 Subject: [PATCH 30/33] 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 @@ def get_invalid(cls, instance): 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 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 31/33] 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 32/33] 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 33/33] 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 @@ 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 @@ client_dir = "ayon_tvpaint" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {}