mirror of
https://github.com/ynput/ayon-core.git
synced 2025-12-24 21:04:40 +01:00
Merge pull request #289 from BigRoy/enhancement/maya_validate_node_ids_related_report
Maya: Validate Node Ids Related report folder path of the other ids that were found
This commit is contained in:
commit
fe99cad2fd
1 changed files with 67 additions and 11 deletions
|
|
@ -1,17 +1,27 @@
|
|||
import inspect
|
||||
import uuid
|
||||
from collections import defaultdict
|
||||
import pyblish.api
|
||||
|
||||
import ayon_core.hosts.maya.api.action
|
||||
from ayon_core.hosts.maya.api import lib
|
||||
from ayon_core.pipeline.publish import (
|
||||
OptionalPyblishPluginMixin, PublishValidationError, ValidatePipelineOrder)
|
||||
from ayon_api import get_folders
|
||||
|
||||
|
||||
def is_valid_uuid(value) -> bool:
|
||||
"""Return whether value is a valid UUID"""
|
||||
try:
|
||||
uuid.UUID(value)
|
||||
except ValueError:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
class ValidateNodeIDsRelated(pyblish.api.InstancePlugin,
|
||||
OptionalPyblishPluginMixin):
|
||||
"""Validate nodes have a related Colorbleed Id to the
|
||||
instance.data[folderPath]
|
||||
|
||||
"""
|
||||
"""Validate nodes have a related `cbId` to the instance.data[folderPath]"""
|
||||
|
||||
order = ValidatePipelineOrder
|
||||
label = 'Node Ids Related (ID)'
|
||||
|
|
@ -39,21 +49,24 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin,
|
|||
# Ensure all nodes have a cbId
|
||||
invalid = self.get_invalid(instance)
|
||||
if invalid:
|
||||
|
||||
invalid_list = "\n".join(f"- {node}" for node in sorted(invalid))
|
||||
|
||||
raise PublishValidationError((
|
||||
"Nodes IDs found that are not related to folder '{}' : {}"
|
||||
).format(
|
||||
instance.data["folderPath"], invalid
|
||||
))
|
||||
"Nodes IDs found that are not related to folder '{}':\n{}"
|
||||
).format(instance.data["folderPath"], invalid_list),
|
||||
description=self.get_description()
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def get_invalid(cls, instance):
|
||||
"""Return the member nodes that are invalid"""
|
||||
invalid = list()
|
||||
|
||||
folder_id = instance.data["folderEntity"]["id"]
|
||||
|
||||
# We do want to check the referenced nodes as we it might be
|
||||
# We do want to check the referenced nodes as it might be
|
||||
# part of the end product
|
||||
invalid = list()
|
||||
nodes_by_other_folder_ids = defaultdict(set)
|
||||
for node in instance:
|
||||
_id = lib.get_id(node)
|
||||
if not _id:
|
||||
|
|
@ -62,5 +75,48 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin,
|
|||
node_folder_id = _id.split(":", 1)[0]
|
||||
if node_folder_id != folder_id:
|
||||
invalid.append(node)
|
||||
nodes_by_other_folder_ids[node_folder_id].add(node)
|
||||
|
||||
# Log what other assets were found.
|
||||
if nodes_by_other_folder_ids:
|
||||
project_name = instance.context.data["projectName"]
|
||||
other_folder_ids = set(nodes_by_other_folder_ids.keys())
|
||||
|
||||
# Remove folder ids that are not valid UUID identifiers, these
|
||||
# may be legacy OpenPype ids
|
||||
other_folder_ids = {folder_id for folder_id in other_folder_ids
|
||||
if is_valid_uuid(folder_id)}
|
||||
if not other_folder_ids:
|
||||
return invalid
|
||||
|
||||
folder_entities = get_folders(project_name=project_name,
|
||||
folder_ids=other_folder_ids,
|
||||
fields=["path"])
|
||||
if folder_entities:
|
||||
# Log names of other assets detected
|
||||
# We disregard logging nodes/ids for asset ids where no asset
|
||||
# was found in the database because ValidateNodeIdsInDatabase
|
||||
# takes care of that.
|
||||
folder_paths = {entity["path"] for entity in folder_entities}
|
||||
cls.log.error(
|
||||
"Found nodes related to other folders:\n{}".format(
|
||||
"\n".join(f"- {path}" for path in sorted(folder_paths))
|
||||
)
|
||||
)
|
||||
|
||||
return invalid
|
||||
|
||||
@staticmethod
|
||||
def get_description():
|
||||
return inspect.cleandoc("""### Node IDs must match folder id
|
||||
|
||||
The node ids must match the folder entity id you are publishing to.
|
||||
|
||||
Usually these mismatch occurs if you are re-using nodes from another
|
||||
folder or project.
|
||||
|
||||
#### How to repair?
|
||||
|
||||
The repair action will regenerate new ids for
|
||||
the invalid nodes to match the instance's folder.
|
||||
""")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue