From 0761613e09dce0bf5e028f7dfb8a3b74c0fde913 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 10:39:09 +0100 Subject: [PATCH 1/8] removed usage of sw_folders --- .../action_create_folders.py | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py index 994dbd90e4..8bbef9ad73 100644 --- a/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py +++ b/openpype/modules/default_modules/ftrack/event_handlers_user/action_create_folders.py @@ -111,13 +111,6 @@ class CreateFolders(BaseAction): publish_template = publish_template[key] publish_has_apps = "{app" in publish_template - tools_settings = project_settings["global"]["tools"] - app_presets = tools_settings["Workfiles"]["sw_folders"] - app_manager_apps = None - if app_presets and (work_has_apps or publish_has_apps): - app_manager_apps = ApplicationManager().applications - - cached_apps = {} collected_paths = [] for entity in all_entities: if entity.entity_type.lower() == "project": @@ -143,26 +136,10 @@ class CreateFolders(BaseAction): if child["object_type"]["name"].lower() != "task": continue tasks_created = True - task_type_name = child["type"]["name"].lower() task_data = ent_data.copy() task_data["task"] = child["name"] apps = [] - if app_manager_apps: - possible_apps = app_presets.get(task_type_name) or [] - for app_name in possible_apps: - - if app_name in cached_apps: - apps.append(cached_apps[app_name]) - continue - - app_def = app_manager_apps.get(app_name) - if app_def and app_def.is_host: - app_dir = app_def.host_name - else: - app_dir = app_name - cached_apps[app_name] = app_dir - apps.append(app_dir) # Template wok if work_has_apps: From fca31274d0b83f31c44301ff00d1ff80017f1ae9 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 11:00:24 +0100 Subject: [PATCH 2/8] replaced sw_folders with extra_folders --- .../defaults/project_settings/global.json | 16 +------- .../schemas/schema_global_tools.json | 40 ++++++++++++++++--- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index 55732f80ce..cff1259c98 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -291,21 +291,7 @@ "enabled": false } ], - "sw_folders": { - "compositing": [ - "nuke", - "ae" - ], - "modeling": [ - "maya", - "blender", - "zbrush" - ], - "lookdev": [ - "substance", - "textures" - ] - } + "extra_folders": [] }, "loader": { "family_filter_profiles": [ diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json index 26d3771d8a..10f15e4104 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json @@ -195,14 +195,44 @@ } }, { - "type": "dict-modifiable", + "type": "list", + "key": "extra_folders", + "label": "Extra work folders", "collapsible": true, - "key": "sw_folders", - "label": "Extra task folders", + "use_label_wrap": true, "is_group": true, "object_type": { - "type": "list", - "object_type": "text" + "type": "dict", + "children": [ + { + "type": "hosts-enum", + "key": "hosts", + "label": "Hosts", + "multiselection": true + }, + { + "type": "task-types-enum", + "key": "task_types", + "label": "Task types" + }, + { + "label": "Task names", + "key": "task_names", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "folders", + "label": "Folders", + "type": "list", + "highlight_content": true, + "collapsible": false, + "object_type": "text" + } + ] } } ] From 8785536ad38af9101928395f70947e764680267e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:41:43 +0100 Subject: [PATCH 3/8] modified imports --- openpype/lib/path_tools.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/openpype/lib/path_tools.py b/openpype/lib/path_tools.py index 9bb0231ca7..ea6258f9f9 100644 --- a/openpype/lib/path_tools.py +++ b/openpype/lib/path_tools.py @@ -1,13 +1,14 @@ -import json -import logging import os import re import abc +import json +import logging import six +from openpype.settings import get_project_settings +from openpype.settings.lib import get_site_local_overrides from .anatomy import Anatomy -from openpype.settings import get_project_settings log = logging.getLogger(__name__) From 22a2a433c15477d7ff625097c3374002c1233d04 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:42:01 +0100 Subject: [PATCH 4/8] created function to create extra folders in workdir --- openpype/lib/__init__.py | 4 ++- openpype/lib/path_tools.py | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index c99e3bc28d..0b8a4dfa15 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -148,7 +148,8 @@ from .path_tools import ( get_version_from_path, get_last_version_from_path, create_project_folders, - get_project_basic_paths + create_workdir_extra_folders, + get_project_basic_paths, ) from .editorial import ( @@ -290,6 +291,7 @@ __all__ = [ "frames_to_timecode", "make_sequence_collection", "create_project_folders", + "create_workdir_extra_folders", "get_project_basic_paths", "get_openpype_version", diff --git a/openpype/lib/path_tools.py b/openpype/lib/path_tools.py index ea6258f9f9..12e9e2db9c 100644 --- a/openpype/lib/path_tools.py +++ b/openpype/lib/path_tools.py @@ -9,6 +9,7 @@ from openpype.settings import get_project_settings from openpype.settings.lib import get_site_local_overrides from .anatomy import Anatomy +from .profiles_filtering import filter_profiles log = logging.getLogger(__name__) @@ -201,6 +202,58 @@ def get_project_basic_paths(project_name): return _list_path_items(folder_structure) +def create_workdir_extra_folders( + workdir, host_name, task_type, task_name, project_name, + project_settings=None +): + """Create extra folders in work directory based on context. + + Args: + workdir (str): Path to workdir where workfiles is stored. + host_name (str): Name of host implementation. + task_type (str): Type of task for which extra folders should be + created. + task_name (str): Name of task for which extra folders should be + created. + project_name (str): Name of project on which task is. + project_settings (dict): Prepared project settings. Are loaded if not + passed. + """ + # Load project settings if not set + if not project_settings: + project_settings = get_project_settings(project_name) + + # Load extra folders profiles + extra_folders_profiles = ( + project_settings["global"]["tools"]["Workfiles"]["extra_folders"] + ) + # Skip if are empty + if not extra_folders_profiles: + return + + # Prepare profiles filters + filter_data = { + "task_types": task_type, + "task_names": task_name, + "hosts": host_name + } + profile = filter_profiles(extra_folders_profiles, filter_data) + if profile is None: + return + + for subfolder in profile["folders"]: + # Make sure backslashes are converted to forwards slashes + # and does not start with slash + subfolder = subfolder.replace("\\", "/").lstrip("/") + # Skip empty strings + if not subfolder: + continue + + fullpath = os.path.join(workdir, subfolder) + if not os.path.exists(fullpath): + os.makedirs(fullpath) + + @six.add_metaclass(abc.ABCMeta) class HostDirmap: """ From ecbe66a0d2a65b777d4352577db8f7dbe32b7b76 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:42:36 +0100 Subject: [PATCH 5/8] use trigger create workdir extra folders in workfiles tool --- openpype/tools/workfiles/app.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 7973b88b82..80e0957fee 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -25,7 +25,8 @@ from openpype.lib import ( get_workfile_doc, create_workfile_doc, save_workfile_data_to_doc, - get_workfile_template_key + get_workfile_template_key, + create_workdir_extra_folders ) from .model import FilesModel @@ -672,7 +673,13 @@ class FilesWidget(QtWidgets.QWidget): self.set_asset_task( self._asset_id, self._task_name, self._task_type ) - + create_workdir_extra_folders( + self.root, + api.Session["AVALON_APP"], + self._task_type, + self._task_name, + api.Session["AVALON_PROJECT"] + ) pipeline.emit("after.workfile.save", [file_path]) self.workfile_created.emit(file_path) From b86a4ea95b5356f368919d037f3922f331595753 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:46:01 +0100 Subject: [PATCH 6/8] don't use schedule in workfiles tool --- openpype/tools/workfiles/app.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 80e0957fee..0615ec0aca 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -12,7 +12,6 @@ from avalon import io, api, pipeline from openpype import style from openpype.tools.utils.lib import ( - schedule, qt_app_context ) from openpype.tools.utils import PlaceholderLineEdit @@ -736,7 +735,7 @@ class FilesWidget(QtWidgets.QWidget): self.files_model.refresh() if self.auto_select_latest_modified: - schedule(self._select_last_modified_file, 100) + self._select_last_modified_file() def on_context_menu(self, point): index = self.files_view.indexAt(point) @@ -941,8 +940,8 @@ class Window(QtWidgets.QMainWindow): # Connect signals set_context_timer.timeout.connect(self._on_context_set_timeout) - assets_widget.selection_changed.connect(self.on_asset_changed) - tasks_widget.task_changed.connect(self.on_task_changed) + assets_widget.selection_changed.connect(self._on_asset_changed) + tasks_widget.task_changed.connect(self._on_task_changed) files_widget.file_selected.connect(self.on_file_select) files_widget.workfile_created.connect(self.on_workfile_create) files_widget.file_opened.connect(self._on_file_opened) @@ -987,13 +986,6 @@ class Window(QtWidgets.QMainWindow): def set_save_enabled(self, enabled): self.files_widget.btn_save.setEnabled(enabled) - def on_task_changed(self): - # Since we query the disk give it slightly more delay - schedule(self._on_task_changed, 100, channel="mongo") - - def on_asset_changed(self): - schedule(self._on_asset_changed, 50, channel="mongo") - def on_file_select(self, filepath): asset_id = self.assets_widget.get_selected_asset_id() task_name = self.tasks_widget.get_selected_task_name() From d68992a76494706925ffac4b8180544459b5822a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 12:56:52 +0100 Subject: [PATCH 7/8] added prelaunch hook that will create extra folders in workdir for launch context --- .../hooks/pre_create_extra_workdir_folders.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 openpype/hooks/pre_create_extra_workdir_folders.py diff --git a/openpype/hooks/pre_create_extra_workdir_folders.py b/openpype/hooks/pre_create_extra_workdir_folders.py new file mode 100644 index 0000000000..d79c5831ee --- /dev/null +++ b/openpype/hooks/pre_create_extra_workdir_folders.py @@ -0,0 +1,33 @@ +import os +from openpype.lib import ( + PreLaunchHook, + create_workdir_extra_folders +) + + +class AddLastWorkfileToLaunchArgs(PreLaunchHook): + """Add last workfile path to launch arguments. + + This is not possible to do for all applications the same way. + """ + + # Execute after workfile template copy + order = 15 + + def execute(self): + if not self.application.is_host: + return + + env = self.data.get("env") or {} + workdir = env.get("AVALON_WORKDIR") + if not workdir or not os.path.exists(workdir): + return + + host_name = self.application.host_name + task_type = self.data["task_type"] + task_name = self.data["task_name"] + project_name = self.data["project_name"] + + create_workdir_extra_folders( + workdir, host_name, task_type, task_name, project_name, + ) From 8826b6dfa2519feb5a28ea4264a8c8e51db74ce0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 31 Dec 2021 13:02:29 +0100 Subject: [PATCH 8/8] added label --- .../schemas/projects_schema/schemas/schema_global_tools.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json index 10f15e4104..bb71c9bde6 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json @@ -224,6 +224,10 @@ { "type": "splitter" }, + { + "type": "label", + "label": "Folders will be created in directory next to workfile. Items may contain nested directories (e.g. resources/images)." + }, { "key": "folders", "label": "Folders",