From d092e509342ce87982987ecb1184583d1eb02f77 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 30 Mar 2023 17:38:51 +0200 Subject: [PATCH 01/15] reveiwable attribute is showing on demand --- openpype/hosts/nuke/api/plugin.py | 7 +++++-- openpype/hosts/nuke/plugins/create/create_write_image.py | 7 ------- .../hosts/nuke/plugins/create/create_write_prerender.py | 7 ------- openpype/hosts/nuke/plugins/create/create_write_render.py | 7 ------- 4 files changed, 5 insertions(+), 23 deletions(-) diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py index aec87be5ab..67b60d45ca 100644 --- a/openpype/hosts/nuke/api/plugin.py +++ b/openpype/hosts/nuke/api/plugin.py @@ -301,8 +301,11 @@ class NukeWriteCreator(NukeCreator): def get_instance_attr_defs(self): attr_defs = [ self._get_render_target_enum(), - self._get_reviewable_bool() ] + # add reviewable attribute + if "reviewable" in self.instance_attributes: + attr_defs.append(self._get_reviewable_bool()) + return attr_defs def _get_render_target_enum(self): @@ -322,7 +325,7 @@ class NukeWriteCreator(NukeCreator): def _get_reviewable_bool(self): return BoolDef( "review", - default=("reviewable" in self.instance_attributes), + default=True, label="Review" ) diff --git a/openpype/hosts/nuke/plugins/create/create_write_image.py b/openpype/hosts/nuke/plugins/create/create_write_image.py index d38253ab2f..b74cea5dae 100644 --- a/openpype/hosts/nuke/plugins/create/create_write_image.py +++ b/openpype/hosts/nuke/plugins/create/create_write_image.py @@ -63,13 +63,6 @@ class CreateWriteImage(napi.NukeWriteCreator): default=nuke.frame() ) - def get_instance_attr_defs(self): - attr_defs = [ - self._get_render_target_enum(), - self._get_reviewable_bool() - ] - return attr_defs - def create_instance_node(self, subset_name, instance_data): linked_knobs_ = [] if "use_range_limit" in self.instance_attributes: diff --git a/openpype/hosts/nuke/plugins/create/create_write_prerender.py b/openpype/hosts/nuke/plugins/create/create_write_prerender.py index 8103cb7c4d..387768b1dd 100644 --- a/openpype/hosts/nuke/plugins/create/create_write_prerender.py +++ b/openpype/hosts/nuke/plugins/create/create_write_prerender.py @@ -41,13 +41,6 @@ class CreateWritePrerender(napi.NukeWriteCreator): ] return attr_defs - def get_instance_attr_defs(self): - attr_defs = [ - self._get_render_target_enum(), - self._get_reviewable_bool() - ] - return attr_defs - def create_instance_node(self, subset_name, instance_data): linked_knobs_ = [] if "use_range_limit" in self.instance_attributes: diff --git a/openpype/hosts/nuke/plugins/create/create_write_render.py b/openpype/hosts/nuke/plugins/create/create_write_render.py index 23efa62e36..09257f662e 100644 --- a/openpype/hosts/nuke/plugins/create/create_write_render.py +++ b/openpype/hosts/nuke/plugins/create/create_write_render.py @@ -38,13 +38,6 @@ class CreateWriteRender(napi.NukeWriteCreator): ] return attr_defs - def get_instance_attr_defs(self): - attr_defs = [ - self._get_render_target_enum(), - self._get_reviewable_bool() - ] - return attr_defs - def create_instance_node(self, subset_name, instance_data): # add fpath_template write_data = { From 1cbcd66da80632ff654d7d54a4f0c2cf0025c64c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 4 Apr 2023 16:54:36 +0200 Subject: [PATCH 02/15] removing older instance attributes --- openpype/hosts/nuke/api/plugin.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/openpype/hosts/nuke/api/plugin.py b/openpype/hosts/nuke/api/plugin.py index 3806f291c2..3566cb64c1 100644 --- a/openpype/hosts/nuke/api/plugin.py +++ b/openpype/hosts/nuke/api/plugin.py @@ -208,6 +208,12 @@ class NukeCreator(NewCreator): def collect_instances(self): cached_instances = _collect_and_cache_nodes(self) + attr_def_keys = { + attr_def.key + for attr_def in self.get_instance_attr_defs() + } + attr_def_keys.discard(None) + for (node, data) in cached_instances[self.identifier]: created_instance = CreatedInstance.from_existing( data, self @@ -215,6 +221,12 @@ class NukeCreator(NewCreator): created_instance.transient_data["node"] = node self._add_instance_to_context(created_instance) + for key in ( + set(created_instance["creator_attributes"].keys()) + - attr_def_keys + ): + created_instance["creator_attributes"].pop(key) + def update_instances(self, update_list): for created_inst, _changes in update_list: instance_node = created_inst.transient_data["node"] From 0cdeda539693632ade1d012713b98a000503d89f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 5 Apr 2023 11:06:43 +0200 Subject: [PATCH 03/15] remove UnknownDef attributes on pop from attributes value (#4776) --- openpype/pipeline/create/context.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/openpype/pipeline/create/context.py b/openpype/pipeline/create/context.py index 22cab28e4b..382bbea05e 100644 --- a/openpype/pipeline/create/context.py +++ b/openpype/pipeline/create/context.py @@ -596,7 +596,14 @@ class AttributeValues(object): self[_key] = _value def pop(self, key, default=None): - return self._data.pop(key, default) + value = self._data.pop(key, default) + # Remove attribute definition if is 'UnknownDef' + # - gives option to get rid of unknown values + attr_def = self._attr_defs_by_key.get(key) + if isinstance(attr_def, UnknownDef): + self._attr_defs_by_key.pop(key) + self._attr_defs.remove(attr_def) + return value def reset_values(self): self._data = {} From 1944643d780a4e711c473963102f0a67af06ecc0 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Apr 2023 11:39:28 +0200 Subject: [PATCH 04/15] make label key optional on instance.data --- openpype/plugins/publish/collect_otio_review.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpype/plugins/publish/collect_otio_review.py b/openpype/plugins/publish/collect_otio_review.py index 4d8147e70d..f0157282a1 100644 --- a/openpype/plugins/publish/collect_otio_review.py +++ b/openpype/plugins/publish/collect_otio_review.py @@ -87,7 +87,9 @@ class CollectOtioReview(pyblish.api.InstancePlugin): otio_review_clips.append(otio_gap) if otio_review_clips: - instance.data["label"] += " (review)" + # add review track to instance and change label to reflect it + label = instance.data.get("label", instance.data["subset"]) + instance.data["label"] = label + " (review)" instance.data["families"] += ["review", "ftrack"] instance.data["otioReviewClips"] = otio_review_clips self.log.info( From 68caaf65c8a2e486d6a86b85012ad1493f6f3608 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Apr 2023 12:14:54 +0200 Subject: [PATCH 05/15] fixing skipping of project actions --- .github/workflows/project_actions.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/project_actions.yml b/.github/workflows/project_actions.yml index b21946f0ee..3589b4acc2 100644 --- a/.github/workflows/project_actions.yml +++ b/.github/workflows/project_actions.yml @@ -25,7 +25,11 @@ jobs: if: | (github.event_name == 'issue_comment' && github.event.pull_request.head.repo.owner.login == 'ynput' && github.event.comment.user.id != 82967070) || (github.event_name == 'pull_request_review_comment' && github.event.pull_request.head.repo.owner.login == 'ynput' && github.event.comment.user.type != 'Bot') || - (github.event_name == 'pull_request_review' && github.event.pull_request.head.repo.owner.login == 'ynput' && github.event.review.state != 'changes_requested' && github.event.review.user.type != 'Bot') + (github.event_name == 'pull_request_review' && + github.event.pull_request.head.repo.owner.login == 'ynput' && + github.event.review.state != 'changes_requested' && + github.event.review.state != 'approved' && + github.event.review.user.type != 'Bot') steps: - name: Move PR to 'Review In Progress' uses: leonsteinhaeuser/project-beta-automations@v2.1.0 @@ -70,10 +74,7 @@ jobs: size-label: name: pr_size_label runs-on: ubuntu-latest - if: | - (github.event_name == 'pull_request' && github.event.action == 'assigned') || - (github.event_name == 'pull_request' && github.event.action == 'opened') - + if: github.event.action == 'assigned' || github.event.action == 'opened' steps: - name: Add size label uses: "pascalgn/size-label-action@v0.4.3" @@ -94,9 +95,7 @@ jobs: label_prs_branch: name: pr_branch_label runs-on: ubuntu-latest - if: | - (github.event_name == 'pull_request' && github.event.action == 'assigned') || - (github.event_name == 'pull_request' && github.event.action == 'opened') + if: github.event.action == 'assigned' || github.event.action == 'opened' steps: - name: Label PRs - Branch name detection uses: ffittschen/pr-branch-labeler@v1 @@ -106,9 +105,7 @@ jobs: label_prs_globe: name: pr_globe_label runs-on: ubuntu-latest - if: | - (github.event_name == 'pull_request' && github.event.action == 'assigned') || - (github.event_name == 'pull_request' && github.event.action == 'opened') + if: github.event.action == 'assigned' || github.event.action == 'opened' steps: - name: Label PRs - Globe detection uses: actions/labeler@v4.0.3 From 105e03344c28ba44f61c6ade2c1c82450cc93ad6 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Apr 2023 14:34:26 +0200 Subject: [PATCH 06/15] nuke: capture exception so popup is not rised --- openpype/hosts/nuke/api/lib.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 157a02b9aa..fe3a2d2bd1 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -23,6 +23,9 @@ from openpype.client import ( from openpype.host import HostDirmap from openpype.tools.utils import host_tools +from openpype.pipeline.workfile.workfile_template_builder import ( + TemplateProfileNotFound +) from openpype.lib import ( env_value_to_bool, Logger, @@ -2684,7 +2687,10 @@ def start_workfile_template_builder(): # to avoid looping of the callback, remove it! log.info("Starting workfile template builder...") - build_workfile_template(workfile_creation_enabled=True) + try: + build_workfile_template(workfile_creation_enabled=True) + except TemplateProfileNotFound: + log.warning("Template profile not found. Skipping...") # remove callback since it would be duplicating the workfile nuke.removeOnCreate(start_workfile_template_builder, nodeClass="Root") From 17bfa7f628a1d19e5754047b3ba9598cc4576f8c Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 5 Apr 2023 14:34:57 +0200 Subject: [PATCH 07/15] add positional knobs only if keep_placeholder --- .../nuke/api/workfile_template_builder.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/nuke/api/workfile_template_builder.py b/openpype/hosts/nuke/api/workfile_template_builder.py index cf85a5ea05..72d4ffb476 100644 --- a/openpype/hosts/nuke/api/workfile_template_builder.py +++ b/openpype/hosts/nuke/api/workfile_template_builder.py @@ -219,14 +219,17 @@ class NukePlaceholderLoadPlugin(NukePlaceholderPlugin, PlaceholderLoadMixin): # fix the problem of z_order for backdrops self._fix_z_order(placeholder) - self._imprint_siblings(placeholder) + + if placeholder.data.get("keep_placeholder"): + self._imprint_siblings(placeholder) if placeholder.data["nb_children"] == 0: # save initial nodes positions and dimensions, update them # and set inputs and outputs of loaded nodes + if placeholder.data.get("keep_placeholder"): + self._imprint_inits() + self._update_nodes(placeholder, nuke.allNodes(), nodes_loaded) - self._imprint_inits() - self._update_nodes(placeholder, nuke.allNodes(), nodes_loaded) self._set_loaded_connections(placeholder) elif placeholder.data["siblings"]: @@ -629,14 +632,18 @@ class NukePlaceholderCreatePlugin( # fix the problem of z_order for backdrops self._fix_z_order(placeholder) - self._imprint_siblings(placeholder) + + if placeholder.data.get("keep_placeholder"): + self._imprint_siblings(placeholder) if placeholder.data["nb_children"] == 0: # save initial nodes positions and dimensions, update them # and set inputs and outputs of created nodes - self._imprint_inits() - self._update_nodes(placeholder, nuke.allNodes(), nodes_created) + if placeholder.data.get("keep_placeholder"): + self._imprint_inits() + self._update_nodes(placeholder, nuke.allNodes(), nodes_created) + self._set_created_connections(placeholder) elif placeholder.data["siblings"]: From 199f70e1caabfc2f59ae563bd4f12c4bb04f8d3d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 5 Apr 2023 14:35:07 +0200 Subject: [PATCH 08/15] add missing variable 'handles' to loader (#4781) --- openpype/tools/loader/model.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openpype/tools/loader/model.py b/openpype/tools/loader/model.py index 39e0bd98c3..14671e341f 100644 --- a/openpype/tools/loader/model.py +++ b/openpype/tools/loader/model.py @@ -361,10 +361,11 @@ class SubsetsModel(TreeModel, BaseRepresentationModel): version_data.get("endFrame", None) ) + handles_label = None handle_start = version_data.get("handleStart", None) handle_end = version_data.get("handleEnd", None) if handle_start is not None and handle_end is not None: - handles = "{}-{}".format(str(handle_start), str(handle_end)) + handles_label = "{}-{}".format(str(handle_start), str(handle_end)) if frame_start is not None and frame_end is not None: # Remove superfluous zeros from numbers (3.0 -> 3) to improve @@ -401,7 +402,7 @@ class SubsetsModel(TreeModel, BaseRepresentationModel): "frameStart": frame_start, "frameEnd": frame_end, "duration": duration, - "handles": handles, + "handles": handles_label, "frames": frames, "step": version_data.get("step", None), }) From 70087468c346ad3e91b9980e7c5a5920cd44320b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 5 Apr 2023 15:59:36 +0200 Subject: [PATCH 09/15] General: Anatomy templates formatting (#4773) * TemplatesDict can create different type of template * anatomy templates can be formatted on their own * return objected templates on get item * '_rootless_path' is public classmethod 'rootless_path_from_result' * 'AnatomyStringTemplate' expect anatomy templates * remove key getters * fix typo 'create_ojected_templates' -> 'create_objected_templates' * Fix type of argument * Fix long line --- openpype/lib/path_templates.py | 26 ++++++++++---- openpype/pipeline/anatomy.py | 64 +++++++++++++++++++++++++--------- 2 files changed, 67 insertions(+), 23 deletions(-) diff --git a/openpype/lib/path_templates.py b/openpype/lib/path_templates.py index 0f99efb430..9be1736abf 100644 --- a/openpype/lib/path_templates.py +++ b/openpype/lib/path_templates.py @@ -256,17 +256,18 @@ class TemplatesDict(object): elif isinstance(templates, dict): self._raw_templates = copy.deepcopy(templates) self._templates = templates - self._objected_templates = self.create_ojected_templates(templates) + self._objected_templates = self.create_objected_templates( + templates) else: raise TypeError("<{}> argument must be a dict, not {}.".format( self.__class__.__name__, str(type(templates)) )) def __getitem__(self, key): - return self.templates[key] + return self.objected_templates[key] def get(self, key, *args, **kwargs): - return self.templates.get(key, *args, **kwargs) + return self.objected_templates.get(key, *args, **kwargs) @property def raw_templates(self): @@ -280,8 +281,21 @@ class TemplatesDict(object): def objected_templates(self): return self._objected_templates - @classmethod - def create_ojected_templates(cls, templates): + def _create_template_object(self, template): + """Create template object from a template string. + + Separated into method to give option change class of templates. + + Args: + template (str): Template string. + + Returns: + StringTemplate: Object of template. + """ + + return StringTemplate(template) + + def create_objected_templates(self, templates): if not isinstance(templates, dict): raise TypeError("Expected dict object, got {}".format( str(type(templates)) @@ -297,7 +311,7 @@ class TemplatesDict(object): for key in tuple(item.keys()): value = item[key] if isinstance(value, six.string_types): - item[key] = StringTemplate(value) + item[key] = self._create_template_object(value) elif isinstance(value, dict): inner_queue.append(value) return objected_templates diff --git a/openpype/pipeline/anatomy.py b/openpype/pipeline/anatomy.py index 683960f3d8..30748206a3 100644 --- a/openpype/pipeline/anatomy.py +++ b/openpype/pipeline/anatomy.py @@ -19,6 +19,7 @@ from openpype.client import get_project from openpype.lib.path_templates import ( TemplateUnsolved, TemplateResult, + StringTemplate, TemplatesDict, FormatObject, ) @@ -606,6 +607,32 @@ class AnatomyTemplateResult(TemplateResult): return self.__class__(tmp, self.rootless) +class AnatomyStringTemplate(StringTemplate): + """String template which has access to anatomy.""" + + def __init__(self, anatomy_templates, template): + self.anatomy_templates = anatomy_templates + super(AnatomyStringTemplate, self).__init__(template) + + def format(self, data): + """Format template and add 'root' key to data if not available. + + Args: + data (dict[str, Any]): Formatting data for template. + + Returns: + AnatomyTemplateResult: Formatting result. + """ + + anatomy_templates = self.anatomy_templates + if not data.get("root"): + data = copy.deepcopy(data) + data["root"] = anatomy_templates.anatomy.roots + result = StringTemplate.format(self, data) + rootless_path = anatomy_templates.rootless_path_from_result(result) + return AnatomyTemplateResult(result, rootless_path) + + class AnatomyTemplates(TemplatesDict): inner_key_pattern = re.compile(r"(\{@.*?[^{}0]*\})") inner_key_name_pattern = re.compile(r"\{@(.*?[^{}0]*)\}") @@ -615,12 +642,6 @@ class AnatomyTemplates(TemplatesDict): self.anatomy = anatomy self.loaded_project = None - def __getitem__(self, key): - return self.templates[key] - - def get(self, key, default=None): - return self.templates.get(key, default) - def reset(self): self._raw_templates = None self._templates = None @@ -655,12 +676,7 @@ class AnatomyTemplates(TemplatesDict): def _format_value(self, value, data): if isinstance(value, RootItem): return self._solve_dict(value, data) - - result = super(AnatomyTemplates, self)._format_value(value, data) - if isinstance(result, TemplateResult): - rootless_path = self._rootless_path(result, data) - result = AnatomyTemplateResult(result, rootless_path) - return result + return super(AnatomyTemplates, self)._format_value(value, data) def set_templates(self, templates): if not templates: @@ -689,10 +705,13 @@ class AnatomyTemplates(TemplatesDict): solved_templates = self.solve_template_inner_links(templates) self._templates = solved_templates - self._objected_templates = self.create_ojected_templates( + self._objected_templates = self.create_objected_templates( solved_templates ) + def _create_template_object(self, template): + return AnatomyStringTemplate(self, template) + def default_templates(self): """Return default templates data with solved inner keys.""" return self.solve_template_inner_links( @@ -886,7 +905,8 @@ class AnatomyTemplates(TemplatesDict): return keys_by_subkey - def _dict_to_subkeys_list(self, subdict, pre_keys=None): + @classmethod + def _dict_to_subkeys_list(cls, subdict, pre_keys=None): if pre_keys is None: pre_keys = [] output = [] @@ -895,7 +915,7 @@ class AnatomyTemplates(TemplatesDict): result = list(pre_keys) result.append(key) if isinstance(value, dict): - for item in self._dict_to_subkeys_list(value, result): + for item in cls._dict_to_subkeys_list(value, result): output.append(item) else: output.append(result) @@ -908,7 +928,17 @@ class AnatomyTemplates(TemplatesDict): return {key_list[0]: value} return {key_list[0]: self._keys_to_dicts(key_list[1:], value)} - def _rootless_path(self, result, final_data): + @classmethod + def rootless_path_from_result(cls, result): + """Calculate rootless path from formatting result. + + Args: + result (TemplateResult): Result of StringTemplate formatting. + + Returns: + str: Rootless path if result contains one of anatomy roots. + """ + used_values = result.used_values missing_keys = result.missing_keys template = result.template @@ -924,7 +954,7 @@ class AnatomyTemplates(TemplatesDict): if "root" in invalid_type: return - root_keys = self._dict_to_subkeys_list({"root": used_values["root"]}) + root_keys = cls._dict_to_subkeys_list({"root": used_values["root"]}) if not root_keys: return From c2fede9798b45985f05ae02dd27f4f6cff0ecce7 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Wed, 5 Apr 2023 16:59:27 +0200 Subject: [PATCH 10/15] Handle Harmony zip files with deeper structure (#4782) External Harmony zip files might contain one additional level with scene name. --- openpype/hosts/harmony/api/lib.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/harmony/api/lib.py b/openpype/hosts/harmony/api/lib.py index 8048705dc8..b009dabb44 100644 --- a/openpype/hosts/harmony/api/lib.py +++ b/openpype/hosts/harmony/api/lib.py @@ -242,9 +242,15 @@ def launch_zip_file(filepath): print(f"Localizing {filepath}") temp_path = get_local_harmony_path(filepath) + scene_name = os.path.basename(temp_path) + if os.path.exists(os.path.join(temp_path, scene_name)): + # unzipped with duplicated scene_name + temp_path = os.path.join(temp_path, scene_name) + scene_path = os.path.join( - temp_path, os.path.basename(temp_path) + ".xstage" + temp_path, scene_name + ".xstage" ) + unzip = False if os.path.exists(scene_path): # Check remote scene is newer than local. @@ -262,6 +268,10 @@ def launch_zip_file(filepath): with _ZipFile(filepath, "r") as zip_ref: zip_ref.extractall(temp_path) + if os.path.exists(os.path.join(temp_path, scene_name)): + # unzipped with duplicated scene_name + temp_path = os.path.join(temp_path, scene_name) + # Close existing scene. if ProcessContext.pid: os.kill(ProcessContext.pid, signal.SIGTERM) @@ -309,7 +319,7 @@ def launch_zip_file(filepath): ) if not os.path.exists(scene_path): - print("error: cannot determine scene file") + print("error: cannot determine scene file {}".format(scene_path)) ProcessContext.server.stop() return From b2a011d5174f1ff9cb2d1d7fcb539e30bfe9e96f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 6 Apr 2023 15:27:05 +0200 Subject: [PATCH 11/15] nuke: settings and mixin for some validators --- .../nuke/plugins/publish/validate_asset_name.py | 10 ++++++++-- .../nuke/plugins/publish/validate_backdrop.py | 16 +++++++++++++--- .../publish/validate_script_attributes.py | 2 +- .../settings/defaults/project_settings/nuke.json | 5 +++++ .../schemas/schema_nuke_publish.json | 10 +++++++--- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/openpype/hosts/nuke/plugins/publish/validate_asset_name.py b/openpype/hosts/nuke/plugins/publish/validate_asset_name.py index f6822bee45..df05f76a5b 100644 --- a/openpype/hosts/nuke/plugins/publish/validate_asset_name.py +++ b/openpype/hosts/nuke/plugins/publish/validate_asset_name.py @@ -9,9 +9,9 @@ import openpype.hosts.nuke.api.lib as nlib from openpype.pipeline.publish import ( ValidateContentsOrder, PublishXmlValidationError, + OptionalPyblishPluginMixin ) - class SelectInvalidInstances(pyblish.api.Action): """Select invalid instances in Outliner.""" @@ -92,7 +92,10 @@ class RepairSelectInvalidInstances(pyblish.api.Action): nlib.set_node_data(node, nlib.INSTANCE_DATA_KNOB, node_data) -class ValidateCorrectAssetName(pyblish.api.InstancePlugin): +class ValidateCorrectAssetName( + pyblish.api.InstancePlugin, + OptionalPyblishPluginMixin +): """Validator to check if instance asset match context asset. When working in per-shot style you always publish data in context of @@ -111,6 +114,9 @@ class ValidateCorrectAssetName(pyblish.api.InstancePlugin): optional = True def process(self, instance): + if not self.is_active(instance.data): + return + asset = instance.data.get("asset") context_asset = instance.context.data["assetEntity"]["name"] node = instance.data["transientData"]["node"] diff --git a/openpype/hosts/nuke/plugins/publish/validate_backdrop.py b/openpype/hosts/nuke/plugins/publish/validate_backdrop.py index 5f4a5c3ab0..ad60089952 100644 --- a/openpype/hosts/nuke/plugins/publish/validate_backdrop.py +++ b/openpype/hosts/nuke/plugins/publish/validate_backdrop.py @@ -1,8 +1,12 @@ import nuke import pyblish from openpype.hosts.nuke import api as napi -from openpype.pipeline import PublishXmlValidationError +from openpype.pipeline.publish import ( + ValidateContentsOrder, + PublishXmlValidationError, + OptionalPyblishPluginMixin +) class SelectCenterInNodeGraph(pyblish.api.Action): """ @@ -46,12 +50,15 @@ class SelectCenterInNodeGraph(pyblish.api.Action): nuke.zoom(2, [min(all_xC), min(all_yC)]) -class ValidateBackdrop(pyblish.api.InstancePlugin): +class ValidateBackdrop( + pyblish.api.InstancePlugin, + OptionalPyblishPluginMixin +): """ Validate amount of nodes on backdrop node in case user forgotten to add nodes above the publishing backdrop node. """ - order = pyblish.api.ValidatorOrder + order = ValidateContentsOrder optional = True families = ["nukenodes"] label = "Validate Backdrop" @@ -59,6 +66,9 @@ class ValidateBackdrop(pyblish.api.InstancePlugin): actions = [SelectCenterInNodeGraph] def process(self, instance): + if not self.is_active(instance.data): + return + child_nodes = instance.data["transientData"]["childNodes"] connections_out = instance.data["transientData"]["nodeConnectionsOut"] diff --git a/openpype/hosts/nuke/plugins/publish/validate_script_attributes.py b/openpype/hosts/nuke/plugins/publish/validate_script_attributes.py index bd0bbf8044..57bfce7993 100644 --- a/openpype/hosts/nuke/plugins/publish/validate_script_attributes.py +++ b/openpype/hosts/nuke/plugins/publish/validate_script_attributes.py @@ -18,7 +18,7 @@ class ValidateScriptAttributes( order = pyblish.api.ValidatorOrder + 0.1 families = ["workfile"] - label = "Validatte script attributes" + label = "Validate script attributes" hosts = ["nuke"] optional = True actions = [RepairAction] diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json index c249955dc8..19071e1d21 100644 --- a/openpype/settings/defaults/project_settings/nuke.json +++ b/openpype/settings/defaults/project_settings/nuke.json @@ -363,6 +363,11 @@ "optional": true, "active": true }, + "ValidateBackdrop": { + "enabled": true, + "optional": true, + "active": true + }, "ValidateScript": { "enabled": true, "optional": true, diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json index 1c542279fc..ce9fa04c6a 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_publish.json @@ -62,7 +62,7 @@ "template_data": [ { "key": "ValidateCorrectAssetName", - "label": "Validate Correct Asset name" + "label": "Validate Correct Asset Name" } ] }, @@ -72,7 +72,7 @@ "template_data": [ { "key": "ValidateContainers", - "label": "ValidateContainers" + "label": "Validate Containers" } ] }, @@ -81,7 +81,7 @@ "collapsible": true, "checkbox_key": "enabled", "key": "ValidateKnobs", - "label": "ValidateKnobs", + "label": "Validate Knobs", "is_group": true, "children": [ { @@ -104,6 +104,10 @@ "key": "ValidateOutputResolution", "label": "Validate Output Resolution" }, + { + "key": "ValidateBackdrop", + "label": "Validate Backdrop" + }, { "key": "ValidateGizmo", "label": "Validate Gizmo (Group)" From d2f4009c207c0f2faa8fbd3380879d9ea945a996 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 6 Apr 2023 15:44:59 +0200 Subject: [PATCH 12/15] dividing workflows --- .github/workflows/pr_labels.yml | 49 +++++++++++++++++++ ..._actions.yml => project_task_statuses.yml} | 47 +----------------- 2 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/pr_labels.yml rename .github/workflows/{project_actions.yml => project_task_statuses.yml} (68%) diff --git a/.github/workflows/pr_labels.yml b/.github/workflows/pr_labels.yml new file mode 100644 index 0000000000..c1ab3547f2 --- /dev/null +++ b/.github/workflows/pr_labels.yml @@ -0,0 +1,49 @@ +name: pr-labels + +on: + pull_request_target: + types: [opened, assigned] + +jobs: + size-label: + name: pr_size_label + runs-on: ubuntu-latest + if: github.event.action == 'assigned' || github.event.action == 'opened' + steps: + - name: Add size label + uses: "pascalgn/size-label-action@v0.4.3" + env: + GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" + IGNORED: ".gitignore\n*.md\n*.json" + with: + sizes: > + { + "0": "XS", + "100": "S", + "500": "M", + "1000": "L", + "1500": "XL", + "2500": "XXL" + } + + label_prs_branch: + name: pr_branch_label + runs-on: ubuntu-latest + if: github.event.action == 'assigned' || github.event.action == 'opened' + steps: + - name: Label PRs - Branch name detection + uses: ffittschen/pr-branch-labeler@v1 + with: + repo-token: ${{ secrets.YNPUT_BOT_TOKEN }} + + label_prs_globe: + name: pr_globe_label + runs-on: ubuntu-latest + if: github.event.action == 'assigned' || github.event.action == 'opened' + steps: + - name: Label PRs - Globe detection + uses: actions/labeler@v4.0.3 + with: + repo-token: ${{ secrets.YNPUT_BOT_TOKEN }} + configuration-path: ".github/pr-glob-labeler.yml" + sync-labels: false diff --git a/.github/workflows/project_actions.yml b/.github/workflows/project_task_statuses.yml similarity index 68% rename from .github/workflows/project_actions.yml rename to .github/workflows/project_task_statuses.yml index 3589b4acc2..b3eb5ad810 100644 --- a/.github/workflows/project_actions.yml +++ b/.github/workflows/project_task_statuses.yml @@ -1,8 +1,6 @@ -name: project-actions +name: project-task-statuses on: - pull_request_target: - types: [opened, assigned] pull_request_review: types: [submitted] issue_comment: @@ -70,46 +68,3 @@ jobs: -d '{ "status": "in progress" }' - - size-label: - name: pr_size_label - runs-on: ubuntu-latest - if: github.event.action == 'assigned' || github.event.action == 'opened' - steps: - - name: Add size label - uses: "pascalgn/size-label-action@v0.4.3" - env: - GITHUB_TOKEN: "${{ secrets.YNPUT_BOT_TOKEN }}" - IGNORED: ".gitignore\n*.md\n*.json" - with: - sizes: > - { - "0": "XS", - "100": "S", - "500": "M", - "1000": "L", - "1500": "XL", - "2500": "XXL" - } - - label_prs_branch: - name: pr_branch_label - runs-on: ubuntu-latest - if: github.event.action == 'assigned' || github.event.action == 'opened' - steps: - - name: Label PRs - Branch name detection - uses: ffittschen/pr-branch-labeler@v1 - with: - repo-token: ${{ secrets.YNPUT_BOT_TOKEN }} - - label_prs_globe: - name: pr_globe_label - runs-on: ubuntu-latest - if: github.event.action == 'assigned' || github.event.action == 'opened' - steps: - - name: Label PRs - Globe detection - uses: actions/labeler@v4.0.3 - with: - repo-token: ${{ secrets.YNPUT_BOT_TOKEN }} - configuration-path: ".github/pr-glob-labeler.yml" - sync-labels: false From fe5853fcf1092b5a83fa1208ada3b00699767dc6 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 6 Apr 2023 16:12:34 +0200 Subject: [PATCH 13/15] Fix Py2 support - attr dataclass must be new style class (#4808) --- openpype/hosts/maya/plugins/publish/extract_look.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_look.py b/openpype/hosts/maya/plugins/publish/extract_look.py index 93054e5fbb..520951a5e6 100644 --- a/openpype/hosts/maya/plugins/publish/extract_look.py +++ b/openpype/hosts/maya/plugins/publish/extract_look.py @@ -26,7 +26,7 @@ HARDLINK = 2 @attr.s -class TextureResult: +class TextureResult(object): """The resulting texture of a processed file for a resource""" # Path to the file path = attr.ib() From b0daca4d8b24e8020a753dee9d8b42dc980eedb2 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 6 Apr 2023 16:19:57 +0200 Subject: [PATCH 14/15] adding issues templates --- .github/ISSUE_TEMPLATE/bug_report.md | 33 ------- .github/ISSUE_TEMPLATE/bug_report.yml | 97 +++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 + .../ISSUE_TEMPLATE/enhancement_request.yml | 52 ++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ---- .github/workflows/documentation.yml | 2 +- .github/workflows/milestone_assign.yml | 2 +- .github/workflows/milestone_create.yml | 2 +- .../workflows/miletone_release_trigger.yml | 2 +- .github/workflows/nightly_merge.yml | 2 +- .github/workflows/pr_labels.yml | 2 +- .github/workflows/prerelease.yml | 2 +- .github/workflows/project_task_statuses.yml | 2 +- .github/workflows/test_build.yml | 2 +- .github/workflows/update_bug_report.yml | 25 +++++ 15 files changed, 188 insertions(+), 62 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/enhancement_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/update_bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 96e768e420..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- -**Running version** -[ex. 3.14.1-nightly.2] - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. windows] - - Host: [e.g. Maya, Nuke, Houdini] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..426ffacdec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,97 @@ +name: Bug Report +description: File a bug report +title: 'bug: ' +labels: + - 'type: bug' +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this bug report! + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: >- + Please search to see if an issue already exists for the bug you + encountered. + options: + - label: I have searched the existing issues + required: true + - type: textarea + attributes: + label: "Current Behavior:" + description: A concise description of what you're experiencing. + validations: + required: true + - type: textarea + attributes: + label: "Expected Behavior:" + description: A concise description of what you expected to happen. + validations: + required: false + - type: dropdown + id: _version + attributes: + label: Version + description: What version are you running? Look to OpenPype Tray + options: + - 3.6.1 + - 3.4.3 + - 3.4.2 + - 3.4.1 + - 3.5.0 + - 3.4.4 + - 3.3.0 + - 3.2.0 + - CI/3.1.1-nightly.1 + - CI/3.1.0-nightly.4 + - CI/3.1.0-nightly.2 + - 0.8.1 + - 0.8.0 + - 0.7.4 + validations: + required: true + - type: dropdown + validations: + required: true + attributes: + label: What platform you are running OpenPype on? + description: | + Please specify the operating systems you are running OpenPype with. + multiple: true + options: + - Windows + - Linux / Centos + - Linux / Ubuntu + - Linux / RedHat + - MacOS + - type: textarea + id: to-reproduce + attributes: + label: "Steps To Reproduce:" + description: Steps to reproduce the behavior. + placeholder: | + 1. How did the configuration look like + 2. What type of action was made + validations: + required: true + - type: checkboxes + attributes: + label: Is there any more labels you wish to add? + description: Please search labels and identify those related to your bug. + options: + - label: I have searched labels and added any + required: true + - type: textarea + id: logs + attributes: + label: "Relevant log output:" + description: >- + Please copy and paste any relevant log output. This will be + automatically formatted into code, so no need for backticks. + render: shell + - type: textarea + id: additional-context + attributes: + label: "Additional context:" + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..a2896f77de --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Ynput Discord Server + url: https://discord.gg/ynput + about: For community quick chats. \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/enhancement_request.yml b/.github/ISSUE_TEMPLATE/enhancement_request.yml new file mode 100644 index 0000000000..e89391c3d7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/enhancement_request.yml @@ -0,0 +1,52 @@ +name: Enhancement Request +description: Create a report to help us enhance a particular feature +title: "enhancement: " +labels: + - "type: enhancement" +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out this enhancement request report! + - type: checkboxes + attributes: + label: Is there an existing issue for this? + description: Please search to see if an issue already exists for the bug you encountered. + options: + - label: I have searched the existing issues + required: true + - type: textarea + id: related-feature + attributes: + label: Please state which of feature you have in mind and describe what are its shortcomings? + description: A clear and concise description of what the problem is. + validations: + required: true + - type: textarea + id: enhancement-proposal + attributes: + label: How would you imagine the enhancement of the feature? + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: checkboxes + attributes: + label: Is there any more labels you wish to add? + description: Please search labels and identify those related to your enhancement. + options: + - label: I have searched labels and added any + required: true + - type: textarea + id: alternatives + attributes: + label: "Describe alternatives you've considered:" + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + - type: textarea + id: additional-context + attributes: + label: "Additional context:" + description: Add any other context or screenshots about the enhancement request here. + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 11fc491ef1..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index f78e95528f..f2e7d1058f 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,4 +1,4 @@ -name: documentation +name: 📜 Documentation on: pull_request: diff --git a/.github/workflows/milestone_assign.yml b/.github/workflows/milestone_assign.yml index 3cbee51472..df4625c225 100644 --- a/.github/workflows/milestone_assign.yml +++ b/.github/workflows/milestone_assign.yml @@ -1,4 +1,4 @@ -name: Milestone - assign to PRs +name: 👉🏻 Milestone - assign to PRs on: pull_request_target: diff --git a/.github/workflows/milestone_create.yml b/.github/workflows/milestone_create.yml index 632704e64a..437c9e31b4 100644 --- a/.github/workflows/milestone_create.yml +++ b/.github/workflows/milestone_create.yml @@ -1,4 +1,4 @@ -name: Milestone - create default +name: ➕ Milestone - create default on: milestone: diff --git a/.github/workflows/miletone_release_trigger.yml b/.github/workflows/miletone_release_trigger.yml index b5b8aab1dc..26a2d5833d 100644 --- a/.github/workflows/miletone_release_trigger.yml +++ b/.github/workflows/miletone_release_trigger.yml @@ -1,4 +1,4 @@ -name: Milestone Release [trigger] +name: 🚩 Milestone Release [trigger] on: workflow_dispatch: diff --git a/.github/workflows/nightly_merge.yml b/.github/workflows/nightly_merge.yml index 1776d7a464..f1850762d9 100644 --- a/.github/workflows/nightly_merge.yml +++ b/.github/workflows/nightly_merge.yml @@ -1,4 +1,4 @@ -name: Dev -> Main +name: 🔀 Dev -> Main on: schedule: diff --git a/.github/workflows/pr_labels.yml b/.github/workflows/pr_labels.yml index c1ab3547f2..ecc95051aa 100644 --- a/.github/workflows/pr_labels.yml +++ b/.github/workflows/pr_labels.yml @@ -1,4 +1,4 @@ -name: pr-labels +name: 🔖 PR labels on: pull_request_target: diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index 571b0339e1..e8c619c6eb 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -1,4 +1,4 @@ -name: Nightly Prerelease +name: ⏳ Nightly Prerelease on: workflow_dispatch: diff --git a/.github/workflows/project_task_statuses.yml b/.github/workflows/project_task_statuses.yml index b3eb5ad810..d078c08b70 100644 --- a/.github/workflows/project_task_statuses.yml +++ b/.github/workflows/project_task_statuses.yml @@ -1,4 +1,4 @@ -name: project-task-statuses +name: 📊 Project task statuses on: pull_request_review: diff --git a/.github/workflows/test_build.yml b/.github/workflows/test_build.yml index 064a4d47e0..fd8e0e642d 100644 --- a/.github/workflows/test_build.yml +++ b/.github/workflows/test_build.yml @@ -1,7 +1,7 @@ # This workflow will upload a Python Package using Twine when a release is created # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries -name: Test Build +name: 🏗️ Test Build on: pull_request: diff --git a/.github/workflows/update_bug_report.yml b/.github/workflows/update_bug_report.yml new file mode 100644 index 0000000000..322bee4ff2 --- /dev/null +++ b/.github/workflows/update_bug_report.yml @@ -0,0 +1,25 @@ +name: 🐞 Update Bug Report + +on: + workflow_dispatch: + release: + # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#release + types: [published] + +jobs: + update-bug-report: + runs-on: ubuntu-latest + name: Update bug report + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.release.target_commitish }} + - name: Update version + uses: ShaMan123/gha-populate-form-version@v2.0.2 + with: + github_token: ${{ secrets.YNPUT_BOT_TOKEN }} + registry: github + dropdown: _version + limit_to: 25 + form: .github/ISSUE_TEMPLATE/bug_report.yml + commit_message: 'chore(): update bug report / version' \ No newline at end of file From cd756ba2157e405b5daa1ca9726a7f1b0ea322ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 6 Apr 2023 14:43:58 +0000 Subject: [PATCH 15/15] chore(): update bug report / version --- .github/ISSUE_TEMPLATE/bug_report.yml | 53 ++++++++++++++++----------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 426ffacdec..37fe0e0e93 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -19,13 +19,13 @@ body: required: true - type: textarea attributes: - label: "Current Behavior:" + label: 'Current Behavior:' description: A concise description of what you're experiencing. validations: required: true - type: textarea attributes: - label: "Expected Behavior:" + label: 'Expected Behavior:' description: A concise description of what you expected to happen. validations: required: false @@ -35,20 +35,31 @@ body: label: Version description: What version are you running? Look to OpenPype Tray options: - - 3.6.1 - - 3.4.3 - - 3.4.2 - - 3.4.1 - - 3.5.0 - - 3.4.4 - - 3.3.0 - - 3.2.0 - - CI/3.1.1-nightly.1 - - CI/3.1.0-nightly.4 - - CI/3.1.0-nightly.2 - - 0.8.1 - - 0.8.0 - - 0.7.4 + - 3.15.3 + - 3.15.2 + - 3.15.1 + - 3.15.0 + - 3.14.10 + - 3.14.9 + - 3.14.8 + - 3.14.7 + - 3.14.6 + - 3.14.5 + - 3.14.4 + - 3.14.3 + - 3.14.2 + - 3.14.1 + - 3.14.0 + - 3.13.0 + - 3.12.2 + - 3.12.1 + - 3.12.0 + - 3.11.1 + - 3.11.0 + - 3.10.0 + - 3.9.8 + - 3.9.7 + - 3.9.6 validations: required: true - type: dropdown @@ -68,7 +79,7 @@ body: - type: textarea id: to-reproduce attributes: - label: "Steps To Reproduce:" + label: 'Steps To Reproduce:' description: Steps to reproduce the behavior. placeholder: | 1. How did the configuration look like @@ -80,12 +91,12 @@ body: label: Is there any more labels you wish to add? description: Please search labels and identify those related to your bug. options: - - label: I have searched labels and added any - required: true + - label: I have searched labels and added any + required: true - type: textarea id: logs attributes: - label: "Relevant log output:" + label: 'Relevant log output:' description: >- Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. @@ -93,5 +104,5 @@ body: - type: textarea id: additional-context attributes: - label: "Additional context:" + label: 'Additional context:' description: Add any other context about the problem here.