diff --git a/client/ayon_core/pipeline/context_tools.py b/client/ayon_core/pipeline/context_tools.py index c32d04c44c..8b72405048 100644 --- a/client/ayon_core/pipeline/context_tools.py +++ b/client/ayon_core/pipeline/context_tools.py @@ -11,7 +11,12 @@ from pyblish.lib import MessageHandler from ayon_core import AYON_CORE_ROOT from ayon_core.host import HostBase -from ayon_core.lib import is_in_tests, initialize_ayon_connection, emit_event +from ayon_core.lib import ( + is_in_tests, + initialize_ayon_connection, + emit_event, + version_up +) from ayon_core.addon import load_addons, AddonsManager from ayon_core.settings import get_project_settings @@ -21,6 +26,8 @@ from .template_data import get_template_data_with_names from .workfile import ( get_workdir, get_custom_workfile_template_by_string_context, + get_workfile_template_key_from_context, + get_last_workfile ) from . import ( register_loader_plugin_path, @@ -579,3 +586,48 @@ def get_process_id(): if _process_id is None: _process_id = str(uuid.uuid4()) return _process_id + + +def version_up_current_workfile(): + """Function to increment and save workfile + """ + host = registered_host() + if not host.has_unsaved_changes(): + print("No unsaved changes, skipping file save..") + return + + project_name = get_current_project_name() + folder_path = get_current_folder_path() + task_name = get_current_task_name() + host_name = get_current_host_name() + + template_key = get_workfile_template_key_from_context( + project_name, + folder_path, + task_name, + host_name, + ) + anatomy = Anatomy(project_name) + + data = get_template_data_with_names( + project_name, folder_path, task_name, host_name + ) + data["root"] = anatomy.roots + + work_template = anatomy.get_template_item("work", template_key) + + # Define saving file extension + extensions = host.get_workfile_extensions() + current_file = host.get_current_workfile() + if current_file: + extensions = [os.path.splitext(current_file)[-1]] + + work_root = work_template["directory"].format_strict(data) + file_template = work_template["file"].template + last_workfile_path = get_last_workfile( + work_root, file_template, data, extensions, True + ) + new_workfile_path = version_up(last_workfile_path) + if os.path.exists(new_workfile_path): + new_workfile_path = version_up(new_workfile_path) + host.save_workfile(new_workfile_path) diff --git a/server/settings/tools.py b/server/settings/tools.py index fb8430a71c..1d32169954 100644 --- a/server/settings/tools.py +++ b/server/settings/tools.py @@ -118,6 +118,15 @@ class WorkfilesLockProfile(BaseSettingsModel): enabled: bool = SettingsField(True, title="Enabled") +class AYONMenuModel(BaseSettingsModel): + _layout = "expanded" + version_up_current_workfile: bool = SettingsField( + False, + title="Version Up Workfile", + description="Add 'Version Up Workfile' to AYON menu" + ) + + class WorkfilesToolModel(BaseSettingsModel): workfile_template_profiles: list[WorkfileTemplateProfile] = SettingsField( default_factory=list, @@ -268,6 +277,10 @@ class PublishToolModel(BaseSettingsModel): class GlobalToolsModel(BaseSettingsModel): + ayon_menu: AYONMenuModel = SettingsField( + default_factory=AYONMenuModel, + title="AYON Menu" + ) creator: CreatorToolModel = SettingsField( default_factory=CreatorToolModel, title="Creator" @@ -287,6 +300,9 @@ class GlobalToolsModel(BaseSettingsModel): DEFAULT_TOOLS_VALUES = { + "ayon_menu": { + "version_up_current_workfile": False + }, "creator": { "product_types_smart_select": [ { diff --git a/server_addon/maya/client/ayon_maya/api/menu.py b/server_addon/maya/client/ayon_maya/api/menu.py index 153aff07c3..a6f8ae2db0 100644 --- a/server_addon/maya/client/ayon_maya/api/menu.py +++ b/server_addon/maya/client/ayon_maya/api/menu.py @@ -25,6 +25,7 @@ from .workfile_template_builder import ( build_workfile_template, update_workfile_template ) +from ayon_core.pipeline.context_tools import version_up_current_workfile from ayon_core.tools.workfile_template_build import open_template_ui from .workfile_template_builder import MayaTemplateBuilder @@ -74,6 +75,14 @@ def install(project_settings): cmds.setParent("..", menu=True) + if project_settings["core"]["tools"]["ayon_menu"].get( + "version_up_current_workfile"): + cmds.menuItem(divider=True) + cmds.menuItem( + "Version Up Workfile", + command=lambda *args: version_up_current_workfile() + ) + cmds.menuItem(divider=True) cmds.menuItem(