diff --git a/pype/ftrack/actions/action_delivery.py b/pype/ftrack/actions/action_delivery.py
index afd20d12d1..29fdfe39ae 100644
--- a/pype/ftrack/actions/action_delivery.py
+++ b/pype/ftrack/actions/action_delivery.py
@@ -312,42 +312,32 @@ class Delivery(BaseAction):
anatomy_data = copy.deepcopy(repre["context"])
anatomy_data["root"] = location_path
- anatomy_filled = anatomy.format(anatomy_data)
- test_path = (
- anatomy_filled
- .get("delivery", {})
- .get(anatomy_name)
- )
+ anatomy_filled = anatomy.format_all(anatomy_data)
+ test_path = anatomy_filled["delivery"][anatomy_name]
- if not test_path:
+ if not test_path.solved:
msg = (
"Missing keys in Representation's context"
" for anatomy template \"{}\"."
).format(anatomy_name)
- all_anatomies = anatomy.format_all(anatomy_data)
- result = None
- for anatomies in all_anatomies.values():
- for key, temp in anatomies.get("delivery", {}).items():
- if key != anatomy_name:
- continue
+ if test_path.missing_keys:
+ keys = ", ".join(test_path.missing_keys)
+ sub_msg = (
+ "Representation: {}
- Missing keys: \"{}\"
"
+ ).format(str(repre["_id"]), keys)
- result = temp
- break
+ if test_path.invalid_types:
+ items = []
+ for key, value in test_path.invalid_types.items():
+ items.append("\"{}\" {}".format(key, str(value)))
- # TODO log error! - missing keys in anatomy
- if result:
- missing_keys = [
- key[1] for key in string.Formatter().parse(result)
- if key[1] is not None
- ]
- else:
- missing_keys = ["unknown"]
+ keys = ", ".join(items)
+ sub_msg = (
+ "Representation: {}
"
+ "- Invalid value DataType: \"{}\"
"
+ ).format(str(repre["_id"]), keys)
- keys = ", ".join(missing_keys)
- sub_msg = (
- "Representation: {}
- Missing keys: \"{}\"
"
- ).format(str(repre["_id"]), keys)
self.report_items[msg].append(sub_msg)
self.log.warning(
"{} Representation: \"{}\" Filled: <{}>".format(
diff --git a/pype/ftrack/events/event_user_assigment.py b/pype/ftrack/events/event_user_assigment.py
index 87994d34b2..efdfb7665d 100644
--- a/pype/ftrack/events/event_user_assigment.py
+++ b/pype/ftrack/events/event_user_assigment.py
@@ -207,7 +207,12 @@ class UserAssigmentEvent(BaseEvent):
# formatting work dir is easiest part as we can use whole path
work_dir = anatomy.format(data)['avalon']['work']
# we also need publish but not whole
- publish = anatomy.format_all(data)['partial']['avalon']['publish']
+ filled_all = anatomy.format_all(data)
+ if "partial" not in filled_all:
+ publish = filled_all['avalon']['publish']
+ else:
+ # Backwards compatibility
+ publish = filled_all["partial"]['avalon']['publish']
# now find path to {asset}
m = re.search("(^.+?{})".format(data['asset']),
publish)
diff --git a/pype/plugins/global/publish/extract_burnin.py b/pype/plugins/global/publish/extract_burnin.py
index 8f5a4aa000..a3df47518c 100644
--- a/pype/plugins/global/publish/extract_burnin.py
+++ b/pype/plugins/global/publish/extract_burnin.py
@@ -95,9 +95,14 @@ class ExtractBurnin(pype.api.Extractor):
# create copy of prep_data for anatomy formatting
_prep_data = copy.deepcopy(prep_data)
_prep_data["representation"] = repre["name"]
- _prep_data["anatomy"] = (
- anatomy.format_all(_prep_data).get("solved") or {}
- )
+ filled_anatomy = anatomy.format_all(_prep_data)
+ if hasattr(filled_anatomy, "get_solved"):
+ _filled_anatomy = filled_anatomy.get_solved()
+ else:
+ # Backwards compatibility
+ _filled_anatomy = filled_anatomy.get("solved")
+ _prep_data["anatomy"] = _filled_anatomy or {}
+
burnin_data = {
"input": full_movie_path.replace("\\", "/"),
"codec": repre.get("codec", []),