diff --git a/openpype/hosts/nuke/plugins/load/load_clip.py b/openpype/hosts/nuke/plugins/load/load_clip.py
index d177e6ba76..b2dc4a52d7 100644
--- a/openpype/hosts/nuke/plugins/load/load_clip.py
+++ b/openpype/hosts/nuke/plugins/load/load_clip.py
@@ -54,20 +54,28 @@ class LoadClip(plugin.NukeLoader):
script_start = int(nuke.root()["first_frame"].value())
# option gui
- defaults = {
- "start_at_workfile": True
+ options_defaults = {
+ "start_at_workfile": True,
+ "add_retime": True
}
- options = [
- qargparse.Boolean(
- "start_at_workfile",
- help="Load at workfile start frame",
- default=True
- )
- ]
-
node_name_template = "{class_name}_{ext}"
+ @classmethod
+ def get_options(cls, *args):
+ return [
+ qargparse.Boolean(
+ "start_at_workfile",
+ help="Load at workfile start frame",
+ default=cls.options_defaults["start_at_workfile"]
+ ),
+ qargparse.Boolean(
+ "add_retime",
+ help="Load with retime",
+ default=cls.options_defaults["add_retime"]
+ )
+ ]
+
@classmethod
def get_representations(cls):
return (
@@ -86,7 +94,10 @@ class LoadClip(plugin.NukeLoader):
file = self.fname.replace("\\", "/")
start_at_workfile = options.get(
- "start_at_workfile", self.defaults["start_at_workfile"])
+ "start_at_workfile", self.options_defaults["start_at_workfile"])
+
+ add_retime = options.get(
+ "add_retime", self.options_defaults["add_retime"])
version = context['version']
version_data = version.get("data", {})
@@ -151,7 +162,7 @@ class LoadClip(plugin.NukeLoader):
data_imprint = {}
for k in add_keys:
if k == 'version':
- data_imprint.update({k: context["version"]['name']})
+ data_imprint[k] = context["version"]['name']
elif k == 'colorspace':
colorspace = repre["data"].get(k)
colorspace = colorspace or version_data.get(k)
@@ -159,10 +170,13 @@ class LoadClip(plugin.NukeLoader):
if used_colorspace:
data_imprint["used_colorspace"] = used_colorspace
else:
- data_imprint.update(
- {k: context["version"]['data'].get(k, str(None))})
+ data_imprint[k] = context["version"]['data'].get(
+ k, str(None))
- data_imprint.update({"objectName": read_name})
+ data_imprint["objectName"] = read_name
+
+ if add_retime and version_data.get("retime", None):
+ data_imprint["addRetime"] = True
read_node["tile_color"].setValue(int("0x4ecd25ff", 16))
@@ -174,7 +188,7 @@ class LoadClip(plugin.NukeLoader):
loader=self.__class__.__name__,
data=data_imprint)
- if version_data.get("retime", None):
+ if add_retime and version_data.get("retime", None):
self._make_retimes(read_node, version_data)
self.set_as_member(read_node)
@@ -198,7 +212,12 @@ class LoadClip(plugin.NukeLoader):
read_node = nuke.toNode(container['objectName'])
file = get_representation_path(representation).replace("\\", "/")
- start_at_workfile = bool("start at" in read_node['frame_mode'].value())
+ start_at_workfile = "start at" in read_node['frame_mode'].value()
+
+ add_retime = [
+ key for key in read_node.knobs().keys()
+ if "addRetime" in key
+ ]
project_name = legacy_io.active_project()
version_doc = get_version_by_id(project_name, representation["parent"])
@@ -286,7 +305,7 @@ class LoadClip(plugin.NukeLoader):
"updated to version: {}".format(version_doc.get("name"))
)
- if version_data.get("retime", None):
+ if add_retime and version_data.get("retime", None):
self._make_retimes(read_node, version_data)
else:
self.clear_members(read_node)
diff --git a/openpype/hosts/traypublisher/plugins/publish/collect_simple_instances.py b/openpype/hosts/traypublisher/plugins/publish/collect_simple_instances.py
index bbd0221c88..f76306cf05 100644
--- a/openpype/hosts/traypublisher/plugins/publish/collect_simple_instances.py
+++ b/openpype/hosts/traypublisher/plugins/publish/collect_simple_instances.py
@@ -55,6 +55,8 @@ class CollectSettingsSimpleInstances(pyblish.api.InstancePlugin):
"files": filenames
})
+ instance.data["source"] = "\n".join(filepaths)
+
self.log.debug("Created Simple Settings instance {}".format(
instance.data
))
diff --git a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
index 952b21546d..77a7ebdfcf 100644
--- a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
+++ b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
@@ -116,6 +116,7 @@ class IntegrateFtrackNote(pyblish.api.InstancePlugin):
"app_name": app_name,
"app_label": app_label,
"published_paths": "
".join(sorted(published_paths)),
+ "source": instance.data.get("source", '')
}
comment = template.format(**format_data)
if not comment:
diff --git a/openpype/pipeline/create/context.py b/openpype/pipeline/create/context.py
index a7a8eba383..9b55c3b21e 100644
--- a/openpype/pipeline/create/context.py
+++ b/openpype/pipeline/create/context.py
@@ -736,6 +736,7 @@ class CreateContext:
self.manual_creators = {}
self.publish_discover_result = None
+ self.publish_plugins_mismatch_targets = []
self.publish_plugins = []
self.plugins_with_defs = []
self._attr_plugins_by_family = {}
@@ -858,6 +859,7 @@ class CreateContext:
discover_result = DiscoverResult()
plugins_with_defs = []
plugins_by_targets = []
+ plugins_mismatch_targets = []
if discover_publish_plugins:
discover_result = publish_plugins_discover()
publish_plugins = discover_result.plugins
@@ -867,11 +869,19 @@ class CreateContext:
plugins_by_targets = pyblish.logic.plugins_by_targets(
publish_plugins, list(targets)
)
+
# Collect plugins that can have attribute definitions
for plugin in publish_plugins:
if OpenPypePyblishPluginMixin in inspect.getmro(plugin):
plugins_with_defs.append(plugin)
+ plugins_mismatch_targets = [
+ plugin
+ for plugin in publish_plugins
+ if plugin not in plugins_by_targets
+ ]
+
+ self.publish_plugins_mismatch_targets = plugins_mismatch_targets
self.publish_discover_result = discover_result
self.publish_plugins = plugins_by_targets
self.plugins_with_defs = plugins_with_defs
diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json
index 6c45e2a9c1..3e29122074 100644
--- a/openpype/settings/defaults/project_settings/nuke.json
+++ b/openpype/settings/defaults/project_settings/nuke.json
@@ -287,7 +287,11 @@
"LoadClip": {
"enabled": true,
"_representations": [],
- "node_name_template": "{class_name}_{ext}"
+ "node_name_template": "{class_name}_{ext}",
+ "options_defaults": {
+ "start_at_workfile": true,
+ "add_retime": true
+ }
}
},
"workfile_builder": {
diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json b/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json
index f8f9d5093d..c0069dcdab 100644
--- a/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json
+++ b/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json
@@ -822,7 +822,7 @@
},
{
"type": "label",
- "label": "Template may contain formatting keys intent, comment, host_name, app_name, app_label and published_paths."
+ "label": "Template may contain formatting keys intent, comment, host_name, app_name, app_label, published_paths and source."
},
{
"type": "text",
diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json
index 5bd8337e4c..805424c632 100644
--- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json
+++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_nuke_load.json
@@ -11,10 +11,52 @@
{
"key": "LoadImage",
"label": "Image Loader"
+ }
+ ]
+ },
+ {
+ "type": "dict",
+ "collapsible": true,
+ "key": "LoadClip",
+ "label": "Clip Loader",
+ "checkbox_key": "enabled",
+ "children": [
+ {
+ "type": "boolean",
+ "key": "enabled",
+ "label": "Enabled"
},
{
- "key": "LoadClip",
- "label": "Clip Loader"
+ "type": "list",
+ "key": "_representations",
+ "label": "Representations",
+ "object_type": "text"
+ },
+ {
+ "type": "text",
+ "key": "node_name_template",
+ "label": "Node name template"
+ },
+ {
+ "type": "splitter"
+ },
+ {
+ "type": "dict",
+ "collapsible": false,
+ "key": "options_defaults",
+ "label": "Loader option defaults",
+ "children": [
+ {
+ "type": "boolean",
+ "key": "start_at_workfile",
+ "label": "Start at worfile beggining"
+ },
+ {
+ "type": "boolean",
+ "key": "add_retime",
+ "label": "Add retime"
+ }
+ ]
}
]
}
diff --git a/openpype/tools/publisher/control.py b/openpype/tools/publisher/control.py
index 915fb7f32e..f692bb4000 100644
--- a/openpype/tools/publisher/control.py
+++ b/openpype/tools/publisher/control.py
@@ -154,15 +154,20 @@ class PublishReport:
self._all_instances_by_id = {}
self._current_context = None
- def reset(self, context, publish_discover_result=None):
+ def reset(self, context, create_context):
"""Reset report and clear all data."""
- self._publish_discover_result = publish_discover_result
+
+ self._publish_discover_result = create_context.publish_discover_result
self._plugin_data = []
self._plugin_data_with_plugin = []
self._current_plugin_data = {}
self._all_instances_by_id = {}
self._current_context = context
+ for plugin in create_context.publish_plugins_mismatch_targets:
+ plugin_data = self._add_plugin_data_item(plugin)
+ plugin_data["skipped"] = True
+
def add_plugin_iter(self, plugin, context):
"""Add report about single iteration of plugin."""
for instance in context:
@@ -205,6 +210,7 @@ class PublishReport:
"name": plugin.__name__,
"label": label,
"order": plugin.order,
+ "targets": list(plugin.targets),
"instances_data": [],
"actions_data": [],
"skipped": False,
@@ -777,10 +783,7 @@ class PublisherController:
# - pop the key after first collector using it would be safest option?
self._publish_context.data["create_context"] = self.create_context
- self._publish_report.reset(
- self._publish_context,
- self.create_context.publish_discover_result
- )
+ self._publish_report.reset(self._publish_context, self.create_context)
self._publish_validation_errors = []
self._publish_current_plugin_validation_errors = None
self._publish_error = None
diff --git a/openpype/tools/publisher/publish_report_viewer/report_items.py b/openpype/tools/publisher/publish_report_viewer/report_items.py
index b47d14da25..8a01569723 100644
--- a/openpype/tools/publisher/publish_report_viewer/report_items.py
+++ b/openpype/tools/publisher/publish_report_viewer/report_items.py
@@ -83,10 +83,8 @@ class PublishReport:
logs = []
plugins_items_by_id = {}
- plugins_id_order = []
for plugin_data in data["plugins_data"]:
item = PluginItem(plugin_data)
- plugins_id_order.append(item.id)
plugins_items_by_id[item.id] = item
for instance_data_item in plugin_data["instances_data"]:
instance_id = instance_data_item["id"]
@@ -95,6 +93,14 @@ class PublishReport:
copy.deepcopy(log_item_data), item.id, instance_id
)
logs.append(log_item)
+ sorted_plugins = sorted(
+ plugins_items_by_id.values(),
+ key=lambda item: item.order
+ )
+ plugins_id_order = [
+ plugin_item.id
+ for plugin_item in sorted_plugins
+ ]
logs_by_instance_id = collections.defaultdict(list)
for log_item in logs: