diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 27211165bf..ef5cd04d76 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -9,6 +9,9 @@ import qtawesome 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 @@ -128,13 +131,55 @@ class InventoryModel(QtGui.QStandardItemModel): 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) @@ -248,11 +293,9 @@ class InventoryModel(QtGui.QStandardItemModel): 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 0e19f381cd..8ed3cfcc93 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 @@ -126,6 +127,8 @@ class RepresentationInfo: self, folder_id, folder_path, + folder_name, + folder_type, product_id, product_name, product_type, @@ -136,6 +139,8 @@ class RepresentationInfo: ): 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 @@ -268,6 +273,8 @@ class ContainersModel: kwargs = { "folder_id": None, "folder_path": None, + "folder_name": None, + "folder_type": None, "product_id": None, "product_name": None, "product_type": None, @@ -283,6 +290,8 @@ class ContainersModel: 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: product_type = product["productType"] product_base_type = product.get("productBaseType") diff --git a/server/settings/tools.py b/server/settings/tools.py index da3b4ebff8..03eb47d581 100644 --- a/server/settings/tools.py +++ b/server/settings/tools.py @@ -379,6 +379,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, @@ -400,6 +423,10 @@ class GlobalToolsModel(BaseSettingsModel): default_factory=PublishToolModel, title="Publish" ) + inventory: InventoryToolModel = SettingsField( + default_factory=InventoryToolModel, + title="Inventory" + ) DEFAULT_TOOLS_VALUES = { @@ -690,7 +717,10 @@ DEFAULT_TOOLS_VALUES = { "task_names": [], "template_name": "simpleUnrealTextureHero" } - ], - "comment_minimum_required_chars": 0, + ] + }, + "comment_minimum_required_chars": 0, + "inventory": { + "profiles": [] } }