From bdb201700954eb9cf63c673ec2ebfb60049f2e20 Mon Sep 17 00:00:00 2001 From: "Sveinbjorn J. Tryggvason" Date: Tue, 1 Jul 2025 10:51:14 +0000 Subject: [PATCH] allow settings to dictate item names in the inventory --- .../ayon_core/tools/sceneinventory/model.py | 55 +++++++++++++++++-- server/settings/tools.py | 40 +++++++++++++- 2 files changed, 88 insertions(+), 7 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 885553acaf..67ff700806 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 @@ -127,13 +130,57 @@ class InventoryModel(QtGui.QStandardItemModel): def outdated(self, item): return item.get("isOutdated", True) + def generate_group_formatting_data(self, repre_info): + hierarchy_parts = repre_info.folder_path.split("/") + hierarchy_parts.pop(0) + hierarchy_parts.pop(-1) + + folder = { + "name": repre_info.folder_name, + "id": repre_info.folder_id, + "folderType": repre_info.folder_type, + "path": repre_info.folder_type + } + extra_folder_keys = template_data.construct_extra_folder_template_keys( + self._controller.get_current_project_name(), + folder, + hierarchy_parts + ) + + formatting_data = { + "folder": { + "name": repre_info.folder_name, + **extra_folder_keys + }, + "product": repre_info.product_name, + "productType": repre_info.product_type, + "representation": repre_info.representation_name + } + return formatting_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()) + + profiles = (settings["core"]["tools"]["inventory"]["profiles"]) + + selected_profile = filter_profiles( + 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 = 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 +297,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 - ) + fmt_data = self.generate_group_formatting_data(repre_info) + group_name = group_name_template.format(**fmt_data) + item_icon = valid_item_icon version_items = ( diff --git a/server/settings/tools.py b/server/settings/tools.py index 815ef40f8e..72ae63c162 100644 --- a/server/settings/tools.py +++ b/server/settings/tools.py @@ -368,6 +368,28 @@ class PublishToolModel(BaseSettingsModel): ) +class InventoryTemplateNameProfile(BaseSettingsModel): + _layout = "expanded" + host_name: list[str] = SettingsField( + title="Host name", + default_factory=list + ) + task_name: list[str] = SettingsField( + title="Current task", + default_factory=list + ) + inventory_name_format: str = SettingsField( + title="Format", + 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 +411,10 @@ class GlobalToolsModel(BaseSettingsModel): default_factory=PublishToolModel, title="Publish" ) + inventory: InventoryToolModel = SettingsField( + default_factory=InventoryToolModel, + title="Inventory" + ) DEFAULT_TOOLS_VALUES = { @@ -679,7 +705,17 @@ DEFAULT_TOOLS_VALUES = { "task_names": [], "template_name": "simpleUnrealTextureHero" } - ], - "comment_minimum_required_chars": 0, + ] + }, + "comment_minimum_required_chars": 0, + "inventory": { + "profiles": [ + { + "host_name": [], + "task_name": [], + "inventory_name_format": "{folder[name]}_{product}: ({representation})", + }, + + ] } }