diff --git a/client/ayon_core/hosts/flame/api/pipeline.py b/client/ayon_core/hosts/flame/api/pipeline.py index 88375f829f..532f89b5e9 100644 --- a/client/ayon_core/hosts/flame/api/pipeline.py +++ b/client/ayon_core/hosts/flame/api/pipeline.py @@ -147,8 +147,8 @@ def imprint(segment, data=None): Examples: data = { 'asset': 'sq020sh0280', - 'family': 'render', - 'subset': 'subsetMain' + 'productType': 'render', + 'productName': 'productMain' } """ data = data or {} diff --git a/client/ayon_core/hosts/flame/api/plugin.py b/client/ayon_core/hosts/flame/api/plugin.py index 720e6792b0..862dd3ce61 100644 --- a/client/ayon_core/hosts/flame/api/plugin.py +++ b/client/ayon_core/hosts/flame/api/plugin.py @@ -353,9 +353,9 @@ class PublishableClip: rename_default = False hierarchy_default = "{_folder_}/{_sequence_}/{_track_}" clip_name_default = "shot_{_trackIndex_:0>3}_{_clipIndex_:0>4}" - subset_name_default = "[ track name ]" review_track_default = "[ none ]" - subset_family_default = "plate" + base_product_name_default = "[ track name ]" + base_product_type_default = "plate" count_from_default = 10 count_steps_default = 10 vertical_sync_default = False @@ -368,7 +368,7 @@ class PublishableClip: def __init__(self, segment, **kwargs): self.rename_index = kwargs["rename_index"] - self.family = kwargs["family"] + self.product_type = kwargs["family"] self.log = kwargs["log"] # get main parent objects @@ -486,10 +486,10 @@ class PublishableClip: "countFrom", {}).get("value") or self.count_from_default self.count_steps = self.ui_inputs.get( "countSteps", {}).get("value") or self.count_steps_default - self.subset_name = self.ui_inputs.get( - "subsetName", {}).get("value") or self.subset_name_default - self.subset_family = self.ui_inputs.get( - "subsetFamily", {}).get("value") or self.subset_family_default + self.base_product_name = self.ui_inputs.get( + "productName", {}).get("value") or self.base_product_name_default + self.base_product_type = self.ui_inputs.get( + "productType", {}).get("value") or self.base_product_type_default self.vertical_sync = self.ui_inputs.get( "vSyncOn", {}).get("value") or self.vertical_sync_default self.driving_layer = self.ui_inputs.get( @@ -509,12 +509,14 @@ class PublishableClip: or self.retimed_framerange_default ) - # build subset name from layer name - if self.subset_name == "[ track name ]": - self.subset_name = self.track_name + # build product name from layer name + if self.base_product_name == "[ track name ]": + self.base_product_name = self.track_name - # create subset for publishing - self.subset = self.subset_family + self.subset_name.capitalize() + # create product for publishing + self.product_name = ( + self.base_product_type + self.base_product_name.capitalize() + ) def _replace_hash_to_expression(self, name, text): """ Replace hash with number in correct padding. """ @@ -608,14 +610,14 @@ class PublishableClip: _hero_data = deepcopy(hero_data) _hero_data.update({"heroTrack": False}) if _in <= self.clip_in and _out >= self.clip_out: - data_subset = hero_data["subset"] + data_product_name = hero_data["productName"] # add track index in case duplicity of names in hero data - if self.subset in data_subset: - _hero_data["subset"] = self.subset + str( + if self.product_name in data_product_name: + _hero_data["productName"] = self.product_name + str( self.track_index) - # in case track name and subset name is the same then add - if self.subset_name == self.track_name: - _hero_data["subset"] = self.subset + # in case track name and product name is the same then add + if self.base_product_name == self.track_name: + _hero_data["productName"] = self.product_name # assign data to return hierarchy data to tag tag_hierarchy_data = _hero_data break @@ -637,9 +639,9 @@ class PublishableClip: "hierarchy": hierarchy_filled, "parents": self.parents, "hierarchyData": hierarchy_formatting_data, - "subset": self.subset, - "family": self.subset_family, - "families": [self.family] + "productName": self.product_name, + "productType": self.base_product_type, + "families": [self.base_product_type, self.product_type] } def _convert_to_entity(self, type, template): diff --git a/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py b/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py index ee99040ca3..c73ee7510c 100644 --- a/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py +++ b/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py @@ -6,7 +6,7 @@ class CreateShotClip(opfapi.Creator): """Publishable clip""" label = "Create Publishable Clip" - family = "clip" + product_type = "clip" icon = "film" defaults = ["Main"] @@ -32,7 +32,7 @@ class CreateShotClip(opfapi.Creator): # open widget for plugins inputs results_back = self.create_widget( - "Pype publish attributes creator", + "AYON publish attributes creator", "Define sequential rename and fill hierarchy data.", gui_inputs ) @@ -62,7 +62,7 @@ class CreateShotClip(opfapi.Creator): "log": self.log, "ui_inputs": results_back, "avalon": self.data, - "family": self.data["family"] + "product_type": self.data["productType"] } for i, segment in enumerate(sorted_selected_segments): @@ -203,19 +203,19 @@ class CreateShotClip(opfapi.Creator): "target": "ui", "order": 3, "value": { - "subsetName": { + "productName": { "value": ["[ track name ]", "main", "bg", "fg", "bg", "animatic"], "type": "QComboBox", "label": "Subset Name", "target": "ui", - "toolTip": "chose subset name pattern, if [ track name ] is selected, name of track layer will be used", # noqa + "toolTip": "chose product name pattern, if [ track name ] is selected, name of track layer will be used", # noqa "order": 0}, - "subsetFamily": { + "productType": { "value": ["plate", "take"], "type": "QComboBox", "label": "Subset Family", - "target": "ui", "toolTip": "What use of this subset is for", # noqa + "target": "ui", "toolTip": "What use of this product is for", # noqa "order": 1}, "reviewTrack": { "value": ["< none >"] + gui_tracks, @@ -229,7 +229,7 @@ class CreateShotClip(opfapi.Creator): "type": "QCheckBox", "label": "Include audio", "target": "tag", - "toolTip": "Process subsets with corresponding audio", # noqa + "toolTip": "Process products with corresponding audio", # noqa "order": 3}, "sourceResolution": { "value": False, diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip.py b/client/ayon_core/hosts/flame/plugins/load/load_clip.py index 47d0331255..84f63b3177 100644 --- a/client/ayon_core/hosts/flame/plugins/load/load_clip.py +++ b/client/ayon_core/hosts/flame/plugins/load/load_clip.py @@ -11,7 +11,7 @@ from ayon_core.lib.transcoding import ( class LoadClip(opfapi.ClipLoader): - """Load a subset to timeline as clip + """Load a product to timeline as clip Place clip to timeline on its asset origin timings collected during conforming to project @@ -31,14 +31,14 @@ class LoadClip(opfapi.ClipLoader): # settings reel_group_name = "OpenPype_Reels" reel_name = "Loaded" - clip_name_template = "{asset}_{subset}<_{output}>" + clip_name_template = "{folder[name]}_{product[name]}<_{output}>" """ Anatomy keys from version context data and dynamically added: - {layerName} - original layer name token - {layerUID} - original layer UID token - {originalBasename} - original clip name taken from file """ - layer_rename_template = "{asset}_{subset}<_{output}>" + layer_rename_template = "{folder[name]}_{product[name]}<_{output}>" layer_rename_patterns = [] def load(self, context, name, namespace, options): diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py b/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py index cdf96bd459..9f81103cb4 100644 --- a/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py +++ b/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py @@ -10,7 +10,7 @@ from ayon_core.lib.transcoding import ( ) class LoadClipBatch(opfapi.ClipLoader): - """Load a subset to timeline as clip + """Load a product to timeline as clip Place clip to timeline on its asset origin timings collected during conforming to project @@ -29,14 +29,14 @@ class LoadClipBatch(opfapi.ClipLoader): # settings reel_name = "OP_LoadedReel" - clip_name_template = "{batch}_{asset}_{subset}<_{output}>" + clip_name_template = "{batch}_{folder[name]}_{product[name]}<_{output}>" """ Anatomy keys from version context data and dynamically added: - {layerName} - original layer name token - {layerUID} - original layer UID token - {originalBasename} - original clip name taken from file """ - layer_rename_template = "{asset}_{subset}<_{output}>" + layer_rename_template = "{folder[name]}_{product[name]}<_{output}>" layer_rename_patterns = [] def load(self, context, name, namespace, options): @@ -50,17 +50,8 @@ class LoadClipBatch(opfapi.ClipLoader): version_name = version.get("name", None) colorspace = self.get_colorspace(context) - # TODO remove '{folder[name]}' and '{product[name]}' replacement - clip_name_template = ( - self.clip_name_template - .replace("{folder[name]}", "{asset}") - .replace("{product[name]}", "{subset}") - ) - layer_rename_template = ( - self.layer_rename_template - .replace("{folder[name]}", "{asset}") - .replace("{product[name]}", "{subset}") - ) + clip_name_template = self.clip_name_template + layer_rename_template = self.layer_rename_template # in case output is not in context replace key to representation if not context["representation"]["context"].get("output"): clip_name_template = clip_name_template.replace( @@ -68,8 +59,22 @@ class LoadClipBatch(opfapi.ClipLoader): layer_rename_template = layer_rename_template.replace( "output", "representation") + asset_doc = context["asset"] + subset_doc = context["subset"] formatting_data = deepcopy(context["representation"]["context"]) formatting_data["batch"] = self.batch.name.get_value() + formatting_data.update({ + "asset": asset_doc["name"], + "folder": { + "name": asset_doc["name"], + }, + "subset": subset_doc["name"], + "family": subset_doc["data"]["family"], + "product": { + "name": subset_doc["name"], + "type": subset_doc["data"]["family"], + } + }) clip_name = StringTemplate(clip_name_template).format( formatting_data) diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py b/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py index 0fb41eab78..7442e7df48 100644 --- a/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py +++ b/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py @@ -59,6 +59,6 @@ class CollectTestSelection(pyblish.api.ContextPlugin): opfapi.imprint(segment, { 'asset': segment.name.get_value(), - 'family': 'render', - 'subset': 'subsetMain' + 'productType': 'render', + 'productName': 'productMain' }) diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py b/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py index 3819537010..60fe221441 100644 --- a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py +++ b/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py @@ -110,24 +110,25 @@ class CollectTimelineInstances(pyblish.api.ContextPlugin): # add ocio_data to instance data inst_data.update(otio_data) - asset = marker_data["asset"] - subset = marker_data["subset"] + folder_path = marker_data["folderPath"] + folder_name = folder_path.rsplit("/")[-1] + product_name = marker_data["productName"] - # insert family into families - family = marker_data["family"] + # insert product type into families + product_type = marker_data["productType"] families = [str(f) for f in marker_data["families"]] - families.insert(0, str(family)) + families.insert(0, str(product_type)) # form label - label = asset - if asset != clip_name: + label = folder_name + if folder_name != clip_name: label += " ({})".format(clip_name) - label += " {} [{}]".format(subset, ", ".join(families)) + label += " {} [{}]".format(product_name, ", ".join(families)) inst_data.update({ - "name": "{}_{}".format(asset, subset), + "name": "{}_{}".format(folder_name, product_name), "label": label, - "asset": asset, + "folderPath": folder_path, "item": segment, "families": families, "publish": marker_data["publish"], @@ -335,26 +336,27 @@ class CollectTimelineInstances(pyblish.api.ContextPlugin): if not hierarchy_data: return - asset = data["asset"] - subset = "shotMain" + folder_path = data["folderPath"] + folder_name = folder_path.rsplit("/")[-1] + product_name = "shotMain" - # insert family into families - family = "shot" + # insert product type into families + product_type = "shot" # form label - label = asset - if asset != clip_name: + label = folder_name + if folder_name != clip_name: label += " ({}) ".format(clip_name) - label += " {}".format(subset) - label += " [{}]".format(family) + label += " {}".format(product_name) + label += " [{}]".format(product_type) data.update({ - "name": "{}_{}".format(asset, subset), + "name": "{}_{}".format(folder_name, product_name), "label": label, - "subset": subset, - "asset": asset, - "family": family, - "families": [] + "productName": product_name, + "folderPath": folder_path, + "productType": product_type, + "families": [product_type] }) instance = context.create_instance(**data) diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py b/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py index 2fcfb55e7c..c095c1d333 100644 --- a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py +++ b/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.client import get_asset_name_identifier import ayon_core.hosts.flame.api as opfapi from ayon_core.hosts.flame.otio import flame_export -from ayon_core.pipeline.create import get_subset_name +from ayon_core.pipeline.create import get_product_name class CollecTimelineOTIO(pyblish.api.ContextPlugin): @@ -14,7 +14,7 @@ class CollecTimelineOTIO(pyblish.api.ContextPlugin): def process(self, context): # plugin defined - family = "workfile" + product_type = "workfile" variant = "otioTimeline" # main @@ -23,14 +23,14 @@ class CollecTimelineOTIO(pyblish.api.ContextPlugin): project = opfapi.get_current_project() sequence = opfapi.get_current_sequence(opfapi.CTX.selection) - # create subset name - subset_name = get_subset_name( - family, - variant, - task_name, - asset_doc, + # create product name + product_name = get_product_name( context.data["projectName"], + asset_doc, + task_name, context.data["hostName"], + product_type, + variant, project_settings=context.data["project_settings"] ) @@ -41,11 +41,11 @@ class CollecTimelineOTIO(pyblish.api.ContextPlugin): otio_timeline = flame_export.create_otio_timeline(sequence) instance_data = { - "name": subset_name, + "name": product_name, "folderPath": folder_path, - "subset": subset_name, - "family": "workfile", - "families": [] + "productName": product_name, + "productType": product_type, + "families": [product_type] } # create instance with workfile diff --git a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py b/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py index e36d2a22d5..a66ee9f2c0 100644 --- a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py +++ b/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py @@ -44,8 +44,8 @@ class IntegrateBatchGroup(pyblish.api.InstancePlugin): )) # load plate to batch group - self.log.info("Loading subset `{}` into batch `{}`".format( - instance.data["subset"], bgroup.name.get_value() + self.log.info("Loading product `{}` into batch `{}`".format( + instance.data["productName"], bgroup.name.get_value() )) self._load_clip_to_context(instance, bgroup)