Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Global: add global validators to settings #2078

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import pyblish.api
import openpype.api

from maya import cmds


class SelectInvalidInstances(pyblish.api.Action):
"""Select invalid instances in Outliner."""
Expand All @@ -18,13 +20,12 @@ def process(self, context, plugin):
# Get the errored instances
failed = []
for result in context.data["results"]:
if result["error"] is None:
continue
if result["instance"] is None:
continue
if result["instance"] in failed:
continue
if result["plugin"] != plugin:
if (
result["error"] is None
or result["instance"] is None
or result["instance"] in failed
or result["plugin"] != plugin
):
continue

failed.append(result["instance"])
Expand All @@ -44,25 +45,10 @@ def process(self, context, plugin):
self.deselect()

def select(self, instances):
if "nuke" in pyblish.api.registered_hosts():
import avalon.nuke.lib
import nuke
avalon.nuke.lib.select_nodes(
[nuke.toNode(str(x)) for x in instances]
)

if "maya" in pyblish.api.registered_hosts():
from maya import cmds
cmds.select(instances, replace=True, noExpand=True)
cmds.select(instances, replace=True, noExpand=True)

def deselect(self):
if "nuke" in pyblish.api.registered_hosts():
import avalon.nuke.lib
avalon.nuke.lib.reset_selection()

if "maya" in pyblish.api.registered_hosts():
from maya import cmds
cmds.select(deselect=True)
cmds.select(deselect=True)


class RepairSelectInvalidInstances(pyblish.api.Action):
Expand Down Expand Up @@ -92,23 +78,14 @@ def process(self, context, plugin):

context_asset = context.data["assetEntity"]["name"]
for instance in instances:
if "nuke" in pyblish.api.registered_hosts():
import openpype.hosts.nuke.api as nuke_api
origin_node = instance[0]
nuke_api.lib.recreate_instance(
origin_node, avalon_data={"asset": context_asset}
)
else:
self.set_attribute(instance, context_asset)
self.set_attribute(instance, context_asset)

def set_attribute(self, instance, context_asset):
if "maya" in pyblish.api.registered_hosts():
from maya import cmds
cmds.setAttr(
instance.data.get("name") + ".asset",
context_asset,
type="string"
)
cmds.setAttr(
instance.data.get("name") + ".asset",
context_asset,
type="string"
)


class ValidateInstanceInContext(pyblish.api.InstancePlugin):
Expand All @@ -124,7 +101,7 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin):
order = openpype.api.ValidateContentsOrder
label = "Instance in same Context"
optional = True
hosts = ["maya", "nuke"]
hosts = ["maya"]
actions = [SelectInvalidInstances, RepairSelectInvalidInstances]

def process(self, instance):
Expand Down
110 changes: 110 additions & 0 deletions openpype/hosts/nuke/plugins/publish/validate_instance_in_context.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# -*- coding: utf-8 -*-
"""Validate if instance asset is the same as context asset."""
from __future__ import absolute_import

import nuke

import pyblish.api
import openpype.api
import avalon.nuke.lib
import openpype.hosts.nuke.api as nuke_api


class SelectInvalidInstances(pyblish.api.Action):
"""Select invalid instances in Outliner."""

label = "Select Instances"
icon = "briefcase"
on = "failed"

def process(self, context, plugin):
"""Process invalid validators and select invalid instances."""
# Get the errored instances
failed = []
for result in context.data["results"]:
if (
result["error"] is None
or result["instance"] is None
or result["instance"] in failed
or result["plugin"] != plugin
):
continue

failed.append(result["instance"])

# Apply pyblish.logic to get the instances for the plug-in
instances = pyblish.api.instances_by_plugin(failed, plugin)

if instances:
self.log.info(
"Selecting invalid nodes: %s" % ", ".join(
[str(x) for x in instances]
)
)
self.select(instances)
else:
self.log.info("No invalid nodes found.")
self.deselect()

def select(self, instances):
avalon.nuke.lib.select_nodes(
[nuke.toNode(str(x)) for x in instances]
)

def deselect(self):
avalon.nuke.lib.reset_selection()


class RepairSelectInvalidInstances(pyblish.api.Action):
"""Repair the instance asset."""

label = "Repair"
icon = "wrench"
on = "failed"

def process(self, context, plugin):
# Get the errored instances
failed = []
for result in context.data["results"]:
if (
result["error"] is None
or result["instance"] is None
or result["instance"] in failed
or result["plugin"] != plugin
):
continue

failed.append(result["instance"])

# Apply pyblish.logic to get the instances for the plug-in
instances = pyblish.api.instances_by_plugin(failed, plugin)

context_asset = context.data["assetEntity"]["name"]
for instance in instances:
origin_node = instance[0]
nuke_api.lib.recreate_instance(
origin_node, avalon_data={"asset": context_asset}
)


class ValidateInstanceInContext(pyblish.api.InstancePlugin):
"""Validator to check if instance asset match context asset.

When working in per-shot style you always publish data in context of
current asset (shot). This validator checks if this is so. It is optional
so it can be disabled when needed.

Action on this validator will select invalid instances in Outliner.
"""

order = openpype.api.ValidateContentsOrder
label = "Instance in same Context"
hosts = ["nuke"]
actions = [SelectInvalidInstances, RepairSelectInvalidInstances]
optional = True

