diff --git a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
index acd295854d..c165e99918 100644
--- a/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
+++ b/openpype/modules/ftrack/plugins/publish/integrate_ftrack_note.py
@@ -15,10 +15,112 @@ class IntegrateFtrackNote(pyblish.api.InstancePlugin):
# Can be set in presets:
# - Allows only `intent` and `comment` keys
+ note_template = None
+ # Backwards compatibility
note_with_intent_template = "{intent}: {comment}"
# - note label must exist in Ftrack
note_labels = []
+ def process(self, instance):
+ # Check if there are any integrated AssetVersion entities
+ asset_versions_key = "ftrackIntegratedAssetVersionsData"
+ asset_versions_data_by_id = instance.data.get(asset_versions_key)
+ if not asset_versions_data_by_id:
+ self.log.info("There are any integrated AssetVersions")
+ return
+
+ comment = (instance.context.data.get("comment") or "").strip()
+ if not comment:
+ self.log.info("Comment is not set.")
+ else:
+ self.log.debug("Comment is set to `{}`".format(comment))
+
+ session = instance.context.data["ftrackSession"]
+
+ intent = instance.context.data.get("intent")
+ if intent and isinstance(intent, dict):
+ intent_val = intent.get("value")
+ intent_label = intent.get("label")
+ else:
+ intent_val = intent_label = intent
+
+ final_intent_label = None
+ if intent_val:
+ final_intent_label = self.get_intent_label(session, intent_val)
+ if final_intent_label is None:
+ final_intent_label = intent_label
+
+ # if intent label is set then format comment
+ # - it is possible that intent_label is equal to "" (empty string)
+ if final_intent_label:
+ self.log.debug(
+ "Intent label is set to `{}`.".format(final_intent_label)
+ )
+
+ elif intent_val:
+ self.log.debug((
+ "Intent is set to `{}` and was not added"
+ " to comment because label is set to `{}`."
+ ).format(intent_val, final_intent_label))
+
+ else:
+ self.log.debug("Intent is not set.")
+
+ user = session.query(
+ "User where username is \"{}\"".format(session.api_user)
+ ).first()
+ if not user:
+ self.log.warning(
+ "Was not able to query current User {}".format(
+ session.api_user
+ )
+ )
+
+ labels = []
+ if self.note_labels:
+ all_labels = session.query("select id, name from NoteLabel").all()
+ labels_by_low_name = {lab["name"].lower(): lab for lab in all_labels}
+ for _label in self.note_labels:
+ label = labels_by_low_name.get(_label.lower())
+ if not label:
+ self.log.warning(
+ "Note Label `{}` was not found.".format(_label)
+ )
+ continue
+
+ labels.append(label)
+
+ for asset_version_data in asset_versions_data_by_id.values():
+ asset_version = asset_version_data["asset_version"]
+ component_items = asset_version_data["component_items"]
+
+ published_paths = set()
+ for component_item in component_items:
+ published_paths.add(component_item["component_path"])
+
+ # Backwards compatibility for older settings using
+ # attribute 'note_with_intent_template'
+ template = self.note_template
+ if template is None:
+ template = self.note_with_intent_template
+ comment = template.format(**{
+ "intent": final_intent_label,
+ "comment": comment,
+ "published_paths": "\n".join(sorted(published_paths))
+ })
+ asset_version.create_note(comment, author=user, labels=labels)
+
+ try:
+ session.commit()
+ self.log.debug("Note added to AssetVersion \"{}\"".format(
+ str(asset_version)
+ ))
+ except Exception:
+ tp, value, tb = sys.exc_info()
+ session.rollback()
+ session._configure_locations()
+ six.reraise(tp, value, tb)
+
def get_intent_label(self, session, intent_value):
if not intent_value:
return
@@ -45,12 +147,7 @@ class IntegrateFtrackNote(pyblish.api.InstancePlugin):
if not items:
return
- if sys.version_info[0] < 3:
- string_type = basestring
- else:
- string_type = str
-
- if isinstance(items, string_type):
+ if isinstance(items, six.string_types):
items = json.loads(items)
intent_label = None
@@ -60,90 +157,3 @@ class IntegrateFtrackNote(pyblish.api.InstancePlugin):
break
return intent_label
-
- def process(self, instance):
- comment = (instance.context.data.get("comment") or "").strip()
- if not comment:
- self.log.info("Comment is not set.")
- return
-
- self.log.debug("Comment is set to `{}`".format(comment))
-
- session = instance.context.data["ftrackSession"]
-
- intent = instance.context.data.get("intent")
- if intent and isinstance(intent, dict):
- intent_val = intent.get("value")
- intent_label = intent.get("label")
- else:
- intent_val = intent_label = intent
-
- final_label = None
- if intent_val:
- final_label = self.get_intent_label(session, intent_val)
- if final_label is None:
- final_label = intent_label
-
- # if intent label is set then format comment
- # - it is possible that intent_label is equal to "" (empty string)
- if final_label:
- msg = "Intent label is set to `{}`.".format(final_label)
- comment = self.note_with_intent_template.format(**{
- "intent": final_label,
- "comment": comment
- })
-
- elif intent_val:
- msg = (
- "Intent is set to `{}` and was not added"
- " to comment because label is set to `{}`."
- ).format(intent_val, final_label)
-
- else:
- msg = "Intent is not set."
-
- self.log.debug(msg)
-
- asset_versions_key = "ftrackIntegratedAssetVersions"
- asset_versions = instance.data.get(asset_versions_key)
- if not asset_versions:
- self.log.info("There are any integrated AssetVersions")
- return
-
- user = session.query(
- "User where username is \"{}\"".format(session.api_user)
- ).first()
- if not user:
- self.log.warning(
- "Was not able to query current User {}".format(
- session.api_user
- )
- )
-
- labels = []
- if self.note_labels:
- all_labels = session.query("NoteLabel").all()
- labels_by_low_name = {lab["name"].lower(): lab for lab in all_labels}
- for _label in self.note_labels:
- label = labels_by_low_name.get(_label.lower())
- if not label:
- self.log.warning(
- "Note Label `{}` was not found.".format(_label)
- )
- continue
-
- labels.append(label)
-
- for asset_version in asset_versions:
- asset_version.create_note(comment, author=user, labels=labels)
-
- try:
- session.commit()
- self.log.debug("Note added to AssetVersion \"{}\"".format(
- str(asset_version)
- ))
- except Exception:
- tp, value, tb = sys.exc_info()
- session.rollback()
- session._configure_locations()
- six.reraise(tp, value, tb)
diff --git a/openpype/settings/defaults/project_settings/ftrack.json b/openpype/settings/defaults/project_settings/ftrack.json
index ca1cfe1e12..9b350ec88d 100644
--- a/openpype/settings/defaults/project_settings/ftrack.json
+++ b/openpype/settings/defaults/project_settings/ftrack.json
@@ -354,7 +354,7 @@
},
"IntegrateFtrackNote": {
"enabled": true,
- "note_with_intent_template": "{intent}: {comment}",
+ "note_template": "{intent}: {comment}",
"note_labels": []
},
"ValidateFtrackAttributes": {
diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json
index ed28d357f2..4c94eee254 100644
--- a/openpype/settings/defaults/project_settings/global.json
+++ b/openpype/settings/defaults/project_settings/global.json
@@ -190,7 +190,7 @@
"tasks": [],
"template_name": "simpleUnrealTexture"
},
- {
+ {
"families": [
"staticMesh",
"skeletalMesh"
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 fb384882c6..2b62d67c98 100644
--- a/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json
+++ b/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json
@@ -738,10 +738,14 @@
"key": "enabled",
"label": "Enabled"
},
+ {
+ "type": "label",
+ "label": "Template may contain formatting keys {intent}, {comment} and {published_paths}."
+ },
{
"type": "text",
- "key": "note_with_intent_template",
- "label": "Note with intent template"
+ "key": "note_template",
+ "label": "Note template"
},
{
"type": "list",