From 5812d7bd75a5fc121dff44ed199acd5ccf55a0e0 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 18 Jun 2024 16:37:23 +0200 Subject: [PATCH 01/11] Fix type hints --- server_addon/nuke/client/ayon_nuke/api/lib.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/api/lib.py b/server_addon/nuke/client/ayon_nuke/api/lib.py index 905521255f..876585bf21 100644 --- a/server_addon/nuke/client/ayon_nuke/api/lib.py +++ b/server_addon/nuke/client/ayon_nuke/api/lib.py @@ -561,7 +561,7 @@ def read_avalon_data(node): node (nuke.Node): Nuke node object Returns: - list: A list of nuke.Knob object + Dict[str, nuke.Knob]: A dictionary of knob name to nuke.Knob objects """ def compat_prefixed(knob_name): @@ -613,7 +613,7 @@ def get_node_path(path, padding=4): path (str): The path to render to. Returns: - tuple: head, padding, tail (extension) + Tuple[str, int, str]: head, padding, tail (extension) Examples: >>> get_frame_path("test.exr") @@ -957,14 +957,14 @@ def check_product_name_exists(nodes, product_name): def format_anatomy(data): - ''' Helping function for formatting of anatomy paths + """Helping function for formatting of anatomy paths Arguments: data (dict): dictionary with attributes used for formatting Return: - path (str) - ''' + str: Formatted path. + """ project_name = get_current_project_name() anatomy = Anatomy(project_name) @@ -1100,7 +1100,7 @@ def create_write_node( linked_knobs=None, **kwargs ): - ''' Creating write node which is group node + """Creating write node which is group node Arguments: name (str): name of node @@ -1134,8 +1134,8 @@ def create_write_node( Return: - node (obj): group node with avalon data as Knobs - ''' + node (nuke.Node): group node with avalon data as Knobs + """ # Ensure name does not contain any invalid characters. special_chars = re.escape("!@#$%^&*()=[]{}|\\;',.<>/?~+-") special_chars_regex = re.compile(f"[{special_chars}]") @@ -1402,6 +1402,9 @@ def create_backdrop(label="", color=None, layer=0, label (str): the message nodes (list): list of nodes to be wrapped into backdrop + Returns: + nuke.Node: The created backdrop node. + """ assert isinstance(nodes, list), "`nodes` should be a list of nodes" From 54f9e2698791d471e5306fe0f5beb5019c42a485 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Tue, 18 Jun 2024 16:37:54 +0200 Subject: [PATCH 02/11] Cosmetics --- server_addon/nuke/client/ayon_nuke/api/lib.py | 53 ++++++++----------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/server_addon/nuke/client/ayon_nuke/api/lib.py b/server_addon/nuke/client/ayon_nuke/api/lib.py index 876585bf21..6caaed3801 100644 --- a/server_addon/nuke/client/ayon_nuke/api/lib.py +++ b/server_addon/nuke/client/ayon_nuke/api/lib.py @@ -655,8 +655,7 @@ def get_nuke_imageio_settings(): def get_imageio_node_setting(node_class, plugin_name, product_name): - ''' Get preset data for dataflow (fileType, compression, bitDepth) - ''' + """Get preset data for dataflow (fileType, compression, bitDepth)""" imageio_nodes = get_nuke_imageio_settings()["nodes"] required_nodes = imageio_nodes["required_nodes"] @@ -686,8 +685,8 @@ def get_imageio_node_setting(node_class, plugin_name, product_name): def get_imageio_node_override_setting( node_class, plugin_name, product_name, knobs_settings ): - ''' Get imageio node overrides from settings - ''' + """ Get imageio node overrides from settings + """ imageio_nodes = get_nuke_imageio_settings()["nodes"] override_nodes = imageio_nodes["override_nodes"] @@ -745,8 +744,7 @@ def get_imageio_node_override_setting( def get_imageio_input_colorspace(filename): - ''' Get input file colorspace based on regex in settings. - ''' + """Get input file colorspace based on regex in settings.""" imageio_regex_inputs = ( get_nuke_imageio_settings()["regex_inputs"]["inputs"]) @@ -791,8 +789,7 @@ def get_view_process_node(): def on_script_load(): - ''' Callback for ffmpeg support - ''' + """Callback for ffmpeg support""" if nuke.env["LINUX"]: nuke.tcl('load ffmpegReader') nuke.tcl('load ffmpegWriter') @@ -815,7 +812,7 @@ def check_inventory_versions(): # get all Loader nodes by avalon attribute metadata node_with_repre_id = [] repre_ids = set() - # Find all containers and collect it's node and representation ids + # Find all containers and collect its node and representation ids for node in nuke.allNodes(): container = parse_container(node) @@ -896,8 +893,7 @@ def check_inventory_versions(): def writes_version_sync(): - ''' Callback synchronizing version of publishable write nodes - ''' + """Callback synchronizing version of publishable write nodes""" try: rootVersion = get_version_from_path(nuke.root().name()) padding = len(rootVersion) @@ -934,8 +930,7 @@ def writes_version_sync(): def version_up_script(): - ''' Raising working script's version - ''' + """Raising working script's version""" import nukescripts nukescripts.script_and_write_nodes_version_up() @@ -996,9 +991,8 @@ def format_anatomy(data): return anatomy.format(data) -def script_name(): - ''' Returns nuke script path - ''' +def script_name() -> str: + """Returns nuke script path""" return nuke.root().knob("name").value() @@ -1300,7 +1294,7 @@ def create_write_node( def set_node_knobs_from_settings(node, knob_settings, **kwargs): - """ Overriding knob values from settings + """Overriding knob values from settings Using `schema_nuke_knob_inputs` for knob type definitions. @@ -1393,8 +1387,7 @@ def color_gui_to_int(color_gui): def create_backdrop(label="", color=None, layer=0, nodes=None): - """ - Create Backdrop node + """Create Backdrop node Arguments: color (str): nuke compatible string with color code @@ -1494,12 +1487,12 @@ class WorkfileSettings(object): return [n for n in self._nodes if filter in n.Class()] def set_viewers_colorspace(self, imageio_nuke): - ''' Adds correct colorspace to viewer + """Adds correct colorspace to viewer Arguments: imageio_nuke (dict): nuke colorspace configurations - ''' + """ filter_knobs = [ "viewerProcess", "wipe_position", @@ -1563,12 +1556,12 @@ class WorkfileSettings(object): return StringTemplate(display_view).format_strict(self.formatting_data) def set_root_colorspace(self, imageio_host): - ''' Adds correct colorspace to root + """Adds correct colorspace to root Arguments: imageio_host (dict): host colorspace configurations - ''' + """ config_data = get_current_context_imageio_config_preset() workfile_settings = imageio_host["workfile"] @@ -1822,9 +1815,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. return new_path def set_writes_colorspace(self): - ''' Adds correct colorspace to write node dict - - ''' + """ Adds correct colorspace to write node dict + """ for node in nuke.allNodes(filter="Group", group=self._root_node): log.info("Setting colorspace to `{}`".format(node.name())) @@ -1946,8 +1938,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. knobs["to"])) def set_colorspace(self): - ''' Setting colorspace following presets - ''' + """ Setting colorspace following presets + """ # get imageio nuke_colorspace = get_nuke_imageio_settings() @@ -2155,9 +2147,8 @@ Reopening Nuke should synchronize these paths and resolve any discrepancies. def get_write_node_template_attr(node): - ''' Gets all defined data from presets - - ''' + """ Gets all defined data from presets + """ # TODO: add identifiers to settings and rename settings key plugin_names_mapping = { From 2a49064c0b1b4dec0379e1f379ef496be367520f Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 20 Jun 2024 12:27:27 +0200 Subject: [PATCH 03/11] Integrate Hero Version: Disable usage of hardlinks - but allow enabling via settings --- .../plugins/publish/integrate_hero_version.py | 30 +++++++++++-------- server/settings/publish_plugins.py | 11 ++++++- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate_hero_version.py b/client/ayon_core/plugins/publish/integrate_hero_version.py index 8c36719b77..95b9f418f9 100644 --- a/client/ayon_core/plugins/publish/integrate_hero_version.py +++ b/client/ayon_core/plugins/publish/integrate_hero_version.py @@ -87,7 +87,9 @@ class IntegrateHeroVersion( ] # QUESTION/TODO this process should happen on server if crashed due to # permissions error on files (files were used or user didn't have perms) - # *but all other plugins must be sucessfully completed + # *but all other plugins must be successfully completed + + use_hardlinks = False def process(self, instance): if not self.is_active(instance.data): @@ -621,19 +623,21 @@ class IntegrateHeroVersion( src_path, dst_path )) - # First try hardlink and copy if paths are cross drive - try: - create_hard_link(src_path, dst_path) - # Return when successful - return + if self.use_hardlinks: + # First try hardlink and copy if paths are cross drive + try: + create_hard_link(src_path, dst_path) + # Return when successful + return - except OSError as exc: - # re-raise exception if different than - # EXDEV - cross drive path - # EINVAL - wrong format, must be NTFS - self.log.debug("Hardlink failed with errno:'{}'".format(exc.errno)) - if exc.errno not in [errno.EXDEV, errno.EINVAL]: - raise + except OSError as exc: + # re-raise exception if different than + # EXDEV - cross drive path + # EINVAL - wrong format, must be NTFS + self.log.debug( + "Hardlink failed with errno:'{}'".format(exc.errno)) + if exc.errno not in [errno.EXDEV, errno.EINVAL]: + raise shutil.copy(src_path, dst_path) diff --git a/server/settings/publish_plugins.py b/server/settings/publish_plugins.py index b37be1afe6..1b3d382f01 100644 --- a/server/settings/publish_plugins.py +++ b/server/settings/publish_plugins.py @@ -743,6 +743,14 @@ class IntegrateHeroVersionModel(BaseSettingsModel): optional: bool = SettingsField(False, title="Optional") active: bool = SettingsField(True, title="Active") families: list[str] = SettingsField(default_factory=list, title="Families") + use_hardlinks: bool = SettingsField( + False, title="Use Hardlinks", + description="When enabled first try to make a hardlink of the version " + "instead of a copy. This helps reduce disk usage, but may " + "create issues.\nFor example there are known issues on " + "Windows being unable to delete any of the hardlinks if " + "any of the links is in use creating issues with updating " + "hero versions.") class CleanUpModel(BaseSettingsModel): @@ -1136,7 +1144,8 @@ DEFAULT_PUBLISH_VALUES = { "layout", "mayaScene", "simpleUnrealTexture" - ] + ], + "use_hardlinks": False }, "CleanUp": { "paterns": [], From 0ab3653f360e530402d17bc1c78fbeea4f2cd9fd Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Mon, 24 Jun 2024 10:45:33 +0200 Subject: [PATCH 04/11] Report whether it's hardlinking or copying; also report whether hardlinking failed. --- .../plugins/publish/integrate_hero_version.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/client/ayon_core/plugins/publish/integrate_hero_version.py b/client/ayon_core/plugins/publish/integrate_hero_version.py index 95b9f418f9..4fb8b886a9 100644 --- a/client/ayon_core/plugins/publish/integrate_hero_version.py +++ b/client/ayon_core/plugins/publish/integrate_hero_version.py @@ -619,12 +619,11 @@ class IntegrateHeroVersion( self.log.debug("Folder already exists: \"{}\"".format(dirname)) - self.log.debug("Copying file \"{}\" to \"{}\"".format( - src_path, dst_path - )) - if self.use_hardlinks: # First try hardlink and copy if paths are cross drive + self.log.debug("Hardlinking file \"{}\" to \"{}\"".format( + src_path, dst_path + )) try: create_hard_link(src_path, dst_path) # Return when successful @@ -639,6 +638,13 @@ class IntegrateHeroVersion( if exc.errno not in [errno.EXDEV, errno.EINVAL]: raise + self.log.debug( + "Hardlinking failed, falling back to regular copy...") + + self.log.debug("Copying file \"{}\" to \"{}\"".format( + src_path, dst_path + )) + shutil.copy(src_path, dst_path) def version_from_representations(self, project_name, repres): From c51f182c29d1f92a94a835d4570828977a138472 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:24:54 +0200 Subject: [PATCH 05/11] Houdini: Expose Extract Active View Thumbnail to settings --- .../houdini/server/settings/publish.py | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 336de8e046..a5aef7e055 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -57,7 +57,7 @@ class ValidateWorkfilePathsModel(BaseSettingsModel): ) -class BasicValidateModel(BaseSettingsModel): +class BasicEnabledStatesModel(BaseSettingsModel): enabled: bool = SettingsField(title="Enabled") optional: bool = SettingsField(title="Optional") active: bool = SettingsField(title="Active") @@ -77,25 +77,29 @@ class PublishPluginsModel(BaseSettingsModel): default_factory=CollectLocalRenderInstancesModel, title="Collect Local Render Instances." ) - ValidateInstanceInContextHoudini: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateInstanceInContextHoudini: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Instance is in same Context.", section="Validators") - ValidateMeshIsStatic: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateMeshIsStatic: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Mesh is Static.") - ValidateReviewColorspace: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateReviewColorspace: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Review Colorspace.") - ValidateSubsetName: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateSubsetName: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Subset Name.") - ValidateUnrealStaticMeshName: BasicValidateModel = SettingsField( - default_factory=BasicValidateModel, + ValidateUnrealStaticMeshName: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, title="Validate Unreal Static Mesh Name.") ValidateWorkfilePaths: ValidateWorkfilePathsModel = SettingsField( default_factory=ValidateWorkfilePathsModel, title="Validate workfile paths settings.") + ExtractActiveViewThumbnail: BasicEnabledStatesModel = SettingsField( + default_factory=BasicEnabledStatesModel, + title="Extract Active View Thumbnail" + ) DEFAULT_HOUDINI_PUBLISH_SETTINGS = { @@ -152,5 +156,10 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { "$HIP", "$JOB" ] + }, + "ExtractActiveViewThumbnail": { + "enabled": True, + "optional": False, + "active": True } } From 300b9e3e3bb4eaec38d14cce54937e09b10e7b4c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:27:20 +0200 Subject: [PATCH 06/11] Support optional state of plug-in --- .../plugins/publish/extract_active_view_thumbnail.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index c4d51c0808..d4db87ec39 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -1,10 +1,13 @@ import tempfile import pyblish.api + +from ayon_core.pipeline import OptionalPyblishPluginMixin from ayon_houdini.api import lib, plugin from ayon_houdini.api.pipeline import IS_HEADLESS -class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin): +class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin, + OptionalPyblishPluginMixin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that @@ -17,6 +20,9 @@ class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin): families = ["workfile"] def process(self, instance): + if not self.is_active(instance): + return + if IS_HEADLESS: self.log.debug( "Skip extraction of active view thumbnail, due to being in" From 1333499df6e36c4a7813ee2787794cad626b5717 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:43:14 +0200 Subject: [PATCH 07/11] Remove dots from end of plug-in titles --- .../server/settings/publish_plugins.py | 4 ++-- .../houdini/server/settings/publish.py | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/server_addon/deadline/server/settings/publish_plugins.py b/server_addon/deadline/server/settings/publish_plugins.py index 85a93d49cd..a041a08ded 100644 --- a/server_addon/deadline/server/settings/publish_plugins.py +++ b/server_addon/deadline/server/settings/publish_plugins.py @@ -375,11 +375,11 @@ class PublishPluginsModel(BaseSettingsModel): title="Nuke Submit to deadline") ProcessSubmittedCacheJobOnFarm: ProcessCacheJobFarmModel = SettingsField( default_factory=ProcessCacheJobFarmModel, - title="Process submitted cache Job on farm.", + title="Process submitted cache Job on farm", section="Publish Jobs") ProcessSubmittedJobOnFarm: ProcessSubmittedJobOnFarmModel = SettingsField( default_factory=ProcessSubmittedJobOnFarmModel, - title="Process submitted job on farm.") + title="Process submitted job on farm") DEFAULT_DEADLINE_PLUGINS_SETTINGS = { diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 336de8e046..847147c27a 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -66,36 +66,36 @@ class BasicValidateModel(BaseSettingsModel): class PublishPluginsModel(BaseSettingsModel): CollectAssetHandles: CollectAssetHandlesModel = SettingsField( default_factory=CollectAssetHandlesModel, - title="Collect Asset Handles.", + title="Collect Asset Handles", section="Collectors" ) CollectChunkSize: CollectChunkSizeModel = SettingsField( default_factory=CollectChunkSizeModel, - title="Collect Chunk Size." + title="Collect Chunk Size" ) CollectLocalRenderInstances: CollectLocalRenderInstancesModel = SettingsField( default_factory=CollectLocalRenderInstancesModel, - title="Collect Local Render Instances." + title="Collect Local Render Instances" ) ValidateInstanceInContextHoudini: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Instance is in same Context.", + title="Validate Instance is in same Context", section="Validators") ValidateMeshIsStatic: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Mesh is Static.") + title="Validate Mesh is Static") ValidateReviewColorspace: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Review Colorspace.") + title="Validate Review Colorspace") ValidateSubsetName: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Subset Name.") + title="Validate Subset Name") ValidateUnrealStaticMeshName: BasicValidateModel = SettingsField( default_factory=BasicValidateModel, - title="Validate Unreal Static Mesh Name.") + title="Validate Unreal Static Mesh Name") ValidateWorkfilePaths: ValidateWorkfilePathsModel = SettingsField( default_factory=ValidateWorkfilePathsModel, - title="Validate workfile paths settings.") + title="Validate workfile paths settings") DEFAULT_HOUDINI_PUBLISH_SETTINGS = { From 61c1acaa9503b1f1fba997cb63e09bcab6797ecb Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:44:09 +0200 Subject: [PATCH 08/11] Fix indentations --- server_addon/deadline/server/settings/publish_plugins.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server_addon/deadline/server/settings/publish_plugins.py b/server_addon/deadline/server/settings/publish_plugins.py index a041a08ded..1cf699db23 100644 --- a/server_addon/deadline/server/settings/publish_plugins.py +++ b/server_addon/deadline/server/settings/publish_plugins.py @@ -153,8 +153,8 @@ class FusionSubmitDeadlineModel(BaseSettingsModel): ) group: str = SettingsField("", title="Group Name") plugin: str = SettingsField("Fusion", - enum_resolver=fusion_deadline_plugin_enum, - title="Deadline Plugin") + enum_resolver=fusion_deadline_plugin_enum, + title="Deadline Plugin") class NukeSubmitDeadlineModel(BaseSettingsModel): @@ -376,7 +376,7 @@ class PublishPluginsModel(BaseSettingsModel): ProcessSubmittedCacheJobOnFarm: ProcessCacheJobFarmModel = SettingsField( default_factory=ProcessCacheJobFarmModel, title="Process submitted cache Job on farm", - section="Publish Jobs") + section="Publish Jobs") ProcessSubmittedJobOnFarm: ProcessSubmittedJobOnFarmModel = SettingsField( default_factory=ProcessSubmittedJobOnFarmModel, title="Process submitted job on farm") From 31f11684e1ad52e75e3733b51889f307c9eb6810 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 00:45:22 +0200 Subject: [PATCH 09/11] Cosmetics --- server_addon/houdini/server/settings/publish.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index 847147c27a..4f324f0726 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -31,6 +31,7 @@ class AOVFilterSubmodel(BaseSettingsModel): title="AOV regex" ) + class CollectLocalRenderInstancesModel(BaseSettingsModel): use_deadline_aov_filter: bool = SettingsField( @@ -109,7 +110,7 @@ DEFAULT_HOUDINI_PUBLISH_SETTINGS = { }, "CollectLocalRenderInstances": { "use_deadline_aov_filter": False, - "aov_filter" : { + "aov_filter": { "host_name": "houdini", "value": [ ".*([Bb]eauty).*" From 31a8c67121a3ba758c5893ef6bc250bc4d1e685d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 12:36:23 +0200 Subject: [PATCH 10/11] Update server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py Co-authored-by: Kayla Man <64118225+moonyuet@users.noreply.github.com> --- .../plugins/publish/extract_active_view_thumbnail.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py index d4db87ec39..e85df4ee81 100644 --- a/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/houdini/client/ayon_houdini/plugins/publish/extract_active_view_thumbnail.py @@ -20,7 +20,7 @@ class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin, families = ["workfile"] def process(self, instance): - if not self.is_active(instance): + if not self.is_active(instance.data): return if IS_HEADLESS: From c18d8fe90f560f8291c00326aa54e7352f21b3c8 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 27 Jun 2024 12:45:19 +0200 Subject: [PATCH 11/11] Update server_addon/houdini/server/settings/publish.py Co-authored-by: Mustafa Taher --- server_addon/houdini/server/settings/publish.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server_addon/houdini/server/settings/publish.py b/server_addon/houdini/server/settings/publish.py index a50b17445c..2b88f96922 100644 --- a/server_addon/houdini/server/settings/publish.py +++ b/server_addon/houdini/server/settings/publish.py @@ -99,7 +99,8 @@ class PublishPluginsModel(BaseSettingsModel): title="Validate workfile paths settings") ExtractActiveViewThumbnail: BasicEnabledStatesModel = SettingsField( default_factory=BasicEnabledStatesModel, - title="Extract Active View Thumbnail" + title="Extract Active View Thumbnail", + section="Extractors" )