def process(self, instance):
asset = instance.data.get("asset")
context_asset = instance.context.data["assetEntity"]["name"]
msg = "{} has asset {}".format(instance.name, asset)
assert asset == context_asset, msg
7 changes: 7 additions & 0 deletions openpype/plugins/publish/collect_avalon_entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ def process(self, context):
io.install()
project_name = api.Session["AVALON_PROJECT"]
asset_name = api.Session["AVALON_ASSET"]
task_name = api.Session["AVALON_TASK"]

project_entity = io.find_one({
"type": "project",
Expand All @@ -48,6 +49,12 @@ def process(self, context):

data = asset_entity['data']

# Task type
asset_tasks = data.get("tasks") or {}
task_info = asset_tasks.get(task_name) or {}
task_type = task_info.get("type")
context.data["taskType"] = task_type

frame_start = data.get("frameStart")
if frame_start is None:
frame_start = 1
Expand Down
3 changes: 1 addition & 2 deletions openpype/plugins/publish/start_timer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import pyblish.api

from openpype.api import get_system_settings
from openpype.lib import change_timer_to_current_context


Expand All @@ -10,6 +9,6 @@ class StartTimer(pyblish.api.ContextPlugin):
hosts = ["*"]

def process(self, context):
modules_settings = get_system_settings()["modules"]
modules_settings = context.data["system_settings"]["modules"]
if modules_settings["timers_manager"]["disregard_publishing"]:
change_timer_to_current_context()
4 changes: 1 addition & 3 deletions openpype/plugins/publish/stop_timer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@

import pyblish.api

from openpype.api import get_system_settings


class StopTimer(pyblish.api.ContextPlugin):
label = "Stop Timer"
order = pyblish.api.ExtractorOrder - 0.49
hosts = ["*"]

def process(self, context):
modules_settings = get_system_settings()["modules"]
modules_settings = context.data["system_settings"]["modules"]
if modules_settings["timers_manager"]["disregard_publishing"]:
webserver_url = os.environ.get("OPENPYPE_WEBSERVER_URL")
rest_api_url = "{}/timers_manager/stop_timer".format(webserver_url)
Expand Down
6 changes: 3 additions & 3 deletions openpype/plugins/publish/validate_containers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import pyblish.api

import openpype.lib
from avalon.tools import cbsceneinventory


class ShowInventory(pyblish.api.Action):
Expand All @@ -11,7 +9,9 @@ class ShowInventory(pyblish.api.Action):
on = "failed"

def process(self, context, plugin):
cbsceneinventory.show()
from avalon.tools import sceneinventory

sceneinventory.show()


class ValidateContainers(pyblish.api.ContextPlugin):
Expand Down
53 changes: 42 additions & 11 deletions openpype/plugins/publish/validate_intent.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import pyblish.api
import os
import pyblish.api

from openpype.lib import filter_profiles


class ValidateIntent(pyblish.api.ContextPlugin):
Expand All @@ -12,20 +14,49 @@ class ValidateIntent(pyblish.api.ContextPlugin):
order = pyblish.api.ValidatorOrder

label = "Validate Intent"
# TODO: this should be off by default and only activated viac config
tasks = ["animation"]
hosts = ["harmony"]
if os.environ.get("AVALON_TASK") not in tasks:
active = False
enabled = False

# Can be modified by settings
profiles = [{
"hosts": [],
"task_types": [],
"tasks": [],
"validate": False
}]

def process(self, context):
# Skip if there are no profiles
validate = True
if self.profiles:
# Collect data from context
task_name = context.data.get("task")
task_type = context.data.get("taskType")
host_name = context.data.get("hostName")

filter_data = {
"hosts": host_name,
"task_types": task_type,
"tasks": task_name
}
matching_profile = filter_profiles(
self.profiles, filter_data, logger=self.log
)
if matching_profile:
validate = matching_profile["validate"]

if not validate:
self.log.debug((
"Validation of intent was skipped."
" Matching profile for current context disabled validation."
))
return

msg = (
"Please make sure that you select the intent of this publish."
)

intent = context.data.get("intent")
self.log.debug(intent)
assert intent, msg

intent = context.data.get("intent") or {}
self.log.debug(str(intent))
intent_value = intent.get("value")
assert intent is not "", msg
if not intent_value:
raise AssertionError(msg)
3 changes: 3 additions & 0 deletions openpype/plugins/publish/validate_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ class ValidateVersion(pyblish.api.InstancePlugin):
label = "Validate Version"
hosts = ["nuke", "maya", "blender", "standalonepublisher"]

optional = False
active = True

def process(self, instance):
version = instance.data.get("version")
latest_version = instance.data.get("latestVersion")
Expand Down
7 changes: 6 additions & 1 deletion openpype/settings/defaults/project_settings/global.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
},
"ValidateVersion": {
"enabled": true,
"optional": false
"optional": false,
"active": true
},
"ValidateIntent": {
"enabled": false,
"profiles": []
},
"IntegrateHeroVersion": {
"enabled": true,
Expand Down
5 changes: 5 additions & 0 deletions openpype/settings/defaults/project_settings/maya.json
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,11 @@
"CollectMayaRender": {
"sync_workfile_version": false
},
"ValidateInstanceInContext": {
"enabled": true,
"optional": true,
"active": true
},
"ValidateContainers": {
"enabled": true,
"optional": true,
Expand Down
5 changes: 5 additions & 0 deletions openpype/settings/defaults/project_settings/nuke.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@
"render"
]
},
"ValidateInstanceInContext": {
"enabled": true,
"optional": true,
"active": true
},
"ValidateContainers": {
"enabled": true,
"optional": true,
Expand Down
Loading