From f34d25f49b5a4a932688890f15813d32c8efbd8d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 30 Mar 2021 10:25:06 +0200 Subject: [PATCH] implemented validator of task name existence on asset document --- .../publish/validate_task_existence.py | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 pype/hosts/standalonepublisher/plugins/publish/validate_task_existence.py diff --git a/pype/hosts/standalonepublisher/plugins/publish/validate_task_existence.py b/pype/hosts/standalonepublisher/plugins/publish/validate_task_existence.py new file mode 100644 index 0000000000..8bd4fb997a --- /dev/null +++ b/pype/hosts/standalonepublisher/plugins/publish/validate_task_existence.py @@ -0,0 +1,57 @@ +import collections +import pyblish.api +from avalon import io + + +class ValidateTaskExistence(pyblish.api.ContextPlugin): + """Validating tasks on instances are filled and existing.""" + + label = "Validate Task Existence" + order = pyblish.api.ValidatorOrder + + hosts = ["standalonepublisher"] + families = ["render_mov_batch"] + + def process(self, context): + asset_names = set() + for instance in context: + asset_names.add(instance.data["asset"]) + + asset_docs = io.find( + { + "type": "asset", + "name": {"$in": list(asset_names)} + }, + { + "name": 1, + "data.tasks": 1 + } + ) + tasks_by_asset_names = {} + for asset_doc in asset_docs: + asset_name = asset_doc["name"] + asset_tasks = asset_doc.get("data", {}).get("tasks") or {} + tasks_by_asset_names[asset_name] = list(asset_tasks.keys()) + + missing_tasks = [] + for instance in context: + asset_name = instance.data["asset"] + task_name = instance.data["task"] + task_names = tasks_by_asset_names.get(asset_name) or [] + if task_name and task_name in task_names: + continue + missing_tasks.append((asset_name, task_name)) + + # Everything is OK + if not missing_tasks: + return + + # Raise an exception + msg = "Couldn't find task name/s required for publishing.\n{}" + pair_msgs = [] + for missing_pair in missing_tasks: + pair_msgs.append( + "Asset: \"{}\" Task: \"{}\"".format(*missing_pair) + ) + + raise AssertionError(msg.format("\n".join(pair_msgs)))