diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 885553acaf0..af5afc6d389 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -9,6 +9,9 @@ from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon from ayon_core.tools.utils.lib import format_version +from ayon_core.pipeline import template_data +from ayon_core.lib import filter_profiles +from ayon_core.settings import get_project_settings ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 @@ -127,13 +130,55 @@ def __init__(self, controller, parent=None): def outdated(self, item): return item.get("isOutdated", True) + def _get_repre_info_template_data(self, repre_info): + fake_folder_entity = { + "name": repre_info.folder_name, + "id": repre_info.folder_id, + "folderType": repre_info.folder_type, + "path": repre_info.folder_path + } + + folder_data = template_data.get_folder_template_data( + fake_folder_entity, + self._controller.get_current_project_name() + ) + + template_data = { + "product": { + "name": repre_info.product_name, + "type": repre_info.product_type, + }, + "representation": { + "name": repre_info.representation_name, + } + } + template_data .update(folder_data) + return template_data + def refresh(self, selected=None): """Refresh the model""" # for debugging or testing, injecting items from outside container_items = self._controller.get_container_items() self._clear_items() - + # fetch the label settings + + settings = get_project_settings( + self._controller.get_current_project_name()) + + selected_profile = filter_profiles( + settings["core"]["tools"]["inventory"]["profiles"], + { + "host_name": self._controller.get_host().name, + "task_name": self._controller.get_current_context()["task_name"] + }, + keys_order=["host_name", "task_name"]) + group_name_template = "{folder[name]}_{product[name]}: ({representation[name]})" + if selected_profile is not None: + group_name_template = selected_profile["inventory_name_format"] + + + items_by_repre_id = {} project_names = set() repre_ids_by_project = collections.defaultdict(set) version_items_by_project = collections.defaultdict(dict) @@ -250,11 +295,9 @@ def refresh(self, selected=None): status_name = None else: - group_name = "{}_{}: ({})".format( - repre_info.folder_path.rsplit("/")[-1], - repre_info.product_name, - repre_info.representation_name - ) + template_data = self._get_repre_info_template_data(repre_info) + group_name = group_name_template.format(**template_data) + item_icon = valid_item_icon version_items = ( diff --git a/client/ayon_core/tools/sceneinventory/models/containers.py b/client/ayon_core/tools/sceneinventory/models/containers.py index f841f87c8e2..c78a166abcc 100644 --- a/client/ayon_core/tools/sceneinventory/models/containers.py +++ b/client/ayon_core/tools/sceneinventory/models/containers.py @@ -41,6 +41,7 @@ def representations_parent_ids_qraphql_query(): folder_field = product_field.add_field("folder") folder_field.add_field("id") folder_field.add_field("path") + folder_field.add_field("folderType") return query @@ -123,6 +124,8 @@ def __init__( self, folder_id, folder_path, + folder_name, + folder_type, product_id, product_name, product_type, @@ -132,6 +135,8 @@ def __init__( ): self.folder_id = folder_id self.folder_path = folder_path + self.folder_name = folder_name + self.folder_type = folder_type self.product_id = product_id self.product_name = product_name self.product_type = product_type @@ -250,6 +255,8 @@ def get_representation_info_items(self, project_name, representation_ids): kwargs = { "folder_id": None, "folder_path": None, + "folder_name": None, + "folder_type": None, "product_id": None, "product_name": None, "product_type": None, @@ -264,6 +271,8 @@ def get_representation_info_items(self, project_name, representation_ids): if folder: kwargs["folder_id"] = folder["id"] kwargs["folder_path"] = folder["path"] + kwargs["folder_name"] = folder["path"].split("/")[-1] + kwargs["folder_type"] = folder["folderType"] if product: group = product["attrib"]["productGroup"] kwargs["product_id"] = product["id"] diff --git a/server/settings/tools.py b/server/settings/tools.py index 815ef40f8ed..432b98d84b3 100644 --- a/server/settings/tools.py +++ b/server/settings/tools.py @@ -368,6 +368,29 @@ class PublishToolModel(BaseSettingsModel): ) +class InventoryTemplateNameProfile(BaseSettingsModel): + _layout = "expanded" + host_names: list[str] = SettingsField( + title="Host names", + default_factory=list + ) + task_name: list[str] = SettingsField( + title="Task names", + default_factory=list + ) + template: str = SettingsField( + title="Template", + default_factory=str + ) + + +class InventoryToolModel(BaseSettingsModel): + profiles: list[InventoryTemplateNameProfile] = SettingsField( + default_factory=list, + title="Inventory label templates" + ) + + class GlobalToolsModel(BaseSettingsModel): ayon_menu: AYONMenuModel = SettingsField( default_factory=AYONMenuModel, @@ -389,6 +412,10 @@ class GlobalToolsModel(BaseSettingsModel): default_factory=PublishToolModel, title="Publish" ) + inventory: InventoryToolModel = SettingsField( + default_factory=InventoryToolModel, + title="Inventory" + ) DEFAULT_TOOLS_VALUES = { @@ -679,7 +706,10 @@ class GlobalToolsModel(BaseSettingsModel): "task_names": [], "template_name": "simpleUnrealTextureHero" } - ], - "comment_minimum_required_chars": 0, + ] + }, + "comment_minimum_required_chars": 0, + "inventory": { + "profiles": [] } }