diff --git a/openpype/hosts/aftereffects/plugins/publish/help/validate_instance_asset.xml b/openpype/hosts/aftereffects/plugins/publish/help/validate_instance_asset.xml
new file mode 100644
index 0000000000..13f03a9b9a
--- /dev/null
+++ b/openpype/hosts/aftereffects/plugins/publish/help/validate_instance_asset.xml
@@ -0,0 +1,21 @@
+
+
+
+Subset context
+
+## Invalid subset context
+
+Context of the given subset doesn't match your current scene.
+
+### How to repair?
+
+You can fix this with "repair" button on the right.
+
+
+### __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/aftereffects/plugins/publish/help/validate_scene_settings.xml b/openpype/hosts/aftereffects/plugins/publish/help/validate_scene_settings.xml
new file mode 100644
index 0000000000..36fa90456e
--- /dev/null
+++ b/openpype/hosts/aftereffects/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/aftereffects/plugins/publish/validate_instance_asset.py b/openpype/hosts/aftereffects/plugins/publish/validate_instance_asset.py
index eff89adcb3..491e07b6c4 100644
--- a/openpype/hosts/aftereffects/plugins/publish/validate_instance_asset.py
+++ b/openpype/hosts/aftereffects/plugins/publish/validate_instance_asset.py
@@ -2,6 +2,7 @@ from avalon import api
import pyblish.api
import openpype.api
from avalon import aftereffects
+from openpype.pipeline import PublishXmlValidationError
class ValidateInstanceAssetRepair(pyblish.api.Action):
@@ -29,7 +30,6 @@ class ValidateInstanceAssetRepair(pyblish.api.Action):
data["asset"] = api.Session["AVALON_ASSET"]
stub.imprint(instance[0], data)
-
class ValidateInstanceAsset(pyblish.api.InstancePlugin):
"""Validate the instance asset is the current selected context asset.
@@ -53,9 +53,8 @@ class ValidateInstanceAsset(pyblish.api.InstancePlugin):
current_asset = api.Session["AVALON_ASSET"]
msg = (
f"Instance asset {instance_asset} is not the same "
- f"as current context {current_asset}. PLEASE DO:\n"
- f"Repair with 'A' action to use '{current_asset}'.\n"
- f"If that's not correct value, close workfile and "
- f"reopen via Workfiles!"
+ f"as current context {current_asset}."
)
- assert instance_asset == current_asset, msg
+
+ if instance_asset != current_asset:
+ raise PublishXmlValidationError(self, msg)
diff --git a/openpype/hosts/aftereffects/plugins/publish/validate_scene_settings.py b/openpype/hosts/aftereffects/plugins/publish/validate_scene_settings.py
index 7fba11957c..0e7a54005a 100644
--- a/openpype/hosts/aftereffects/plugins/publish/validate_scene_settings.py
+++ b/openpype/hosts/aftereffects/plugins/publish/validate_scene_settings.py
@@ -7,6 +7,7 @@ import pyblish.api
from avalon import aftereffects
+from openpype.pipeline import PublishXmlValidationError
import openpype.hosts.aftereffects.api as api
stub = aftereffects.stub()
@@ -103,12 +104,14 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin):
self.log.info("current_settings:: {}".format(current_settings))
invalid_settings = []
+ invalid_keys = set()
for key, value in expected_settings.items():
if value != current_settings[key]:
invalid_settings.append(
"{} expected: {} found: {}".format(key, value,
current_settings[key])
)
+ invalid_keys.add(key)
if ((expected_settings.get("handleStart")
or expected_settings.get("handleEnd"))
@@ -120,7 +123,27 @@ class ValidateSceneSettings(pyblish.api.InstancePlugin):
msg = "Found invalid settings:\n{}".format(
"\n".join(invalid_settings)
)
- assert not invalid_settings, msg
- assert os.path.exists(instance.data.get("source")), (
- "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)
+
+ if not os.path.exists(instance.data.get("source")):
+ scene_url = instance.data.get("source")
+ 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)
diff --git a/openpype/pipeline/create/context.py b/openpype/pipeline/create/context.py
index 7b0f50b1dc..2d748dd74f 100644
--- a/openpype/pipeline/create/context.py
+++ b/openpype/pipeline/create/context.py
@@ -306,8 +306,6 @@ class PublishAttributes:
self._plugin_names_order = []
self._missing_plugins = []
self.attr_plugins = attr_plugins or []
- if not attr_plugins:
- return
origin_data = self._origin_data
data = self._data
diff --git a/openpype/tools/publisher/widgets/validations_widget.py b/openpype/tools/publisher/widgets/validations_widget.py
index ba4df2eb8e..003d78fa56 100644
--- a/openpype/tools/publisher/widgets/validations_widget.py
+++ b/openpype/tools/publisher/widgets/validations_widget.py
@@ -226,13 +226,15 @@ class ActionButton(ClickableFrame):
action_label = action.label or action.__name__
action_icon = getattr(action, "icon", None)
label_widget = QtWidgets.QLabel(action_label, self)
+ icon_label = None
if action_icon:
icon_label = IconValuePixmapLabel(action_icon, self)
layout = QtWidgets.QHBoxLayout(self)
layout.setContentsMargins(5, 0, 5, 0)
layout.addWidget(label_widget, 1)
- layout.addWidget(icon_label, 0)
+ if icon_label is not None:
+ layout.addWidget(icon_label, 0)
self.setSizePolicy(
QtWidgets.QSizePolicy.Minimum,
@@ -272,6 +274,7 @@ class ValidateActionsWidget(QtWidgets.QFrame):
item = self._content_layout.takeAt(0)
widget = item.widget()
if widget:
+ widget.setVisible(False)
widget.deleteLater()
self._actions_mapping = {}