From 0c7a12c1f22938704c3c70bdd9ee375a8c5366d5 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 21 Dec 2021 15:59:00 +0100 Subject: [PATCH] Implemented validators for New publisher for Photoshop --- .../publish/help/validate_instance_asset.xml | 25 +++++++++++++++++++ .../plugins/publish/help/validate_naming.xml | 21 ++++++++++++++++ .../publish/help/validate_unique_subsets.xml | 23 +++++++++++++++++ .../publish/validate_instance_asset.py | 12 +++++++-- .../plugins/publish/validate_naming.py | 22 ++++++++++------ .../publish/validate_unique_subsets.py | 23 +++++++++++++---- 6 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml create mode 100644 openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml new file mode 100644 index 0000000000..3b040e8ea8 --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml @@ -0,0 +1,25 @@ + + + +Subset context + +## Invalid subset context + +Asset name found '{found}' in subsets, expected '{expected}'. + +### How to repair? + +You can fix this with `Repair` button on the right. This will use '{expected}' asset name and overwrite '{found}' asset name in scene metadata. + +After that restart `Publish` with a `Reload button`. + +If this is unwanted, close workfile and open again, that way different asset value would be used for context information. + + +### __Detailed Info__ (optional) + +This might happen if you are reuse old workfile and open it in different context. +(Eg. you created subset "renderCompositingDefault" from asset "Robot' in "your_project_Robot_compositing.aep", now you opened this workfile in a context "Sloth" but existing subset for "Robot" asset stayed in the workfile.) + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml new file mode 100644 index 0000000000..21a7370340 --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_naming.xml @@ -0,0 +1,21 @@ + + + +Invalid name + +## Invalid name of subset + +Name of subset is created from a layer name. Some characters (whitespace, '/' etc.) are not allowed because of publishing (files couldn't be saved on some OSes). + +### How to repair? + +You can fix this with `Repair` button on the right. This will remove invalid characters with safe character ('_' by default) in both subset names and matching group names. + +After that restart `Publish` with a `Reload button`. + +Or you use `Subset Manager` to delete existing subsets, remove created groups, rename layers that are used for their creation and use `Create` option in the Openpype menu to create them again. + +Invalid characters and 'safe character' could be configured in Settings. Ask your OpenPype admin to modify them if necessary. + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml b/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml new file mode 100644 index 0000000000..fa7c76a2dd --- /dev/null +++ b/openpype/hosts/photoshop/plugins/publish/help/validate_unique_subsets.xml @@ -0,0 +1,23 @@ + + + +Subsets duplicated + +## Some subsets are duplicated + +Created subsets must be unique. + +Subsets '{duplicates_str}' are duplicated. + +### How to repair? + +Use `Subset Manager` to delete duplicated subset to have only unique subset names and restart `Publish` with a `Reload button`. + + +### __Detailed Info__ (optional) + +Subset names are created from layer names. Layer names are filtered for characters that would break publishing process when files are created. +This replacement process might result in duplicate names of subsets. + + + \ No newline at end of file diff --git a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py index 4dc1972074..8f13cc6b33 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_instance_asset.py @@ -1,8 +1,10 @@ from avalon import api import pyblish.api -import openpype.api from avalon import photoshop +import openpype.api +from openpype.pipeline import PublishXmlValidationError + class ValidateInstanceAssetRepair(pyblish.api.Action): """Repair the instance asset.""" @@ -56,4 +58,10 @@ class ValidateInstanceAsset(pyblish.api.InstancePlugin): f"If that's not correct value, close workfile and " f"reopen via Workfiles!" ) - assert instance_asset == current_asset, msg + formatting_data = { + "found": instance_asset, + "expected": current_asset + } + if instance_asset != current_asset: + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) diff --git a/openpype/hosts/photoshop/plugins/publish/validate_naming.py b/openpype/hosts/photoshop/plugins/publish/validate_naming.py index 1635096f4b..d548992f09 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_naming.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_naming.py @@ -1,9 +1,11 @@ import re import pyblish.api -import openpype.api from avalon import photoshop +import openpype.api +from openpype.pipeline import PublishXmlValidationError + class ValidateNamingRepair(pyblish.api.Action): """Repair the instance asset.""" @@ -69,14 +71,18 @@ class ValidateNaming(pyblish.api.InstancePlugin): replace_char = '' def process(self, instance): - help_msg = ' Use Repair action (A) in Pyblish to fix it.' - msg = "Name \"{}\" is not allowed.{}".format(instance.data["name"], - help_msg) - assert not re.search(self.invalid_chars, instance.data["name"]), msg + msg = "Name \"{}\" is not allowed.".format(instance.data["name"]) - msg = "Subset \"{}\" is not allowed.{}".format(instance.data["subset"], - help_msg) - assert not re.search(self.invalid_chars, instance.data["subset"]), msg + formatting_data = {"error_msg": msg} + if re.search(self.invalid_chars, instance.data["name"]): + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) + + msg = "Subset \"{}\" is not allowed.".format(instance.data["subset"]) + formatting_data = {"error_msg": msg} + if re.search(self.invalid_chars, instance.data["subset"]): + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data) @classmethod def get_replace_chars(cls): diff --git a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py index 15ae5fbcea..d41fefa971 100644 --- a/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py +++ b/openpype/hosts/photoshop/plugins/publish/validate_unique_subsets.py @@ -1,5 +1,8 @@ +import collections + import pyblish.api import openpype.api +from openpype.pipeline import PublishXmlValidationError class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): @@ -19,8 +22,18 @@ class ValidateSubsetUniqueness(pyblish.api.ContextPlugin): if instance.data.get('publish'): subset_names.append(instance.data.get('subset')) - msg = ( - "Instance subset names are not unique. " + - "Remove duplicates via SubsetManager." - ) - assert len(subset_names) == len(set(subset_names)), msg + duplicates = [item + for item, count in + collections.Counter(subset_names).items() + if count > 1] + + if duplicates: + duplicates_str = ",".join(duplicates) + formatting_data = {"duplicates_str": duplicates_str} + msg = ( + "Instance subset names {} are not unique.".format( + duplicates_str) + + " Remove duplicates via SubsetManager." + ) + raise PublishXmlValidationError(self, msg, + formatting_data=formatting_data)