diff --git a/openpype/hosts/harmony/plugins/publish/help/validate_audio.xml b/openpype/hosts/harmony/plugins/publish/help/validate_audio.xml
new file mode 100644
index 00000000000..e9a183c6759
--- /dev/null
+++ b/openpype/hosts/harmony/plugins/publish/help/validate_audio.xml
@@ -0,0 +1,15 @@
+
+
+
+Missing audio file
+
+## Cannot locate linked audio file
+
+Audio file at {audio_url} cannot be found.
+
+### How to repair?
+
+Copy audio file to the highlighted location or remove audio link in the workfile.
+
+
+
\ No newline at end of file
diff --git a/openpype/hosts/harmony/plugins/publish/help/validate_instances.xml b/openpype/hosts/harmony/plugins/publish/help/validate_instances.xml
new file mode 100644
index 00000000000..3b040e8ea8e
--- /dev/null
+++ b/openpype/hosts/harmony/plugins/publish/help/validate_instances.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/harmony/plugins/publish/help/validate_scene_settings.xml b/openpype/hosts/harmony/plugins/publish/help/validate_scene_settings.xml
new file mode 100644
index 00000000000..36fa90456ed
--- /dev/null
+++ b/openpype/hosts/harmony/plugins/publish/help/validate_scene_settings.xml
@@ -0,0 +1,35 @@
+
+
+
+Scene setting
+
+## Invalid scene setting found
+
+One of the settings in a scene doesn't match to asset settings in database.
+
+{invalid_setting_str}
+
+### How to repair?
+
+Change values for {invalid_keys_str} in the scene OR change them in the asset database if they are wrong there.
+
+
+### __Detailed Info__ (optional)
+
+This error is shown when for example resolution in the scene doesn't match to resolution set on the asset in the database.
+Either value in the database or in the scene is wrong.
+
+
+
+Scene file doesn't exist
+
+## Scene file doesn't exist
+
+Collected scene {scene_url} doesn't exist.
+
+### How to repair?
+
+Re-save file, start publish from the beginning again.
+
+
+
\ No newline at end of file
diff --git a/openpype/hosts/harmony/plugins/publish/validate_audio.py b/openpype/hosts/harmony/plugins/publish/validate_audio.py
index c043b31ca67..9322968a9d4 100644
--- a/openpype/hosts/harmony/plugins/publish/validate_audio.py
+++ b/openpype/hosts/harmony/plugins/publish/validate_audio.py
@@ -4,6 +4,8 @@
from avalon import harmony
+from openpype.pipeline import PublishXmlValidationError
+
class ValidateAudio(pyblish.api.InstancePlugin):
"""Ensures that there is an audio file in the scene.
@@ -42,4 +44,9 @@ def process(self, instance):
msg = "You are missing audio file:\n{}".format(audio_path)
- assert os.path.isfile(audio_path), msg
+ formatting_data = {
+ "audio_url": audio_path
+ }
+ if os.path.isfile(audio_path):
+ raise PublishXmlValidationError(self, msg,
+ formatting_data=formatting_data)
diff --git a/openpype/hosts/harmony/plugins/publish/validate_instances.py b/openpype/hosts/harmony/plugins/publish/validate_instances.py
index 78073a1978f..9fb46dec497 100644
--- a/openpype/hosts/harmony/plugins/publish/validate_instances.py
+++ b/openpype/hosts/harmony/plugins/publish/validate_instances.py
@@ -1,8 +1,10 @@
import os
+from avalon import harmony
import pyblish.api
import openpype.api
-from avalon import harmony
+
+from openpype.pipeline import PublishXmlValidationError
class ValidateInstanceRepair(pyblish.api.Action):
@@ -45,4 +47,12 @@ def process(self, instance):
"Instance asset is not the same as current asset:"
f"\nInstance: {instance_asset}\nCurrent: {current_asset}"
)
- 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/harmony/plugins/publish/validate_scene_settings.py b/openpype/hosts/harmony/plugins/publish/validate_scene_settings.py
index 0371e800955..e10adb885c3 100644
--- a/openpype/hosts/harmony/plugins/publish/validate_scene_settings.py
+++ b/openpype/hosts/harmony/plugins/publish/validate_scene_settings.py
@@ -7,7 +7,9 @@
import pyblish.api
from avalon import harmony
+
import openpype.hosts.harmony
+from openpype.pipeline import PublishXmlValidationError
class ValidateSceneSettingsRepair(pyblish.api.Action):
@@ -102,6 +104,7 @@ def process(self, instance):
self.log.debug("current scene settings {}".format(current_settings))
invalid_settings = []
+ invalid_keys = set()
for key, value in expected_settings.items():
if value != current_settings[key]:
invalid_settings.append({
@@ -109,6 +112,7 @@ def process(self, instance):
"expected": value,
"current": current_settings[key]
})
+ invalid_keys.add(key)
if ((expected_settings["handleStart"]
or expected_settings["handleEnd"])
@@ -120,10 +124,30 @@ def process(self, instance):
msg = "Found invalid settings:\n{}".format(
json.dumps(invalid_settings, sort_keys=True, indent=4)
)
- assert not invalid_settings, msg
- assert os.path.exists(instance.context.data.get("scenePath")), (
- "Scene file not found (saved under wrong name)"
- )
+
+ if invalid_settings:
+ invalid_keys_str = ",".join(invalid_keys)
+ break_str = "
"
+ invalid_setting_str = "Found invalid settings:
{}".\
+ format(break_str.join(invalid_settings))
+
+ formatting_data = {
+ "invalid_setting_str": invalid_setting_str,
+ "invalid_keys_str": invalid_keys_str
+ }
+ raise PublishXmlValidationError(self, msg,
+ formatting_data=formatting_data)
+
+ scene_url = instance.context.data.get("scenePath")
+ if not os.path.exists(scene_url):
+ msg = "Scene file {} not found (saved under wrong name)".format(
+ scene_url
+ )
+ formatting_data = {
+ "scene_url": scene_url
+ }
+ raise PublishXmlValidationError(self, msg, key="file_not_found",
+ formatting_data=formatting_data)
def _update_frames(expected_settings):