From 579fe7187c4a7a4c5af1efefe5ae361ba45b3853 Mon Sep 17 00:00:00 2001 From: jezscha Date: Mon, 24 May 2021 14:11:55 +0000 Subject: [PATCH 01/44] Create draft PR for #895 From 6374f2f5408a5edb628d23d60a210b15f2b2c6ba Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 25 May 2021 14:44:42 +0200 Subject: [PATCH 02/44] settings: workfile build schema with prelaunch hooks --- .../schemas/schema_workfile_build.json | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json index 0cb36c2f92..8fa467f994 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json @@ -4,6 +4,37 @@ "key": "workfile_build", "label": "Workfile Build Settings", "children": [ + { + "type": "dict", + "collapsible": false, + "key": "pre_hooks", + "label": "Pre Launch Hooks", + "is_group": true, + "children": [ + { + "type": "dict", + "collapsible": true, + "key": "create_first_version", + "label": "Create First Version", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled" + }, + { + "type": "path", + "key": "template_path", + "label": "Path to template", + "multiplatform": true, + "multipath": true + } + ] + } + + ] + }, { "type": "list", "key": "profiles", From 3ba45df98bcfb9bd2769de3170c20686f6c0560a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 25 May 2021 15:07:13 +0200 Subject: [PATCH 03/44] fix stretch of PathWidget --- openpype/tools/settings/settings/item_widgets.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/tools/settings/settings/item_widgets.py b/openpype/tools/settings/settings/item_widgets.py index 11ccb60ae4..b23372e9ac 100644 --- a/openpype/tools/settings/settings/item_widgets.py +++ b/openpype/tools/settings/settings/item_widgets.py @@ -508,6 +508,8 @@ class PathWidget(BaseWidget): self.content_layout = QtWidgets.QGridLayout(self) self.content_layout.setContentsMargins(0, 0, 0, 0) self.content_layout.setSpacing(5) + # Add stretch to second column + self.content_layout.setColumnStretch(1, 1) self.body_widget = None self.setAttribute(QtCore.Qt.WA_TranslucentBackground) From a129a8920cedc76e3d8b7aa10333a37256e19ccf Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 26 May 2021 11:25:25 +0200 Subject: [PATCH 04/44] settings: collapsible wrap for building profiles --- .../schemas/schema_workfile_build.json | 174 +++++++++--------- 1 file changed, 90 insertions(+), 84 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json index 8fa467f994..1b1b366608 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json @@ -36,93 +36,99 @@ ] }, { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "tasks", - "label": "Tasks", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "current_context", - "label": "Current Context", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" + "type": "collapsible-wrap", + "label": "Building Profiles", + "children": [ + { + "type": "list", + "key": "profiles", + "label": "Profiles", + "object_type": { + "type": "dict", + "children": [ + { + "key": "tasks", + "label": "Tasks", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "current_context", + "label": "Current Context", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" + } + ] } - ] - } - }, - { - "key": "linked_assets", - "label": "Linked Assets", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" + }, + { + "key": "linked_assets", + "label": "Linked Assets", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" + } + ] } - ] - } + } + ] } - ] - } + } + ] } ] } From e3f53f97167ca7cf95671d847837478540a3fe0b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 26 May 2021 15:47:02 +0200 Subject: [PATCH 05/44] settings: reverse workfile build commits --- .../schemas/schema_workfile_build.json | 207 +++++++----------- 1 file changed, 85 insertions(+), 122 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json index 1b1b366608..078bb81bba 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_build.json @@ -5,130 +5,93 @@ "label": "Workfile Build Settings", "children": [ { - "type": "dict", - "collapsible": false, - "key": "pre_hooks", - "label": "Pre Launch Hooks", - "is_group": true, - "children": [ - { - "type": "dict", - "collapsible": true, - "key": "create_first_version", - "label": "Create First Version", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled" - }, - { - "type": "path", - "key": "template_path", - "label": "Path to template", - "multiplatform": true, - "multipath": true + "type": "list", + "key": "profiles", + "label": "Profiles", + "object_type": { + "type": "dict", + "children": [ + { + "key": "tasks", + "label": "Tasks", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "current_context", + "label": "Current Context", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" + } + ] } - ] - } - - ] - }, - { - "type": "collapsible-wrap", - "label": "Building Profiles", - "children": [ - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "tasks", - "label": "Tasks", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "current_context", - "label": "Current Context", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] + }, + { + "key": "linked_assets", + "label": "Linked Assets", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" } - }, - { - "key": "linked_assets", - "label": "Linked Assets", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] - } - } - ] + ] + } } - } - ] + ] + } } ] -} +} \ No newline at end of file From fcdfb2692185b3dfff755024c1b50b791b272f4b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 26 May 2021 18:30:01 +0200 Subject: [PATCH 06/44] settings: schema workfile options --- .../defaults/project_settings/nuke.json | 20 ++- .../projects_schema/schema_project_nuke.json | 2 +- .../schemas/schema_workfile_options.json | 137 ++++++++++++++++++ 3 files changed, 154 insertions(+), 5 deletions(-) create mode 100644 openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json index bb5232cea7..33416e7b6c 100644 --- a/openpype/settings/defaults/project_settings/nuke.json +++ b/openpype/settings/defaults/project_settings/nuke.json @@ -147,8 +147,18 @@ "node_name_template": "{class_name}_{ext}" } }, - "workfile_build": { - "profiles": [ + "workfile_options": { + "create_first_version": { + "enabled": false, + "use_buildin_template": false, + "custom_template_paths": { + "windows": "", + "darwin": "", + "linux": "" + }, + "builder_on": false + }, + "builder_profiles": [ { "tasks": [ "compositing" @@ -162,10 +172,12 @@ ], "repre_names": [ "exr", - "dpx" + "dpx", + "mov" ], "loaders": [ - "LoadSequence" + "LoadSequence", + "LoadMov" ] } ], diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json b/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json index 5022b75719..e77aa671be 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json @@ -104,7 +104,7 @@ }, { "type": "schema", - "name": "schema_workfile_build" + "name": "schema_workfile_options" }, { "type": "schema", diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json new file mode 100644 index 0000000000..11928133ce --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json @@ -0,0 +1,137 @@ +{ + "type": "dict", + "collapsible": true, + "key": "workfile_options", + "label": "Workfile Options", + "children": [ + { + "type": "dict", + "collapsible": true, + "key": "create_first_version", + "label": "Create first version", + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled", + "label": "Enabled", + "default": false + }, + { + "type": "boolean", + "key": "use_buildin_template", + "label": "Use buildin template (if available)", + "default": false + }, + { + "type": "path", + "key": "custom_template_paths", + "label": "Custom Template Path", + "multiplatform": true, + "multipath": false + }, + { + "type": "boolean", + "key": "builder_on", + "label": "Use Builder Profiles At Start", + "default": false + } + ] + }, + { + "type": "collapsible-wrap", + "label": "Builder Profiles", + "children": [ + { + "type": "list", + "key": "builder_profiles", + "label": "Profiles", + "object_type": { + "type": "dict", + "children": [ + { + "key": "tasks", + "label": "Tasks", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "current_context", + "label": "Current Context", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" + } + ] + } + }, + { + "key": "linked_assets", + "label": "Linked Assets", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" + } + ] + } + } + ] + } + } + ] + } + ] +} From 5c4446ef0c153a10652e0eafa6b7c37cfbf8bf2b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 26 May 2021 18:30:39 +0200 Subject: [PATCH 07/44] nuke: workfile options callback --- openpype/hosts/nuke/api/__init__.py | 2 +- openpype/hosts/nuke/api/lib.py | 67 +++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/openpype/hosts/nuke/api/__init__.py b/openpype/hosts/nuke/api/__init__.py index bd7a95f916..bb60465e23 100644 --- a/openpype/hosts/nuke/api/__init__.py +++ b/openpype/hosts/nuke/api/__init__.py @@ -80,7 +80,7 @@ def install(): # Set context settings. nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") nuke.addOnCreate(workfile_settings.set_favorites, nodeClass="Root") - nuke.addOnCreate(lib.open_last_workfile, nodeClass="Root") + nuke.addOnCreate(lib.process_workfile_options, nodeClass="Root") nuke.addOnCreate(lib.launch_workfiles_app, nodeClass="Root") menu.install() diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index e6dde813a7..689b51f6a3 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -16,6 +16,7 @@ from avalon.nuke import ( from openpype.api import ( Logger, Anatomy, + BuildWorkfile, get_version_from_path, get_anatomy_settings, get_hierarchy, @@ -1641,23 +1642,61 @@ def launch_workfiles_app(): workfiles.show(os.environ["AVALON_WORKDIR"]) -def open_last_workfile(): - # get state from settings - open_last_version = get_current_project_settings()["nuke"].get( - "general", {}).get("create_initial_workfile") +def process_workfile_options(): + from openpype.lib import env_value_to_bool + + # get state from settings + workfile_options = get_current_project_settings()["nuke"].get( + "workfile_options", {}) + + # get all imortant settings + openlv_on = env_value_to_bool( + env_key="AVALON_OPEN_LAST_WORKFILE", + default=None) + + createfv_on = workfile_options.get( + "create_first_version", {}).get("enabled") + createfv_template_paths = workfile_options.get( + "create_first_version", {}).get("custom_template_paths") + createfv_builder = workfile_options.get( + "create_first_version", {}).get("builder_on") - log.info("Opening last workfile...") last_workfile_path = os.environ.get("AVALON_LAST_WORKFILE") - if not os.path.exists(last_workfile_path): - # return if none is defined - if not open_last_version: - return + # generate first version in file not existing and feature is enabled + if createfv_on and not os.path.exists(last_workfile_path): + # get custom template path if any + custom_template_path = createfv_template_paths[ + platform.system().lower()] + # if custom template is defined + if custom_template_path: + log.info("Adding nodes from `{}`...".format( + custom_template_path + )) + # import nodes into current script + nuke.nodePaste(custom_template_path) + + # if builder at start is defined + if createfv_builder: + log.info("Building nodes from presets...") + # build nodes by defined presets + BuildWorkfile().process() + + log.info("Saving script as version `{}`...".format( + last_workfile_path + )) + # safe file as version save_file(last_workfile_path) - else: - # to avoid looping of the callback, remove it! - nuke.removeOnCreate(open_last_workfile, nodeClass="Root") + return - # open workfile - open_file(last_workfile_path) + # skip opening of last version if it is not enabled + if not openlv_on or not os.path.exists(last_workfile_path): + return + + # to avoid looping of the callback, remove it! + nuke.removeOnCreate(process_workfile_options, nodeClass="Root") + + log.info("Opening last workfile...") + # open workfile + open_file(last_workfile_path) From 97ef333354c216210d6486bdfb3d97c70ecc053f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 26 May 2021 18:31:35 +0200 Subject: [PATCH 08/44] global: allowing build workfile from `workfile options` schema --- openpype/lib/avalon_context.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 2a7c58c4ee..ac5f4555c4 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -756,11 +756,22 @@ class BuildWorkfile: host_name = avalon.api.registered_host().__name__.rsplit(".", 1)[-1] presets = get_project_settings(avalon.io.Session["AVALON_PROJECT"]) # Get presets for host - build_presets = ( - presets.get(host_name, {}) - .get("workfile_build") - .get("profiles") - ) + # for backward compatibility this has to have exception + # if the concept will be agreed then this needs to be + # refactored without exception + if "nuke" in host_name: + build_presets = ( + presets.get(host_name, {}) + .get("workfile_options") + .get("builder_profiles") + ) + else: + build_presets = ( + presets.get(host_name, {}) + .get("workfile_build") + .get("profiles") + ) + if not build_presets: return From 1b452e2bd62ef4768c2245434398a051c508ce54 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 27 May 2021 16:41:57 +0200 Subject: [PATCH 09/44] settings: improving schema for workfile options --- .../projects_schema/schemas/schema_workfile_options.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json index 11928133ce..7eed942232 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json @@ -26,14 +26,14 @@ { "type": "path", "key": "custom_template_paths", - "label": "Custom Template Path", + "label": "Custom template path", "multiplatform": true, "multipath": false }, { "type": "boolean", "key": "builder_on", - "label": "Use Builder Profiles At Start", + "label": "Use Builder profiles at start", "default": false } ] @@ -93,6 +93,9 @@ ] } }, + { + "type": "separator" + }, { "key": "linked_assets", "label": "Linked Assets", From c70f4724672b6abec7a690f1a689987e3dda5d64 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 27 May 2021 16:43:06 +0200 Subject: [PATCH 10/44] documentation: project settings for nuke - also global as been updated --- ...lobal_tools_workfile_open_last_version.png | Bin 0 -> 9610 bytes ...nuke_workfile_options_builder_profiles.png | Bin 0 -> 23133 bytes ..._workfile_options_create_first_version.png | Bin 0 -> 6783 bytes .../assets/nuke_workfile_options_location.png | Bin 0 -> 4990 bytes .../settings_project_global.md | 25 +++++--- .../project_settings/settings_project_nuke.md | 54 ++++++++++++++++++ website/sidebars.js | 3 +- 7 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 website/docs/project_settings/assets/global_tools_workfile_open_last_version.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_options_create_first_version.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_options_location.png create mode 100644 website/docs/project_settings/settings_project_nuke.md diff --git a/website/docs/project_settings/assets/global_tools_workfile_open_last_version.png b/website/docs/project_settings/assets/global_tools_workfile_open_last_version.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcac072c57f8f91f24dd4221d4f71b75df232ff GIT binary patch literal 9610 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 literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/assets/nuke_workfile_options_location.png b/website/docs/project_settings/assets/nuke_workfile_options_location.png new file mode 100644 index 0000000000000000000000000000000000000000..9c7c9b644c67dbe356d1a0b428d0c91fa3f89a95 GIT binary patch literal 4990 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 Bu1Np@ literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/settings_project_global.md b/website/docs/project_settings/settings_project_global.md index 4fee57d575..22f0eb5cc2 100644 --- a/website/docs/project_settings/settings_project_global.md +++ b/website/docs/project_settings/settings_project_global.md @@ -17,10 +17,10 @@ Projects always use default project values unless they have [project override](. Many of the settings are using a concept of **Profile filters** -You can define multiple profiles to choose from for different contexts. Each filter is evaluated and a -profile with filters matching the current context the most, is used. +You can define multiple profiles to choose from for different contexts. Each filter is evaluated and a +profile with filters matching the current context the most, is used. -You can define profile without any filters and use it as **default**. +You can define profile without any filters and use it as **default**. Only **one or none** profile will be returned per context. @@ -86,7 +86,7 @@ Profile may generate multiple outputs from a single input. Each output must defi Saves information for all published subsets into DB, published assets are available for other hosts, tools and tasks after. #### Template name profiles -Allows to select [anatomy template](admin_settings_project_anatomy.md#templates) based on context of subset being published. +Allows to select [anatomy template](admin_settings_project_anatomy.md#templates) based on context of subset being published. For example for `render` profile you might want to publish and store assets in different location (based on anatomy setting) then for `publish` profile. [Profile filtering](#profile-filters) is used to select between appropriate template for each context of published subsets. @@ -96,7 +96,7 @@ Applicable context filters: - **`tasks`** - Current task. `["modeling", "animation"]` ![global_integrate_new_template_name_profile](assets/global_integrate_new_template_name_profile.png) - + (This image shows use case where `render` anatomy template is used for subsets of families ['review, 'render', 'prerender'], `publish` template is chosen for all other.) #### Subset grouping profiles @@ -111,5 +111,16 @@ Applicable context filters: - **`tasks`** - Current task. `["modeling", "animation"]` ![global_integrate_new_template_name_profile](assets/global_integrate_new_subset_group.png) - -(This image shows use case where only assets published from 'photoshop', for all families for all tasks should be marked as grouped with a capitalized name of Task where they are published from.) \ No newline at end of file + +(This image shows use case where only assets published from 'photoshop', for all families for all tasks should be marked as grouped with a capitalized name of Task where they are published from.) + +## Tools +Settings for OpenPype tools. + +## Workfiles +All settings related to Workfile tool. + +### Open last workfile at launch +This feature allows you to define a rule for each task/host or toggle the feature globally to all tasks as they are visible in the picture. + +![global_tools_workfile_open_last_version](assets/global_tools_workfile_open_last_version.png) \ No newline at end of file diff --git a/website/docs/project_settings/settings_project_nuke.md b/website/docs/project_settings/settings_project_nuke.md new file mode 100644 index 0000000000..3d476ed172 --- /dev/null +++ b/website/docs/project_settings/settings_project_nuke.md @@ -0,0 +1,54 @@ +--- +id: settings_project_nuke +title: Project Nuke Setting +sidebar_label: Nuke +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Project settings can have project specific values. Each new project is using studio values defined in **default** project but these values can be modified or overriden per project. + +:::warning Default studio values +Projects always use default project values unless they have [project override](../admin_settings#project-overrides) (orage colour). Any changes in default project may affect all existing projects. +::: + +## Workfile Options + +All workfile related settings can be found here. This is a list of available features: +- Create First Version +- Add Custom Template Path +- Use Builder Profiles At Start +- Define Builder Profiles With Filters + +![nuke_workfile_options_location](assets/nuke_workfile_options_location.png) + +:::important Auto Load Last Version +In case you want to set the auto load of the latest available version of workfiles, you can do it from [here](settings_project_global#open-last-workfile-at-launch). +::: + +### Create First Version + +By switchintg this featore on, OpenPype will generate first version. Following attributes are possible to configure: + +![nuke_workfile_options_create_first_version](assets/nuke_workfile_options_create_first_version.png) + +#### Use buildin template (if available) +Not applycable in Nuke and can be ignored + +#### Custom template path +Any path to nukescript. Nodes inside the script will be added into node graph at build time. + +#### Use Builder profiles at start +Enabling this feature will look into available Builder Prorfiles (look bellow for more informations about this feature) and load available versions into node graph. + +### Builder Profiles +Builder profiles are set of rules allowing artist Load any available versions for the context of the asset, which it is run from. Preset is having following attributes: + +- **Filter**: Each profile could be defined with task filter. In case no filter is defined, a profile will be working for all. + +- **Context section**: filtres for subset name, families, representation names and available Loader plugin. + +- **Linked Assets**: filters for asset builds to be added + +![nuke_workfile_options_builder_profiles](assets/nuke_workfile_options_builder_profiles.png) diff --git a/website/sidebars.js b/website/sidebars.js index 7a5379c36b..0b831bccb3 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -64,7 +64,8 @@ module.exports = { type: "category", label: "Project Settings", items: [ - "project_settings/settings_project_global" + "project_settings/settings_project_global", + "project_settings/settings_project_nuke" ], }, ], From 89f498e23a8b2fc2942cd71f697f3929939c9a53 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 27 May 2021 17:26:32 +0200 Subject: [PATCH 11/44] settings: `Linked Assets` renamed to `Linked Assets/Shots` --- .../schemas/schema_workfile_options.json | 2 +- ...nuke_workfile_options_builder_profiles.png | Bin 23133 -> 22337 bytes .../project_settings/settings_project_nuke.md | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json index 7eed942232..78b9ea6202 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json @@ -98,7 +98,7 @@ }, { "key": "linked_assets", - "label": "Linked Assets", + "label": "Linked Assets/Shots", "type": "list", "highlight_content": true, "object_type": { diff --git a/website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png b/website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png index a61f72c5fe513012b0cad1d1db13da3f9b1098b0..3813554b6e8de7f6494cff7b9c53428c5bfe8854 100644 GIT binary patch literal 22337 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 literal 23133 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 TGgn#|0Qn4_u6{1-oD!M Date: Thu, 27 May 2021 19:19:04 +0200 Subject: [PATCH 12/44] tweak settings for nuke workfile build --- .../project_settings/aftereffects.json | 8 ++- .../defaults/project_settings/global.json | 3 +- .../defaults/project_settings/nuke.json | 48 +++------------ .../projects_schema/schema_project_nuke.json | 14 +---- ...ns.json => template_workfile_options.json} | 59 ++++++++----------- 5 files changed, 41 insertions(+), 91 deletions(-) rename openpype/settings/entities/schemas/projects_schema/schemas/{schema_workfile_options.json => template_workfile_options.json} (80%) diff --git a/openpype/settings/defaults/project_settings/aftereffects.json b/openpype/settings/defaults/project_settings/aftereffects.json index f54dbb9612..b272c60d98 100644 --- a/openpype/settings/defaults/project_settings/aftereffects.json +++ b/openpype/settings/defaults/project_settings/aftereffects.json @@ -4,8 +4,12 @@ "enabled": true, "optional": true, "active": true, - "skip_resolution_check": [".*"], - "skip_timelines_check": [".*"] + "skip_resolution_check": [ + ".*" + ], + "skip_timelines_check": [ + ".*" + ] }, "AfterEffectsSubmitDeadline": { "use_published": true, diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index d3b8c55d07..e3934bd537 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -272,8 +272,7 @@ "active_site": "studio", "remote_site": "studio" }, - "sites": { - } + "sites": {} }, "project_plugins": { "windows": [], diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json index 33416e7b6c..a15c8f7838 100644 --- a/openpype/settings/defaults/project_settings/nuke.json +++ b/openpype/settings/defaults/project_settings/nuke.json @@ -6,9 +6,7 @@ "load": "ctrl+alt+l", "manage": "ctrl+alt+m", "build_workfile": "ctrl+alt+b" - }, - "open_workfile_at_start": false, - "create_initial_workfile": true + } }, "create": { "CreateWriteRender": { @@ -147,43 +145,15 @@ "node_name_template": "{class_name}_{ext}" } }, - "workfile_options": { - "create_first_version": { - "enabled": false, - "use_buildin_template": false, - "custom_template_paths": { - "windows": "", - "darwin": "", - "linux": "" - }, - "builder_on": false + "workfile_builder": { + "create_first_version": false, + "template_path": { + "windows": "", + "darwin": "", + "linux": "" }, - "builder_profiles": [ - { - "tasks": [ - "compositing" - ], - "current_context": [ - { - "subset_name_filters": [], - "families": [ - "render", - "plate" - ], - "repre_names": [ - "exr", - "dpx", - "mov" - ], - "loaders": [ - "LoadSequence", - "LoadMov" - ] - } - ], - "linked_assets": [] - } - ] + "builder_on_start": false, + "profiles": [] }, "filters": {} } \ No newline at end of file diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json b/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json index e77aa671be..f709e84651 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_nuke.json @@ -43,16 +43,6 @@ "label": "Build Workfile" } ] - }, - { - "type": "boolean", - "key": "open_workfile_at_start", - "label": "Open Workfile window at start of a Nuke session" - }, - { - "type": "boolean", - "key": "create_initial_workfile", - "label": "Create initial workfile version if none available" } ] }, @@ -103,8 +93,8 @@ "template_data": [] }, { - "type": "schema", - "name": "schema_workfile_options" + "type": "schema_template", + "name": "template_workfile_options" }, { "type": "schema", diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json similarity index 80% rename from openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json rename to openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json index 78b9ea6202..150f52113b 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_workfile_options.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json @@ -1,50 +1,36 @@ -{ +[{ "type": "dict", "collapsible": true, - "key": "workfile_options", - "label": "Workfile Options", + "key": "workfile_builder", + "label": "Workfile Builder", "children": [ { - "type": "dict", - "collapsible": true, + "type": "boolean", "key": "create_first_version", - "label": "Create first version", - "checkbox_key": "enabled", - "children": [ - { - "type": "boolean", - "key": "enabled", - "label": "Enabled", - "default": false - }, - { - "type": "boolean", - "key": "use_buildin_template", - "label": "Use buildin template (if available)", - "default": false - }, - { - "type": "path", - "key": "custom_template_paths", - "label": "Custom template path", - "multiplatform": true, - "multipath": false - }, - { - "type": "boolean", - "key": "builder_on", - "label": "Use Builder profiles at start", - "default": false - } - ] + "label": "Create first workfile", + "default": false + }, + + { + "type": "path", + "key": "template_path", + "label": "First workfile Template", + "multiplatform": true, + "multipath": false + }, + { + "type": "boolean", + "key": "builder_on_start", + "label": "Run Builder Profiles on first launch", + "default": false }, { "type": "collapsible-wrap", - "label": "Builder Profiles", + "label": "Profiles", "children": [ { "type": "list", - "key": "builder_profiles", + "key": "profiles", "label": "Profiles", "object_type": { "type": "dict", @@ -138,3 +124,4 @@ } ] } +] \ No newline at end of file From f188aef0a45321887bba8cc2915798087812aff8 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 27 May 2021 22:59:01 +0200 Subject: [PATCH 13/44] add simple workfiles builder template to hosts --- .../schemas/projects_schema/schema_main.json | 4 ++++ .../schema_project_aftereffects.json | 4 ++++ .../schema_project_blender.json | 13 +++++++++++ .../schema_project_photoshop.json | 4 ++++ .../schema_project_tvpaint.json | 4 ++++ .../template_workfile_builder_simple.json | 23 +++++++++++++++++++ 6 files changed, 52 insertions(+) create mode 100644 openpype/settings/entities/schemas/projects_schema/schema_project_blender.json create mode 100644 openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json diff --git a/openpype/settings/entities/schemas/projects_schema/schema_main.json b/openpype/settings/entities/schemas/projects_schema/schema_main.json index e77f13d351..64c5a7f366 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_main.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_main.json @@ -78,6 +78,10 @@ "type": "schema", "name": "schema_project_hiero" }, + { + "type": "schema", + "name": "schema_project_blender" + }, { "type": "schema", "name": "schema_project_aftereffects" diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json b/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json index 63bf9274a3..ddaa0dc692 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json @@ -85,6 +85,10 @@ ] } ] + }, + { + "type": "schema_template", + "name": "template_workfile_builder_simple" } ] } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json b/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json new file mode 100644 index 0000000000..25b0faab2c --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json @@ -0,0 +1,13 @@ +{ + "type": "dict", + "collapsible": true, + "key": "blender", + "label": "Blender", + "is_file": true, + "children": [ + { + "type": "schema_template", + "name": "template_workfile_builder_simple" + } + ] +} diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json index 3a20b4e79c..7aaab4c8ea 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json @@ -52,6 +52,10 @@ ] } ] + }, + { + "type": "schema_template", + "name": "template_workfile_builder_simple" } ] } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json b/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json index 00080f8247..e60d089a4d 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json @@ -112,6 +112,10 @@ } ] }, + { + "type": "schema_template", + "name": "template_workfile_builder_simple" + }, { "type": "schema", "name": "schema_publish_gui_filter" diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json new file mode 100644 index 0000000000..49cf9ca94a --- /dev/null +++ b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_builder_simple.json @@ -0,0 +1,23 @@ +[ + { + "type": "dict", + "collapsible": true, + "key": "workfile_builder", + "label": "Workfile Builder", + "children": [ + { + "type": "boolean", + "key": "create_first_version", + "label": "Create first workfile", + "default": false + }, + { + "type": "path", + "key": "template_path", + "label": "First workfile template", + "multiplatform": true, + "multipath": false + } + ] + } +] From 5d69fc2783633c9451a81fdcf76f78b582b2c2de Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 27 May 2021 22:59:29 +0200 Subject: [PATCH 14/44] store empty defaults template workfiles --- .../defaults/project_settings/aftereffects.json | 16 ++++++++++++++-- .../defaults/project_settings/blender.json | 10 ++++++++++ .../defaults/project_settings/global.json | 3 +-- .../defaults/project_settings/photoshop.json | 8 ++++++++ .../defaults/project_settings/tvpaint.json | 8 ++++++++ 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 openpype/settings/defaults/project_settings/blender.json diff --git a/openpype/settings/defaults/project_settings/aftereffects.json b/openpype/settings/defaults/project_settings/aftereffects.json index f54dbb9612..86f3a02ddf 100644 --- a/openpype/settings/defaults/project_settings/aftereffects.json +++ b/openpype/settings/defaults/project_settings/aftereffects.json @@ -4,8 +4,12 @@ "enabled": true, "optional": true, "active": true, - "skip_resolution_check": [".*"], - "skip_timelines_check": [".*"] + "skip_resolution_check": [ + ".*" + ], + "skip_timelines_check": [ + ".*" + ] }, "AfterEffectsSubmitDeadline": { "use_published": true, @@ -14,5 +18,13 @@ "secondary_pool": "", "chunk_size": 1000000 } + }, + "workfile_builder": { + "create_first_version": false, + "template_path": { + "windows": "", + "darwin": "", + "linux": "" + } } } \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/blender.json b/openpype/settings/defaults/project_settings/blender.json new file mode 100644 index 0000000000..8effe169fa --- /dev/null +++ b/openpype/settings/defaults/project_settings/blender.json @@ -0,0 +1,10 @@ +{ + "workfile_builder": { + "create_first_version": false, + "template_path": { + "windows": "", + "darwin": "", + "linux": "" + } + } +} \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index d3b8c55d07..e3934bd537 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -272,8 +272,7 @@ "active_site": "studio", "remote_site": "studio" }, - "sites": { - } + "sites": {} }, "project_plugins": { "windows": [], diff --git a/openpype/settings/defaults/project_settings/photoshop.json b/openpype/settings/defaults/project_settings/photoshop.json index 0db6e8248d..6ca913d5ea 100644 --- a/openpype/settings/defaults/project_settings/photoshop.json +++ b/openpype/settings/defaults/project_settings/photoshop.json @@ -13,5 +13,13 @@ "jpg" ] } + }, + "workfile_builder": { + "create_first_version": false, + "template_path": { + "windows": "", + "darwin": "", + "linux": "" + } } } \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/tvpaint.json b/openpype/settings/defaults/project_settings/tvpaint.json index 9d5b922b8e..4b422835fb 100644 --- a/openpype/settings/defaults/project_settings/tvpaint.json +++ b/openpype/settings/defaults/project_settings/tvpaint.json @@ -32,5 +32,13 @@ } } }, + "workfile_builder": { + "create_first_version": false, + "template_path": { + "windows": "", + "darwin": "", + "linux": "" + } + }, "filters": {} } \ No newline at end of file From 74fb591c11c519dd6f59f18f9f127e55a16d1b39 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 27 May 2021 22:59:49 +0200 Subject: [PATCH 15/44] remove template copying from tv paint pre-hook --- .../hosts/tvpaint/hooks/pre_launch_args.py | 50 +------------------ 1 file changed, 1 insertion(+), 49 deletions(-) diff --git a/openpype/hosts/tvpaint/hooks/pre_launch_args.py b/openpype/hosts/tvpaint/hooks/pre_launch_args.py index 04cca5d789..b0b13529ca 100644 --- a/openpype/hosts/tvpaint/hooks/pre_launch_args.py +++ b/openpype/hosts/tvpaint/hooks/pre_launch_args.py @@ -34,20 +34,6 @@ class TvpaintPrelaunchHook(PreLaunchHook): "run", self.launch_script_path(), executable_path ) - # Add workfile to launch arguments - workfile_path = self.workfile_path() - if workfile_path: - new_launch_args.append(workfile_path) - - # How to create new command line - # if platform.system().lower() == "windows": - # new_launch_args = [ - # "cmd.exe", - # "/c", - # "Call cmd.exe /k", - # *new_launch_args - # ] - # Append as whole list as these areguments should not be separated self.launch_context.launch_args.append(new_launch_args) @@ -64,38 +50,4 @@ class TvpaintPrelaunchHook(PreLaunchHook): "tvpaint", "launch_script.py" ) - return script_path - - def workfile_path(self): - workfile_path = self.data["last_workfile_path"] - - # copy workfile from template if doesnt exist any on path - if not os.path.exists(workfile_path): - # TODO add ability to set different template workfile path via - # settings - pype_dir = os.path.dirname(os.path.abspath(tvpaint.__file__)) - template_path = os.path.join( - pype_dir, "resources", "template.tvpp" - ) - - if not os.path.exists(template_path): - self.log.warning( - "Couldn't find workfile template file in {}".format( - template_path - ) - ) - return - - self.log.info( - f"Creating workfile from template: \"{template_path}\"" - ) - - # Copy template workfile to new destinantion - shutil.copy2( - os.path.normpath(template_path), - os.path.normpath(workfile_path) - ) - - self.log.info(f"Workfile to open: \"{workfile_path}\"") - - return workfile_path + return script_path \ No newline at end of file From 5fb20dfff62f8d72ea9489d312e0163e4b0e3245 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 27 May 2021 23:00:24 +0200 Subject: [PATCH 16/44] add workfiles template pre-hook for PS, AE, TV paint and blender --- openpype/hooks/pre_copy_template_workfile.py | 83 ++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 openpype/hooks/pre_copy_template_workfile.py diff --git a/openpype/hooks/pre_copy_template_workfile.py b/openpype/hooks/pre_copy_template_workfile.py new file mode 100644 index 0000000000..7593090ab4 --- /dev/null +++ b/openpype/hooks/pre_copy_template_workfile.py @@ -0,0 +1,83 @@ +import os +import platform +import shutil +from openpype.lib import PreLaunchHook +from openpype.settings import ( + get_project_settings +) + + +class AddTemplateWorkfileToLaunchArgs(PreLaunchHook): + """Add last workfile path to launch arguments. + + This is not possible to do for all applications the same way. + """ + + order = 0 + app_groups = ["blender", "photoshop", "tvpaint", "afftereffects"] + + def execute(self): + if not self.data.get("start_last_workfile"): + self.log.info("It is set to not start last workfile on start.") + return + + last_workfile = self.data.get("last_workfile_path") + if not last_workfile: + self.log.warning("Last workfile was not collected.") + return + + if not os.path.exists(last_workfile): + self.log.info("Current context does not have any workfile yet.") + from_template = self.workfile_path(last_workfile) + if not from_template: + return + + # Add path to workfile to arguments + self.launch_context.launch_args.append(last_workfile) + + def workfile_path(self, last_workfile): + + project = self.data["project_name"] + + project_settings = get_project_settings(project) + + host_settings = project_settings[self.application.group.name] + + create_first_version = ( + host_settings + ["workfile_builder"] + ["create_first_version"] + ) + + if not create_first_version: + return False + + template_path = ( + host_settings + ["workfile_builder"] + ["template_path"] + [platform.system().lower()] + ) + + if template_path: + if not os.path.exists(template_path): + self.log.warning( + "Couldn't find workfile template file in {}".format( + template_path + ) + ) + return False + + self.log.info( + f"Creating workfile from template: \"{template_path}\"" + ) + + # Copy template workfile to new destinantion + shutil.copy2( + os.path.normpath(template_path), + os.path.normpath(last_workfile) + ) + + self.log.info(f"Workfile to open: \"{last_workfile}\"") + + return True \ No newline at end of file From ebcec9658d714cda63ba0aec7261736b1a208822 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 28 May 2021 18:32:51 +0200 Subject: [PATCH 17/44] Lib: adding function for getting custom template path to applicaitons --- openpype/lib/__init__.py | 4 +- openpype/lib/applications.py | 92 ++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index c97545fdf4..65974ba479 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -109,7 +109,8 @@ from .applications import ( get_app_environments_for_context, apply_project_environments_value, - compile_list_of_regexes + compile_list_of_regexes, + get_custom_workfile_template ) from .profiles_filtering import filter_profiles @@ -213,6 +214,7 @@ __all__ = [ "apply_project_environments_value", "compile_list_of_regexes", + "get_custom_workfile_template", "filter_profiles", diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index d82b7cd847..16af4c1b4c 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -1396,3 +1396,95 @@ def compile_list_of_regexes(in_list): " Expected string based object. Skipping." ).format(str(type(item)), str(item))) return regexes + + +def _get_basic_context_data_for_anatomy(env=None): + """ Prepare Task context for anatomy data. + Args: + env (dict): Initial environment variables. `os.environ` is used when + not passed. + + Returns: + dict: With Anatomy context data. + """ + from ..settings.lib import get_default_anatomy_settings + from avalon.api import AvalonMongoDB + env = env or dict(os.environ) + + default_anatomy_tasks = get_default_anatomy_settings()["tasks"] + project_name = env["AVALON_PROJECT"] + asset_name = env["AVALON_ASSET"] + task_name = env["AVALON_TASK"] + + # Avalon database connection + dbcon = AvalonMongoDB() + dbcon.Session["AVALON_PROJECT"] = project_name + dbcon.install() + + # Project document + project_doc = dbcon.find_one({"type": "project"}) + asset_doc = dbcon.find_one({ + "type": "asset", + "name": asset_name + }) + + # Discard avalon connection + dbcon.uninstall() + + # get relevant task type from asset doc + task_type = None + for task_t, task_n in asset_doc["data"]["tasks"].items(): + if task_name == task_n: + task_type = task_t + break + + assert task_type, ( + "Task type cannot be found in on asset `{}` " + "with given task name `{}`").format(asset_name, task_name) + + # get short name for task type defined in default anatomy settings + default_anatomy_task = default_anatomy_tasks[task_type] + assert default_anatomy_task, ( + "Something went wrong. Default anatomy tasks are not holding" + "requested task type: `{}`".format(task_type) + ) + + return { + "project": { + "name": project_doc["name"], + "code": project_doc["data"].get("code") + }, + "asset": asset_name, + "task": { + "name": task_name, + "type": task_type, + "sort_name": default_anatomy_task["short_name"] + } + } + + +def get_custom_workfile_template(custom_templates: list): + anatomy = Anatomy() + + # get project, asset, task anatomy context data + anatomy_context_data = _get_basic_context_data_for_anatomy() + # add root dict + anatomy_context_data.update(anatomy.roots()) + + # get task type for the task in context + test_task_type = anatomy_context_data["task"]["type"] + + # get path from matching profile + path = None + for templ in custom_templates: + for task_t in templ["task_types"]: + if task_t.lower() != test_task_type.lower(): + continue + path = templ["path"][platform.system().lower()] + + # when path is available try to format it in case + # there are some anatomy template strings + if path: + return path.format(**anatomy_context_data) + + return False From 8aefc5697ebf6f389bf3f87ddd662c4aace1514f Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 28 May 2021 18:33:25 +0200 Subject: [PATCH 18/44] Settings: adding schema for custom templates --- .../schemas/template_workfile_options.json | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json index 150f52113b..b3cc91d376 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json @@ -10,13 +10,36 @@ "label": "Create first workfile", "default": false }, - { - "type": "path", - "key": "template_path", - "label": "First workfile Template", - "multiplatform": true, - "multipath": false + "type": "list", + "key": "custom_templates", + "label": "Custom templates", + "is_group": true, + "use_label_wrap": true, + "object_type": { + "type": "dict", + "children": [ + { + "type": "task-types-enum", + "key": "task_types", + "label": "Task types" + }, + { + "type": "splitter" + }, + { + "type": "label", + "label": "Absolute path to workfile template or OpenPype Anatomy text is accepted." + }, + { + "type": "path", + "key": "path", + "label": "Path", + "multiplatform": true, + "multipath": false + } + ] + } }, { "type": "boolean", From edb88eb0053319c66dfa44214a02aaf50ffa7cf3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 28 May 2021 18:34:53 +0200 Subject: [PATCH 19/44] Nuke: adding custom template path feature --- openpype/hosts/nuke/api/lib.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index bbcdbd6cdf..223ae7abd9 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -1643,31 +1643,33 @@ def launch_workfiles_app(): def process_workfile_options(): - from openpype.lib import env_value_to_bool + from openpype.lib import ( + env_value_to_bool, + get_custom_workfile_template + ) # get state from settings - workfile_options = get_current_project_settings()["nuke"].get( - "workfile_options", {}) + workfile_builder = get_current_project_settings()["nuke"].get( + "workfile_builder", {}) # get all imortant settings openlv_on = env_value_to_bool( env_key="AVALON_OPEN_LAST_WORKFILE", default=None) - createfv_on = workfile_options.get( - "create_first_version", {}).get("enabled") - createfv_template_paths = workfile_options.get( - "create_first_version", {}).get("custom_template_paths") - createfv_builder = workfile_options.get( - "create_first_version", {}).get("builder_on") + # get settings + createfv_on = workfile_builder.get("create_first_version") or None + custom_templates = workfile_builder.get("custom_templates") or None + builder_on = workfile_builder.get("builder_on_start") or None last_workfile_path = os.environ.get("AVALON_LAST_WORKFILE") # generate first version in file not existing and feature is enabled if createfv_on and not os.path.exists(last_workfile_path): # get custom template path if any - custom_template_path = createfv_template_paths[ - platform.system().lower()] + custom_template_path = get_custom_workfile_template( + custom_templates + ) # if custom template is defined if custom_template_path: @@ -1678,7 +1680,7 @@ def process_workfile_options(): nuke.nodePaste(custom_template_path) # if builder at start is defined - if createfv_builder: + if builder_on: log.info("Building nodes from presets...") # build nodes by defined presets BuildWorkfile().process() From 8193a23a4c8303c7a4920a8258ad44df483d2a98 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 31 May 2021 11:08:29 +0200 Subject: [PATCH 20/44] settings: fix py2 compatibility --- openpype/lib/applications.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 16af4c1b4c..c55d876674 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -1463,7 +1463,7 @@ def _get_basic_context_data_for_anatomy(env=None): } -def get_custom_workfile_template(custom_templates: list): +def get_custom_workfile_template(custom_templates): anatomy = Anatomy() # get project, asset, task anatomy context data From 92070610d16bf10bb28effe4dae109b965f59e04 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 31 May 2021 11:48:05 +0200 Subject: [PATCH 21/44] Lib: fixing collection of roots and task type detection --- openpype/lib/applications.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index c55d876674..0abfc1bd45 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -1433,9 +1433,9 @@ def _get_basic_context_data_for_anatomy(env=None): # get relevant task type from asset doc task_type = None - for task_t, task_n in asset_doc["data"]["tasks"].items(): + for task_n, task_t in asset_doc["data"]["tasks"].items(): if task_name == task_n: - task_type = task_t + task_type = task_t["type"] break assert task_type, ( @@ -1469,7 +1469,7 @@ def get_custom_workfile_template(custom_templates): # get project, asset, task anatomy context data anatomy_context_data = _get_basic_context_data_for_anatomy() # add root dict - anatomy_context_data.update(anatomy.roots()) + anatomy_context_data.update({"root": anatomy.roots}) # get task type for the task in context test_task_type = anatomy_context_data["task"]["type"] From ef4e8dbcad8178c78f79fb35bed10c410a249f65 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 31 May 2021 13:32:47 +0200 Subject: [PATCH 22/44] Documentation: updating nuke project settings --- ...workfile_builder_create_first_workfile.png | Bin 0 -> 4836 bytes .../assets/nuke_workfile_builder_location.png | Bin 0 -> 4658 bytes .../assets/nuke_workfile_builder_profiles.png | Bin 0 -> 27333 bytes ...nuke_workfile_builder_template_anatomy.png | Bin 0 -> 12210 bytes ...ke_workfile_builder_template_task_type.png | Bin 0 -> 4951 bytes ...nuke_workfile_options_builder_profiles.png | Bin 22337 -> 0 bytes ..._workfile_options_create_first_version.png | Bin 6783 -> 0 bytes .../assets/nuke_workfile_options_location.png | Bin 4990 -> 0 bytes .../project_settings/settings_project_nuke.md | 43 +++++++++++------- 9 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_builder_location.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_builder_profiles.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png create mode 100644 website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png delete mode 100644 website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png delete mode 100644 website/docs/project_settings/assets/nuke_workfile_options_create_first_version.png delete mode 100644 website/docs/project_settings/assets/nuke_workfile_options_location.png diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png b/website/docs/project_settings/assets/nuke_workfile_builder_create_first_workfile.png new file mode 100644 index 0000000000000000000000000000000000000000..f138709a7fa1d1acff91e4b3a96cb1e620896724 GIT binary patch literal 4836 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 UzCGUs%9N0WDfn8ov1j6c0N6yKc>n+a literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_location.png b/website/docs/project_settings/assets/nuke_workfile_builder_location.png new file mode 100644 index 0000000000000000000000000000000000000000..916b79755d172ade7daf25fee29d6fef25e09c0f GIT binary patch literal 4658 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 Ndf4z#w)Ppn{{jUovx@)# literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png b/website/docs/project_settings/assets/nuke_workfile_builder_template_anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..195e884bfbe7493ccaea270f77d1c43a2f9527ef GIT binary patch literal 12210 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 literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png b/website/docs/project_settings/assets/nuke_workfile_builder_template_task_type.png new file mode 100644 index 0000000000000000000000000000000000000000..4c84f37c0e2602b2ca6381e8a2bbf993150043e9 GIT binary patch literal 4951 zcmb7Ic|4Ts-yV@ATTx;dDx$KbQDKHb))thqX31b=o3f5&EJLJ1rO28k$vQ_2$)HJ* zFvGDM%g7dE7|W1l%y0UgxA%{8&ij7O`Qusc&*!?o-}`y4?{$5j`$@1cGZx$j+y?*v z1Wip0t^oiXQ1(5Ymz#agwi!gTFC6~YjP(H(M5#IUfD55_MGpX|Oy=LYwU<5SyJKSO z4*&=?|2#Nak#Af90Feb#1HJ1gN7{&!w^S?o!(CYuR;?cE74LBMm6U!H2hF!iU*CFA zU*5a+z|j7+L0pt5(CqW@ql5d3Z-0)p)8d7j8XVLL_!d{LY{>TrD1`aImz!U1e`t># zkKw+fCxE)TFSmMYbr|L5Jxm&{qqBoJMw8w^g`FRd7w#YrMXo6~Wi&umDmGX%@dp8) zC>5}G!O44~#P>r1-A7P>{BAW=)%b3f+PMfWKpc?3xnB^&a|FmGtgFr|9p&*0rAG%C z#85cybN?Bjegd`Xxj7$*OSijGMFiToSsnYtZIW)u2t?DNMJr*-(T! z>`or#UjCF47>u|0v@=QOSPb_Ca3e0&RtJ7k5m$xXIgUZNJExWq{Eu0mLPf)s+-E)A zvj7<`?brz)o_LQAUfO_+X@oHXT_0IJ1n1KhE zb&Mw9gILL#4O>lA|J(O4E6!YLPT?F;iLj22ou{aP`oci>1WC_w_@h{%rxCO(Rm1{6 z`tZbbkeJ8oXdYz1)HsN{ONk4s5^Ch(o(IT?`#WC#j=01m0%z1!{XbKQ<{wM21RH%H z6#)$T{$t{QB~W`z8GVmds4YAHKXp)5;vPfYa1ScPjZfFnHKHa?|3>K()dt}Oai@pu z&Q-qaelWK6G~-M8xFm+>QCu`PlG@$QgY@>r9fBfKXGvV;jQU5JQCfD}{YTZUX3Eif zJTlmi?ZpO>3`|-Pex~JZaPVZN6+gBA+-OTVdKe4^eZ+m9>pwFjOyC6i7`USqk)qa+{3i&q6_`Ao_W^>Etn2qkf;8((!CY4F91P>i;wI0OlA7yY&WWO!l)8Ksd?r5Fug0ZMmy6dcCK z3SC$6jH{2>SYGd_bi1KEZ=2oX6{0&S7(xf+LjRSb)|63zF7?0Tp#VvkgrEEug#RIB zWa*4m-%KCX)89=8DwM0nErPeNU7AW|xY+7jI)|v>uh33$A%om9NrF*uXF{oBsEf

@23ur%SK%^3W`g6_z)z&?d7#?W%B@&*4eVd zXh09``19_?_Jqt=THPm;0pB~nG{zxZCQ?w(_T?m5=%BK{Noe_|Q>K5^4oZN@oEAeL zFte)U2iL$*vRI6@dUH=}@6{Djo+TYKd%K%z%6nlF@Ltk{J}|g`G#~8-J9it{sGC9y%80L|h(Tny*11Y3N$l z1Iila;L@Ij6MNox%V7qbq6g>zf#aBgLj+Evy??gQUrPFm$D;YA0qTN(2mfwQcW+{9 z%C4=S26&(USLL-IU*b+I0mDKKwIe6Xv&aTe(g0gCmGcSCvas+VUw*` zTuY9QwQt>0SK-5Qv{P6~D&@JhN>r$z5(;OuG~%adlK%D<^(2%_Slo_N(9xmWYwuKk zhGyDl6L*)P7wOrWseNsj>DEA~o6Ow6*cnm08)HqdVN`Lxqp-MN&0jC;8h9?WZL{;> zOLHy7KC);3MxLw$kkf+rA*Pn`-L1Cjw)4ol?}4W}=>a3YH#@#r?uYsdEWL2RSfg$> zIEbAA8Sxb}akgm`j^~0*0aCJ_icrEB1~K}U8-b$ToqeIrty6SnmM5gVL=whOARHD6@3=cit^(YgGSn#?>Xv0_2aj#4*x({C3Pb{zF2^%3*`># zVyx4;XkH#6LyT+BV~SuR1u!AYwRa#qjLNe z0)(wy{Ipxl>>ZLG&z0otwrm7pGj=_jn`G~9d_ed11rQYQ2J=r{`@bUoe@nqED??2m zDa`pHNS58u|58SOSV@n3+2A7aFpi+U&(k@1`VL33a@KfY>SOBWizC!e z7m1@neVI+m z#MT@*!(SbVy2or*mdgnO>{4eVbb=qrAF(QUNE!O&a%^*oZ83hf^V?V9wMbS6iJLRG z?VXS=2y4yYtkhRv^W>Ib8O`oZ=Rh|E#umPcC7pF%5&AZr9DbcStGeTIS}Nv9)kT<9 z(3@C%h;!@w@~H6MCfE^IId_!kL&VdQ8O=++C4)W7`TMoD$=I6)%(2uw~Sb{W8G>^V-ZD@N;~yb zB8SUltWs(FBTG1PbKw4=xZxU}rG6UZ-U6fKgg{Qnh*0N8*D$mwu%QB^0Ll@nYUmOm z!47ZOEQUNvG%wu?dA#)^+J~Q{30bsCgrRJ*>t`DSQ03>oWTr+ks$3)VidAVJ$AGY@~91dBiqf2D&7^b@TU01lbkacPOXIQCQbnRuZ~V zgJV{BD563`jCfl3a&Y4x?d>7ni=i{(X3qjB-i{X8tHf7?)zqP@TozwVxUeA)+~aoz zgg*owLoq3x2gz`@b;^V|}H0z80!g-6X&p1?g z4z{2TGMw*#1lShsDqmz)tUbwtf&T=VeDNvkSkQ-ygD!~Tw>PA(7m<{TNlhqQG;=s} zerb$ZxwQ-1wP>hrEY7jr!H0TpSrTYpzt1+RNll%F_`;3HEx62G)@oVd_R5jV?VfWa z)e`d#?E>i$ma(UcpAoa|TL`0&fqa9*HdHt=`-6Ll+cNtW3rw=N8-oWNajYlCeci71 z>OGB|#(je^@x9uR4J}eOKGz3kRC%kBC<(&DE~|X?LNaw7hJTb&-XUk&dgikunZdYf zKQ#?sYHOpg++hN0g_AK+ADo-F7)iMmI5qez^as6w=xNcN0>MXgB$3YV@~J zBbhbB;gj_QwQ`y5)JQ#jR!TQ?<>n9xL{LP&z^=A%oBN(^CpPLgt|TH$iVp9pYxHB$ zqWB3tdZ;noQyzKj3)M5P^3?9`s7&eh`a*Cj!+)F$iSpJ&C5Kx%ykD^mJfeQ?8?R%h zD>oY)+fwq5{`>o_we;C6H|9w2cYTeWdztfWRrz4EJIi~{8>^Pq`rfpPzW{%t2!isF z*X#9V z51(Q0IOY~q_-}eB@r}*#hpx{Wwx>(j!HGet#jDn9TIm)B5Gm@1Dpd&CDRh03=JV7a z=975oT@hwhv0G4CxSaM_(?;i0sKvfjo^ zyfkv%{;7nymDrBs=EL?*s4@m>H!&#ocb{^bVfc-jb`>Fs6rUPK(EEvtdsQ7HexbA>HNWsgUVs}VP(WcjqVu#!)PSv(=lJp1b=pl{qNoSUt5EjD;W&^1RlidI zd6H&w*bs4?dm5AW<>M{V(+)p~z&boqNwDb9F+`aw{Xx?7Z|i+NlB+hv&YaJ7v!1DS zTC8SYhh%Ms($I#dY7d$_H&$m*5kU8zQz|yF@T-#ZYMDh^U!aeWhaV79Say2B z>v;o=gREv1yvB_NE5?9ZZRwjQgp_fo=T39`5+#niqtY6;(&pEOW`FTdy!TjVd8`+L zJ{E}DiTtdTtrF*0;^Bo=_53frRk2#lml}f{n=i=(3puw&4)%E6 zNCHu zo^`wmk5PzBH;Ax>sav&l$}kOR?^JhYBerl$7WA&m)0p_jNduc=F}=t{!JNlUmyb1- z$pEQSwBTLC?2ttg25tvi*N&ijYz=7WvkJPU>ZJ!?>R7M;w4_z6e;rdDT$w*G2F&j! zh_0lWPNgv}z;){S@S8~3)t7T3kn%-zG7a)7NeWV|uhhITP_(||(Y&bJ>j_PSxTWL5yQoD22bQ9urX4)7`yX3AA zvB33*-{tZCT>MJw%McYN^F~7QPHN1r5SlvEjc_|d*hb>S9q*Oc_sFtgr}h@QLoz=e5Q)quRxkB1-;Hrk=z5?o&gTa4CwIsMUl zP(t#xwXNot3z4qQ)&J*qgG-n$1@*gpB}YSI$A&XblE8Te5)6AK|5Br{WgT=K5_Dr* z_Mo^ByTe^J%f1%YBFxo#`e)9^WSjJ%do8C=t-oRM_)Ch&)|j%+uz!XDObyKpD)gN( F{{as|Z>azP literal 0 HcmV?d00001 diff --git a/website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png b/website/docs/project_settings/assets/nuke_workfile_options_builder_profiles.png deleted file mode 100644 index 3813554b6e8de7f6494cff7b9c53428c5bfe8854..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22337 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 diff --git a/website/docs/project_settings/assets/nuke_workfile_options_create_first_version.png b/website/docs/project_settings/assets/nuke_workfile_options_create_first_version.png deleted file mode 100644 index 024352d00b8922907c4c5fd501d8cae1398d1ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6783 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 diff --git a/website/docs/project_settings/assets/nuke_workfile_options_location.png b/website/docs/project_settings/assets/nuke_workfile_options_location.png deleted file mode 100644 index 9c7c9b644c67dbe356d1a0b428d0c91fa3f89a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4990 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 Bu1Np@ diff --git a/website/docs/project_settings/settings_project_nuke.md b/website/docs/project_settings/settings_project_nuke.md index ffdeb1e265..561311317f 100644 --- a/website/docs/project_settings/settings_project_nuke.md +++ b/website/docs/project_settings/settings_project_nuke.md @@ -13,36 +13,45 @@ Project settings can have project specific values. Each new project is using stu Projects always use default project values unless they have [project override](../admin_settings#project-overrides) (orage colour). Any changes in default project may affect all existing projects. ::: -## Workfile Options +## Workfile Builder -All workfile related settings can be found here. This is a list of available features: -- Create First Version -- Add Custom Template Path -- Use Builder Profiles At Start +All Workfile Builder related settings can be found here. This is a list of available features: +- Create first workfile +- Custom Template path (task type filtered) +- Run Builder profiles at first run - Define Builder Profiles With Filters -![nuke_workfile_options_location](assets/nuke_workfile_options_location.png) +![nuke_workfile_options_location](assets/nuke_workfile_builder_location.png) :::important Auto Load Last Version In case you want to set the auto load of the latest available version of workfiles, you can do it from [here](settings_project_global#open-last-workfile-at-launch). ::: -### Create First Version +### Create first workfile -By switchintg this featore on, OpenPype will generate first version. Following attributes are possible to configure: +By switchintg this feature on, OpenPype will generate initial workfile version. Following attributes are possible to configure: -![nuke_workfile_options_create_first_version](assets/nuke_workfile_options_create_first_version.png) +![nuke_workfile_options_create_first_version](assets/nuke_workfile_builder_create_first_workfile.png) -#### Use buildin template (if available) -Not applycable in Nuke and can be ignored +#### Custom templates +Custom templates are added into nuke's node graph as nodes. List of task types can be defined for templates filtering. -#### Custom template path -Any path to nukescript. Nodes inside the script will be added into node graph at build time. +- Task types are sourced from project related Anatomy/Task Types -#### Use Builder profiles at start -Enabling this feature will look into available Builder Prorfiles (look bellow for more informations about this feature) and load available versions into node graph. +![nuke_workfile_builder_template_task_type](assets/nuke_workfile_builder_template_task_type.png) -### Builder Profiles + - multi platform path can be used in a variety of ways. Along the absolut path to a template file also an python formating could be used. At the moment these keys are supported (image example bellow): + - `root[key]`: definitions from anatomy roots + - `project[name, code]`: project in context + - `asset`: name of asset/shot in context + - `task[type, name, short_name]`: as they are defined on asset/shot and in **Anatomy/Task Type** on project context + +![nuke_workfile_builder_template_anatomy](assets/nuke_workfile_builder_template_anatomy.png) + +#### Run Builder profiles on first launch +Enabling this feature will look into available Builder's Prorfiles (look bellow for more informations about this feature) and load available versions into node graph. + +### Profiles (Builder) Builder profiles are set of rules allowing artist Load any available versions for the context of the asset, which it is run from. Preset is having following attributes: - **Filter**: Each profile could be defined with task filter. In case no filter is defined, a profile will be working for all. @@ -51,4 +60,4 @@ Builder profiles are set of rules allowing artist Load any available versions fo - **Linked Assets/Shots**: filters for asset builds to be added -![nuke_workfile_options_builder_profiles](assets/nuke_workfile_options_builder_profiles.png) +![nuke_workfile_builder_profiles](assets/nuke_workfile_builder_profiles.png) From c4bea1c9ed60498a7649962e0f5ca9e61763bce7 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 1 Jun 2021 10:52:18 +0200 Subject: [PATCH 23/44] Nuke: adding defaults to settings Workfile builder --- .../defaults/project_settings/nuke.json | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json index a15c8f7838..13e1924b36 100644 --- a/openpype/settings/defaults/project_settings/nuke.json +++ b/openpype/settings/defaults/project_settings/nuke.json @@ -147,13 +147,32 @@ }, "workfile_builder": { "create_first_version": false, - "template_path": { - "windows": "", - "darwin": "", - "linux": "" - }, + "custom_templates": [], "builder_on_start": false, - "profiles": [] + "profiles": [ + { + "tasks": [], + "current_context": [ + { + "subset_name_filters": [], + "families": [ + "render", + "plate" + ], + "repre_names": [ + "exr", + "dpx", + "mov" + ], + "loaders": [ + "LoadSequence", + "LoadMov" + ] + } + ], + "linked_assets": [] + } + ] }, "filters": {} } \ No newline at end of file From a3eae1cd153146aa6897e42faf42aff7946c6ff5 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 1 Jun 2021 10:52:35 +0200 Subject: [PATCH 24/44] Nuke: rename back to builder --- openpype/hosts/nuke/api/__init__.py | 2 +- openpype/hosts/nuke/api/lib.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/nuke/api/__init__.py b/openpype/hosts/nuke/api/__init__.py index bb60465e23..e6dab5cfc9 100644 --- a/openpype/hosts/nuke/api/__init__.py +++ b/openpype/hosts/nuke/api/__init__.py @@ -80,7 +80,7 @@ def install(): # Set context settings. nuke.addOnCreate(workfile_settings.set_context_settings, nodeClass="Root") nuke.addOnCreate(workfile_settings.set_favorites, nodeClass="Root") - nuke.addOnCreate(lib.process_workfile_options, nodeClass="Root") + nuke.addOnCreate(lib.process_workfile_builder, nodeClass="Root") nuke.addOnCreate(lib.launch_workfiles_app, nodeClass="Root") menu.install() diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 223ae7abd9..ede1c7f59f 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -1642,7 +1642,7 @@ def launch_workfiles_app(): workfiles.show(os.environ["AVALON_WORKDIR"]) -def process_workfile_options(): +def process_workfile_builder(): from openpype.lib import ( env_value_to_bool, get_custom_workfile_template @@ -1697,7 +1697,7 @@ def process_workfile_options(): return # to avoid looping of the callback, remove it! - nuke.removeOnCreate(process_workfile_options, nodeClass="Root") + nuke.removeOnCreate(process_workfile_builder, nodeClass="Root") log.info("Opening last workfile...") # open workfile From 02eaeb552e2a124ae27af3e67c4d02ec32ad6ea1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 1 Jun 2021 10:52:57 +0200 Subject: [PATCH 25/44] Lib: fixing Builder exception --- openpype/lib/avalon_context.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index ac5f4555c4..16bf7758be 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -759,18 +759,11 @@ class BuildWorkfile: # for backward compatibility this has to have exception # if the concept will be agreed then this needs to be # refactored without exception - if "nuke" in host_name: - build_presets = ( - presets.get(host_name, {}) - .get("workfile_options") - .get("builder_profiles") - ) - else: - build_presets = ( - presets.get(host_name, {}) - .get("workfile_build") - .get("profiles") - ) + build_presets = ( + presets.get(host_name, {}) + .get("workfile_build" or "workfile_builder") + .get("profiles") + ) if not build_presets: return From cf1e90aeaa13a9787dee4e55e65d1fafe0148a1a Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 1 Jun 2021 11:17:37 +0200 Subject: [PATCH 26/44] Lib: improving exception --- openpype/lib/avalon_context.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 16bf7758be..80744cf1f5 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -755,22 +755,22 @@ class BuildWorkfile: """ host_name = avalon.api.registered_host().__name__.rsplit(".", 1)[-1] presets = get_project_settings(avalon.io.Session["AVALON_PROJECT"]) - # Get presets for host - # for backward compatibility this has to have exception - # if the concept will be agreed then this needs to be - # refactored without exception - build_presets = ( - presets.get(host_name, {}) - .get("workfile_build" or "workfile_builder") - .get("profiles") - ) - if not build_presets: + # Get presets for host + wb_settings = presets.get(host_name, {}).get("workfile_builder") + + if not wb_settings: + # backward compatibility + wb_settings = presets.get(host_name, {}).get("workfile_build") + + builder_presets = wb_settings.get("profiles") + + if not builder_presets: return task_name_low = task_name.lower() per_task_preset = None - for preset in build_presets: + for preset in builder_presets: preset_tasks = preset.get("tasks") or [] preset_tasks_low = [task.lower() for task in preset_tasks] if task_name_low in preset_tasks_low: From 35f3c7ff804b6edeb0b107f8fcfefe90b438d58b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 1 Jun 2021 11:17:59 +0200 Subject: [PATCH 27/44] Nuke: adding exception for missing template --- openpype/hosts/nuke/api/lib.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index ede1c7f59f..3c41574dbf 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -1676,8 +1676,14 @@ def process_workfile_builder(): log.info("Adding nodes from `{}`...".format( custom_template_path )) - # import nodes into current script - nuke.nodePaste(custom_template_path) + try: + # import nodes into current script + nuke.nodePaste(custom_template_path) + except RuntimeError: + raise RuntimeError(( + "Template defined for project: {} is not working. " + "Talk to your manager for an advise").format( + custom_template_path)) # if builder at start is defined if builder_on: From 455d0684d48f50a77c7c5db7e82641d97b24ae77 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:36:30 +0200 Subject: [PATCH 28/44] moved workfile template functions to avalon_context --- openpype/lib/__init__.py | 2 + openpype/lib/applications.py | 92 ---------------------------------- openpype/lib/avalon_context.py | 92 ++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 92 deletions(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index 65974ba479..6ed974bfb0 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -81,6 +81,8 @@ from .avalon_context import ( get_creator_by_name, + get_custom_workfile_template, + change_timer_to_current_context ) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 0abfc1bd45..d82b7cd847 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -1396,95 +1396,3 @@ def compile_list_of_regexes(in_list): " Expected string based object. Skipping." ).format(str(type(item)), str(item))) return regexes - - -def _get_basic_context_data_for_anatomy(env=None): - """ Prepare Task context for anatomy data. - Args: - env (dict): Initial environment variables. `os.environ` is used when - not passed. - - Returns: - dict: With Anatomy context data. - """ - from ..settings.lib import get_default_anatomy_settings - from avalon.api import AvalonMongoDB - env = env or dict(os.environ) - - default_anatomy_tasks = get_default_anatomy_settings()["tasks"] - project_name = env["AVALON_PROJECT"] - asset_name = env["AVALON_ASSET"] - task_name = env["AVALON_TASK"] - - # Avalon database connection - dbcon = AvalonMongoDB() - dbcon.Session["AVALON_PROJECT"] = project_name - dbcon.install() - - # Project document - project_doc = dbcon.find_one({"type": "project"}) - asset_doc = dbcon.find_one({ - "type": "asset", - "name": asset_name - }) - - # Discard avalon connection - dbcon.uninstall() - - # get relevant task type from asset doc - task_type = None - for task_n, task_t in asset_doc["data"]["tasks"].items(): - if task_name == task_n: - task_type = task_t["type"] - break - - assert task_type, ( - "Task type cannot be found in on asset `{}` " - "with given task name `{}`").format(asset_name, task_name) - - # get short name for task type defined in default anatomy settings - default_anatomy_task = default_anatomy_tasks[task_type] - assert default_anatomy_task, ( - "Something went wrong. Default anatomy tasks are not holding" - "requested task type: `{}`".format(task_type) - ) - - return { - "project": { - "name": project_doc["name"], - "code": project_doc["data"].get("code") - }, - "asset": asset_name, - "task": { - "name": task_name, - "type": task_type, - "sort_name": default_anatomy_task["short_name"] - } - } - - -def get_custom_workfile_template(custom_templates): - anatomy = Anatomy() - - # get project, asset, task anatomy context data - anatomy_context_data = _get_basic_context_data_for_anatomy() - # add root dict - anatomy_context_data.update({"root": anatomy.roots}) - - # get task type for the task in context - test_task_type = anatomy_context_data["task"]["type"] - - # get path from matching profile - path = None - for templ in custom_templates: - for task_t in templ["task_types"]: - if task_t.lower() != test_task_type.lower(): - continue - path = templ["path"][platform.system().lower()] - - # when path is available try to format it in case - # there are some anatomy template strings - if path: - return path.format(**anatomy_context_data) - - return False diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 80744cf1f5..cb7ed41840 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1270,3 +1270,95 @@ def change_timer_to_current_context(): } requests.post(rest_api_url, json=data) + + +def _get_basic_context_data_for_anatomy(env=None): + """ Prepare Task context for anatomy data. + Args: + env (dict): Initial environment variables. `os.environ` is used when + not passed. + + Returns: + dict: With Anatomy context data. + """ + from ..settings.lib import get_default_anatomy_settings + from avalon.api import AvalonMongoDB + env = env or dict(os.environ) + + default_anatomy_tasks = get_default_anatomy_settings()["tasks"] + project_name = env["AVALON_PROJECT"] + asset_name = env["AVALON_ASSET"] + task_name = env["AVALON_TASK"] + + # Avalon database connection + dbcon = AvalonMongoDB() + dbcon.Session["AVALON_PROJECT"] = project_name + dbcon.install() + + # Project document + project_doc = dbcon.find_one({"type": "project"}) + asset_doc = dbcon.find_one({ + "type": "asset", + "name": asset_name + }) + + # Discard avalon connection + dbcon.uninstall() + + # get relevant task type from asset doc + task_type = None + for task_n, task_t in asset_doc["data"]["tasks"].items(): + if task_name == task_n: + task_type = task_t["type"] + break + + assert task_type, ( + "Task type cannot be found in on asset `{}` " + "with given task name `{}`").format(asset_name, task_name) + + # get short name for task type defined in default anatomy settings + default_anatomy_task = default_anatomy_tasks[task_type] + assert default_anatomy_task, ( + "Something went wrong. Default anatomy tasks are not holding" + "requested task type: `{}`".format(task_type) + ) + + return { + "project": { + "name": project_doc["name"], + "code": project_doc["data"].get("code") + }, + "asset": asset_name, + "task": { + "name": task_name, + "type": task_type, + "sort_name": default_anatomy_task["short_name"] + } + } + + +def get_custom_workfile_template(custom_templates): + anatomy = Anatomy() + + # get project, asset, task anatomy context data + anatomy_context_data = _get_basic_context_data_for_anatomy() + # add root dict + anatomy_context_data.update({"root": anatomy.roots}) + + # get task type for the task in context + test_task_type = anatomy_context_data["task"]["type"] + + # get path from matching profile + path = None + for templ in custom_templates: + for task_t in templ["task_types"]: + if task_t.lower() != test_task_type.lower(): + continue + path = templ["path"][platform.system().lower()] + + # when path is available try to format it in case + # there are some anatomy template strings + if path: + return path.format(**anatomy_context_data) + + return False From 9acd22eafc89ad0f631235c4d808021f6b4b3166 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:46:00 +0200 Subject: [PATCH 29/44] added _get_task_context_data_for_anatomy function to get contet data which expect already prepared documents --- openpype/lib/avalon_context.py | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index cb7ed41840..c660f30209 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -3,6 +3,7 @@ import os import json import re import copy +import platform import logging import collections import functools @@ -1272,6 +1273,62 @@ def change_timer_to_current_context(): requests.post(rest_api_url, json=data) +def _get_task_context_data_for_anatomy( + project_doc, asset_doc, task_name, anatomy=None +): + """Prepare Task context for anatomy data. + + WARNING: this data structure is currently used only in workfile templates. + Key "task" is currently in rest of pipeline used as string with task + name. + + Args: + project_doc (dict): Project document with available "name" and + "data.code" keys. + asset_doc (dict): Asset document from MongoDB. + task_name (str): Name of context task. + anatomy (Anatomy): Optionally Anatomy for passed project name can be + passed as Anatomy creation may be slow. + + Returns: + dict: With Anatomy context data. + """ + + if anatomy is None: + anatomy = Anatomy(project_doc["name"]) + + asset_name = asset_doc["name"] + project_task_types = anatomy["tasks"] + + # get relevant task type from asset doc + task_type = asset_doc["data"]["tasks"].get(task_name) + + assert task_type, ( + "Task type cannot be found in on asset `{}` " + "with given task name `{}`" + ).format(asset_name, task_name) + + # get short name for task type defined in default anatomy settings + task_type_data = project_task_types.get(task_type) + assert task_type_data, ( + "Something went wrong. Default anatomy tasks are not holding" + "requested task type: `{}`".format(task_type) + ) + + return { + "project": { + "name": project_doc["name"], + "code": project_doc["data"].get("code") + }, + "asset": asset_name, + "task": { + "name": task_name, + "type": task_type, + "short": task_type_data["short_name"] + } + } + + def _get_basic_context_data_for_anatomy(env=None): """ Prepare Task context for anatomy data. Args: From 357aec4e1306302bc9a0de4626f5b9d3c2c47e7a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:46:37 +0200 Subject: [PATCH 30/44] implemented get_workfile_template_by_context which filters and fill template for passed context as documents --- openpype/lib/avalon_context.py | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index c660f30209..c69542d8cf 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1329,6 +1329,58 @@ def _get_task_context_data_for_anatomy( } +def get_workfile_template_by_context( + template_profiles, project_doc, asset_doc, task_name, anatomy=None +): + """Filter and fill workfile template profiles by passed context. + + It is expected that passed argument are already queried documents of + project and asset as parents of processing task name. + + Existence of formatted path is not validated. + + Args: + template_profiles(list): Template profiles from settings. + project_doc(dict): Project document from MongoDB. + asset_doc(dict): Asset document from MongoDB. + task_name(str): Name of task for which templates are filtered. + anatomy(Anatomy): Optionally passed anatomy object for passed project + name. + + Returns: + str: Path to template or None if none of profiles match current + context. (Existence of formatted path is not validated.) + """ + + from openpype.lib import filter_profiles + + if anatomy is None: + anatomy = Anatomy(project_doc["name"]) + + # get project, asset, task anatomy context data + anatomy_context_data = _get_task_context_data_for_anatomy( + project_doc, asset_doc, task_name, anatomy + ) + # add root dict + anatomy_context_data["root"] = anatomy.roots + + # get task type for the task in context + current_task_type = anatomy_context_data["task"]["type"] + + # get path from matching profile + matching_item = filter_profiles( + template_profiles, + {"task_type": current_task_type} + ) + # when path is available try to format it in case + # there are some anatomy template strings + if matching_item: + template = matching_item["path"][platform.system().lower()] + return template.format(**anatomy_context_data) + + return None + + def _get_basic_context_data_for_anatomy(env=None): """ Prepare Task context for anatomy data. Args: From 058c2844d6f90d52f1a474cef642c354eb9c0e4a Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:47:20 +0200 Subject: [PATCH 31/44] added get_workfile_template_by_string_context as helper whic prepares documents for get_workfile_template_by_context --- openpype/lib/avalon_context.py | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index c69542d8cf..af4237f11e 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1381,6 +1381,66 @@ def get_workfile_template_by_context( return None +def get_workfile_template_by_string_context( + template_profiles, project_name, asset_name, task_name, + dbcon=None, anatomy=None +): + """Filter and fill workfile template profiles by passed context. + + Passed context are string representations of project, asset and task. + Function will query documents of project and asset to be able use + `get_workfile_template_by_context` for rest of logic. + + Args: + template_profiles(list): Loaded workfile template profiles. + project_name(str): Project name. + asset_name(str): Asset name. + task_name(str): Task name. + dbcon(AvalonMongoDB): Optional avalon implementation of mongo + connection with context Session. + anatomy(Anatomy): Optionally prepared anatomy object for passed + project. + + Returns: + str: Path to template or None if none of profiles match current + context. (Existence of formatted path is not validated.) + """ + + if dbcon is None: + from avalon.api import AvalonMongoDB + + dbcon = AvalonMongoDB() + + dbcon.install() + + if dbcon.Session["AVALON_PROJECT"] != project_name: + dbcon.Session["AVALON_PROJECT"] = project_name + + project_doc = dbcon.find_one( + {"type": "project"}, + # All we need is "name" and "data.code" keys + { + "name": 1, + "data.code": 1 + } + ) + asset_doc = dbcon.find_one( + { + "type": "asset", + "name": asset_name + }, + # All we need is "name" and "data.tasks" keys + { + "name": 1, + "data.tasks": 1 + } + ) + + return get_workfile_template_by_context( + template_profiles, project_doc, asset_doc, task_name, anatomy + ) + + def _get_basic_context_data_for_anatomy(env=None): """ Prepare Task context for anatomy data. Args: From bf2692dd1bf69fe1891ec570a3b042162a0f8476 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:47:51 +0200 Subject: [PATCH 32/44] implemented get_workfile_templates which simply use current context from `avalon.io` to filter and fill workfile template profiles --- openpype/lib/avalon_context.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index af4237f11e..8253433dff 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1441,6 +1441,31 @@ def get_workfile_template_by_string_context( ) +def get_workfile_templates(template_profiles): + """Filter and fill workfile template profiles by current context. + + Current context is defined by `avalon.api.Session`. That's why this + function should be used only inside host where context is set and stable. + + Args: + template_profiles(list): Template profiles from settings. + + Returns: + str: Path to template or None if none of profiles match current + context. (Existence of formatted path is not validated.) + """ + # Use `avalon.io` as Mongo connection + from avalon import io + + return get_workfile_template_by_string_context( + template_profiles, + io.Session["AVALON_PROJECT"], + io.Session["AVALON_ASSET"], + io.Session["AVALON_TASK"], + io + ) + + def _get_basic_context_data_for_anatomy(env=None): """ Prepare Task context for anatomy data. Args: From a4f96819754720fb654b0875729867646865772c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 14:51:49 +0200 Subject: [PATCH 33/44] added new functions to openpype.lib --- openpype/lib/__init__.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index 6ed974bfb0..f62cbaa161 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -83,7 +83,11 @@ from .avalon_context import ( get_custom_workfile_template, - change_timer_to_current_context + change_timer_to_current_context, + + get_workfile_template_by_context, + get_workfile_template_by_string_context, + get_workfile_templates ) from .local_settings import ( @@ -195,6 +199,10 @@ __all__ = [ "change_timer_to_current_context", + "get_workfile_template_by_context", + "get_workfile_template_by_string_context", + "get_workfile_templates", + "IniSettingRegistry", "JSONSettingRegistry", "OpenPypeSecureRegistry", From 7f6563d9f14e586f9ef24d2d8401431fab316752 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 15:00:35 +0200 Subject: [PATCH 34/44] replaced previous implementation of get_custom_workfile_templates --- openpype/lib/__init__.py | 13 ++--- openpype/lib/avalon_context.py | 104 ++------------------------------- 2 files changed, 11 insertions(+), 106 deletions(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index f62cbaa161..a78e26205b 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -85,9 +85,8 @@ from .avalon_context import ( change_timer_to_current_context, - get_workfile_template_by_context, - get_workfile_template_by_string_context, - get_workfile_templates + get_custom_workfile_template_by_context, + get_custom_workfile_template ) from .local_settings import ( @@ -115,8 +114,7 @@ from .applications import ( get_app_environments_for_context, apply_project_environments_value, - compile_list_of_regexes, - get_custom_workfile_template + compile_list_of_regexes ) from .profiles_filtering import filter_profiles @@ -199,9 +197,8 @@ __all__ = [ "change_timer_to_current_context", - "get_workfile_template_by_context", - "get_workfile_template_by_string_context", - "get_workfile_templates", + "get_custom_workfile_template_by_context", + "get_custom_workfile_template", "IniSettingRegistry", "JSONSettingRegistry", diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 8253433dff..35ca6cd779 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1329,7 +1329,7 @@ def _get_task_context_data_for_anatomy( } -def get_workfile_template_by_context( +def get_custom_workfile_template_by_context( template_profiles, project_doc, asset_doc, task_name, anatomy=None ): """Filter and fill workfile template profiles by passed context. @@ -1381,7 +1381,7 @@ def get_workfile_template_by_context( return None -def get_workfile_template_by_string_context( +def get_custom_workfile_templates_by_string_context( template_profiles, project_name, asset_name, task_name, dbcon=None, anatomy=None ): @@ -1389,7 +1389,7 @@ def get_workfile_template_by_string_context( Passed context are string representations of project, asset and task. Function will query documents of project and asset to be able use - `get_workfile_template_by_context` for rest of logic. + `get_custom_workfile_template_by_context` for rest of logic. Args: template_profiles(list): Loaded workfile template profiles. @@ -1436,12 +1436,12 @@ def get_workfile_template_by_string_context( } ) - return get_workfile_template_by_context( + return get_custom_workfile_template_by_context( template_profiles, project_doc, asset_doc, task_name, anatomy ) -def get_workfile_templates(template_profiles): +def get_custom_workfile_templates(template_profiles): """Filter and fill workfile template profiles by current context. Current context is defined by `avalon.api.Session`. That's why this @@ -1457,102 +1457,10 @@ def get_workfile_templates(template_profiles): # Use `avalon.io` as Mongo connection from avalon import io - return get_workfile_template_by_string_context( + return get_custom_workfile_templates_by_string_context( template_profiles, io.Session["AVALON_PROJECT"], io.Session["AVALON_ASSET"], io.Session["AVALON_TASK"], io ) - - -def _get_basic_context_data_for_anatomy(env=None): - """ Prepare Task context for anatomy data. - Args: - env (dict): Initial environment variables. `os.environ` is used when - not passed. - - Returns: - dict: With Anatomy context data. - """ - from ..settings.lib import get_default_anatomy_settings - from avalon.api import AvalonMongoDB - env = env or dict(os.environ) - - default_anatomy_tasks = get_default_anatomy_settings()["tasks"] - project_name = env["AVALON_PROJECT"] - asset_name = env["AVALON_ASSET"] - task_name = env["AVALON_TASK"] - - # Avalon database connection - dbcon = AvalonMongoDB() - dbcon.Session["AVALON_PROJECT"] = project_name - dbcon.install() - - # Project document - project_doc = dbcon.find_one({"type": "project"}) - asset_doc = dbcon.find_one({ - "type": "asset", - "name": asset_name - }) - - # Discard avalon connection - dbcon.uninstall() - - # get relevant task type from asset doc - task_type = None - for task_n, task_t in asset_doc["data"]["tasks"].items(): - if task_name == task_n: - task_type = task_t["type"] - break - - assert task_type, ( - "Task type cannot be found in on asset `{}` " - "with given task name `{}`").format(asset_name, task_name) - - # get short name for task type defined in default anatomy settings - default_anatomy_task = default_anatomy_tasks[task_type] - assert default_anatomy_task, ( - "Something went wrong. Default anatomy tasks are not holding" - "requested task type: `{}`".format(task_type) - ) - - return { - "project": { - "name": project_doc["name"], - "code": project_doc["data"].get("code") - }, - "asset": asset_name, - "task": { - "name": task_name, - "type": task_type, - "sort_name": default_anatomy_task["short_name"] - } - } - - -def get_custom_workfile_template(custom_templates): - anatomy = Anatomy() - - # get project, asset, task anatomy context data - anatomy_context_data = _get_basic_context_data_for_anatomy() - # add root dict - anatomy_context_data.update({"root": anatomy.roots}) - - # get task type for the task in context - test_task_type = anatomy_context_data["task"]["type"] - - # get path from matching profile - path = None - for templ in custom_templates: - for task_t in templ["task_types"]: - if task_t.lower() != test_task_type.lower(): - continue - path = templ["path"][platform.system().lower()] - - # when path is available try to format it in case - # there are some anatomy template strings - if path: - return path.format(**anatomy_context_data) - - return False From d1402ce8374fac5a9db03b13a4396e7fb9441e4d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 15:02:17 +0200 Subject: [PATCH 35/44] typo fixes --- openpype/lib/avalon_context.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 35ca6cd779..c85429b049 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1381,7 +1381,7 @@ def get_custom_workfile_template_by_context( return None -def get_custom_workfile_templates_by_string_context( +def get_custom_workfile_template_by_string_context( template_profiles, project_name, asset_name, task_name, dbcon=None, anatomy=None ): @@ -1441,7 +1441,7 @@ def get_custom_workfile_templates_by_string_context( ) -def get_custom_workfile_templates(template_profiles): +def get_custom_workfile_template(template_profiles): """Filter and fill workfile template profiles by current context. Current context is defined by `avalon.api.Session`. That's why this @@ -1457,7 +1457,7 @@ def get_custom_workfile_templates(template_profiles): # Use `avalon.io` as Mongo connection from avalon import io - return get_custom_workfile_templates_by_string_context( + return get_custom_workfile_template_by_string_context( template_profiles, io.Session["AVALON_PROJECT"], io.Session["AVALON_ASSET"], From e1172db872eef47900465b8eac617a76a87b6a46 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 15:16:39 +0200 Subject: [PATCH 36/44] fixed _get_task_context_data_for_anatomy --- openpype/lib/avalon_context.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index c85429b049..c4217cc6d5 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -1301,16 +1301,21 @@ def _get_task_context_data_for_anatomy( project_task_types = anatomy["tasks"] # get relevant task type from asset doc - task_type = asset_doc["data"]["tasks"].get(task_name) + assert task_name in asset_doc["data"]["tasks"], ( + "Task name \"{}\" not found on asset \"{}\"".format( + task_name, asset_name + ) + ) + + task_type = asset_doc["data"]["tasks"][task_name].get("type") assert task_type, ( - "Task type cannot be found in on asset `{}` " - "with given task name `{}`" + "Task name \"{}\" on asset \"{}\" does not have specified task type." ).format(asset_name, task_name) # get short name for task type defined in default anatomy settings - task_type_data = project_task_types.get(task_type) - assert task_type_data, ( + project_task_type_data = project_task_types.get(task_type) + assert project_task_type_data, ( "Something went wrong. Default anatomy tasks are not holding" "requested task type: `{}`".format(task_type) ) @@ -1324,7 +1329,7 @@ def _get_task_context_data_for_anatomy( "task": { "name": task_name, "type": task_type, - "short": task_type_data["short_name"] + "short_name": project_task_type_data["short_name"] } } From e5ede2cc01b6febf88a5ef2aee3952380b76472b Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 16:26:25 +0200 Subject: [PATCH 37/44] removed collapsible-wrap from Profiles as Profiles list can be collapsible --- .../schemas/template_workfile_options.json | 181 +++++++++--------- 1 file changed, 88 insertions(+), 93 deletions(-) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json index b3cc91d376..815df85879 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/template_workfile_options.json @@ -48,103 +48,98 @@ "default": false }, { - "type": "collapsible-wrap", + "type": "list", + "key": "profiles", "label": "Profiles", - "children": [ - { - "type": "list", - "key": "profiles", - "label": "Profiles", - "object_type": { - "type": "dict", - "children": [ - { - "key": "tasks", - "label": "Tasks", - "type": "list", - "object_type": "text" - }, - { - "type": "splitter" - }, - { - "key": "current_context", - "label": "Current Context", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] + "use_label_wrap": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "tasks", + "label": "Tasks", + "type": "list", + "object_type": "text" + }, + { + "type": "splitter" + }, + { + "key": "current_context", + "label": "Current Context", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" } - }, - { - "type": "separator" - }, - { - "key": "linked_assets", - "label": "Linked Assets/Shots", - "type": "list", - "highlight_content": true, - "object_type": { - "type": "dict", - "children": [ - { - "key": "subset_name_filters", - "label": "Subset name Filters", - "type": "list", - "object_type": "text" - }, - { - "key": "families", - "label": "Families", - "type": "list", - "object_type": "text" - }, - { - "key": "repre_names", - "label": "Repre Names", - "type": "list", - "object_type": "text" - }, - { - "key": "loaders", - "label": "Loaders", - "type": "list", - "object_type": "text" - } - ] + ] + } + }, + { + "type": "separator" + }, + { + "key": "linked_assets", + "label": "Linked Assets/Shots", + "type": "list", + "highlight_content": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "subset_name_filters", + "label": "Subset name Filters", + "type": "list", + "object_type": "text" + }, + { + "key": "families", + "label": "Families", + "type": "list", + "object_type": "text" + }, + { + "key": "repre_names", + "label": "Repre Names", + "type": "list", + "object_type": "text" + }, + { + "key": "loaders", + "label": "Loaders", + "type": "list", + "object_type": "text" } - } - ] + ] + } } - } - ] + ] + } } ] } -] \ No newline at end of file +] From d8fb5abfc4de49e0c63ad3bb955faa61294ca2b5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 16:32:17 +0200 Subject: [PATCH 38/44] use template_workfile_options in blender aftereffects photoshop and tvpaint --- .../settings/defaults/project_settings/aftereffects.json | 6 +----- openpype/settings/defaults/project_settings/blender.json | 6 +----- openpype/settings/defaults/project_settings/photoshop.json | 6 +----- openpype/settings/defaults/project_settings/tvpaint.json | 6 +----- .../projects_schema/schema_project_aftereffects.json | 6 +++++- .../schemas/projects_schema/schema_project_blender.json | 6 +++++- .../schemas/projects_schema/schema_project_photoshop.json | 6 +++++- .../schemas/projects_schema/schema_project_tvpaint.json | 6 +++++- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/openpype/settings/defaults/project_settings/aftereffects.json b/openpype/settings/defaults/project_settings/aftereffects.json index 86f3a02ddf..698b3b35a9 100644 --- a/openpype/settings/defaults/project_settings/aftereffects.json +++ b/openpype/settings/defaults/project_settings/aftereffects.json @@ -21,10 +21,6 @@ }, "workfile_builder": { "create_first_version": false, - "template_path": { - "windows": "", - "darwin": "", - "linux": "" - } + "custom_templates": [] } } \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/blender.json b/openpype/settings/defaults/project_settings/blender.json index 8effe169fa..a7262dcb5d 100644 --- a/openpype/settings/defaults/project_settings/blender.json +++ b/openpype/settings/defaults/project_settings/blender.json @@ -1,10 +1,6 @@ { "workfile_builder": { "create_first_version": false, - "template_path": { - "windows": "", - "darwin": "", - "linux": "" - } + "custom_templates": [] } } \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/photoshop.json b/openpype/settings/defaults/project_settings/photoshop.json index 6ca913d5ea..b306a757a6 100644 --- a/openpype/settings/defaults/project_settings/photoshop.json +++ b/openpype/settings/defaults/project_settings/photoshop.json @@ -16,10 +16,6 @@ }, "workfile_builder": { "create_first_version": false, - "template_path": { - "windows": "", - "darwin": "", - "linux": "" - } + "custom_templates": [] } } \ No newline at end of file diff --git a/openpype/settings/defaults/project_settings/tvpaint.json b/openpype/settings/defaults/project_settings/tvpaint.json index 4b422835fb..b4f3b315ec 100644 --- a/openpype/settings/defaults/project_settings/tvpaint.json +++ b/openpype/settings/defaults/project_settings/tvpaint.json @@ -34,11 +34,7 @@ }, "workfile_builder": { "create_first_version": false, - "template_path": { - "windows": "", - "darwin": "", - "linux": "" - } + "custom_templates": [] }, "filters": {} } \ No newline at end of file diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json b/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json index ddaa0dc692..8024de6d45 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_aftereffects.json @@ -88,7 +88,11 @@ }, { "type": "schema_template", - "name": "template_workfile_builder_simple" + "name": "template_workfile_options", + "skip_paths": [ + "workfile_builder/builder_on_start", + "workfile_builder/profiles" + ] } ] } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json b/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json index 25b0faab2c..af09329a03 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_blender.json @@ -7,7 +7,11 @@ "children": [ { "type": "schema_template", - "name": "template_workfile_builder_simple" + "name": "template_workfile_options", + "skip_paths": [ + "workfile_builder/builder_on_start", + "workfile_builder/profiles" + ] } ] } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json index 7aaab4c8ea..4eb6c26dbb 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_photoshop.json @@ -55,7 +55,11 @@ }, { "type": "schema_template", - "name": "template_workfile_builder_simple" + "name": "template_workfile_options", + "skip_paths": [ + "workfile_builder/builder_on_start", + "workfile_builder/profiles" + ] } ] } diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json b/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json index e60d089a4d..6f90bb4263 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_tvpaint.json @@ -114,7 +114,11 @@ }, { "type": "schema_template", - "name": "template_workfile_builder_simple" + "name": "template_workfile_options", + "skip_paths": [ + "workfile_builder/builder_on_start", + "workfile_builder/profiles" + ] }, { "type": "schema", From 7ed2831d8912be3f97aabeed6a0320225c691eb4 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 16:51:36 +0200 Subject: [PATCH 39/44] added get_custom_workfile_template_by_string_context to openpype.lib --- openpype/lib/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index a78e26205b..6d9f4498f5 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -86,6 +86,7 @@ from .avalon_context import ( change_timer_to_current_context, get_custom_workfile_template_by_context, + get_custom_workfile_template_by_string_context, get_custom_workfile_template ) @@ -198,6 +199,7 @@ __all__ = [ "change_timer_to_current_context", "get_custom_workfile_template_by_context", + "get_custom_workfile_template_by_string_context", "get_custom_workfile_template", "IniSettingRegistry", From 7a841a18edd628d59453f75d841d3fcf0b6a539e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 17:00:45 +0200 Subject: [PATCH 40/44] added more hosts to last workfile hook and changed it's order --- openpype/hooks/pre_add_last_workfile_arg.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openpype/hooks/pre_add_last_workfile_arg.py b/openpype/hooks/pre_add_last_workfile_arg.py index 377026da4a..5ca2a42510 100644 --- a/openpype/hooks/pre_add_last_workfile_arg.py +++ b/openpype/hooks/pre_add_last_workfile_arg.py @@ -8,8 +8,19 @@ class AddLastWorkfileToLaunchArgs(PreLaunchHook): This is not possible to do for all applications the same way. """ - order = 0 - app_groups = ["maya", "nuke", "nukex", "hiero", "nukestudio"] + # Execute after workfile template copy + order = 10 + app_groups = [ + "maya", + "nuke", + "nukex", + "hiero", + "nukestudio", + "blender", + "photoshop", + "tvpaint", + "afftereffects" + ] def execute(self): if not self.data.get("start_last_workfile"): From 9e73e30ddb4265202571c4ebeaa2c6dfcb44c206 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 17:01:48 +0200 Subject: [PATCH 41/44] pre copy template workfile is using get_custom_workfile_template_by_context function to get template path --- openpype/hooks/pre_copy_template_workfile.py | 148 ++++++++++++------- 1 file changed, 96 insertions(+), 52 deletions(-) diff --git a/openpype/hooks/pre_copy_template_workfile.py b/openpype/hooks/pre_copy_template_workfile.py index 7593090ab4..44cad1931c 100644 --- a/openpype/hooks/pre_copy_template_workfile.py +++ b/openpype/hooks/pre_copy_template_workfile.py @@ -1,83 +1,127 @@ import os -import platform import shutil -from openpype.lib import PreLaunchHook -from openpype.settings import ( - get_project_settings +from openpype.lib import ( + PreLaunchHook, + get_custom_workfile_template_by_context, + get_custom_workfile_template_by_string_context ) +from openpype.settings import get_project_settings -class AddTemplateWorkfileToLaunchArgs(PreLaunchHook): - """Add last workfile path to launch arguments. +class CopyTemplateWorkfile(PreLaunchHook): + """Copy workfile template. This is not possible to do for all applications the same way. + + Prelaunch hook works only if last workfile leads to not existing file. + - That is possible only if it's first version. """ + # Before `AddLastWorkfileToLaunchArgs` order = 0 app_groups = ["blender", "photoshop", "tvpaint", "afftereffects"] def execute(self): - if not self.data.get("start_last_workfile"): - self.log.info("It is set to not start last workfile on start.") - return + """Check if can copy template for context and do it if possible. + + First check if host for current project should create first workfile. + Second check is if template is reachable and can be copied. + + Args: + last_workfile(str): Path where template will be copied. + + Returns: + None: This is a void method. + """ last_workfile = self.data.get("last_workfile_path") if not last_workfile: - self.log.warning("Last workfile was not collected.") + self.log.warning(( + "Last workfile was not collected." + " Can't add it to launch arguments or determine if should" + " copy template." + )) return - if not os.path.exists(last_workfile): - self.log.info("Current context does not have any workfile yet.") - from_template = self.workfile_path(last_workfile) - if not from_template: - return + if os.path.exists(last_workfile): + self.log.debug("Last workfile exits. Skipping {} process.".format( + self.__class__.__name__ + )) + return - # Add path to workfile to arguments - self.launch_context.launch_args.append(last_workfile) + self.log.info("Last workfile does not exits.") - def workfile_path(self, last_workfile): - - project = self.data["project_name"] - - project_settings = get_project_settings(project) + project_name = self.data["project_name"] + asset_name = self.data["asset_name"] + task_name = self.data["task_name"] + project_settings = get_project_settings(project_name) host_settings = project_settings[self.application.group.name] - create_first_version = ( - host_settings - ["workfile_builder"] - ["create_first_version"] - ) + workfile_builder_settings = host_settings.get("workfile_builder") + if not workfile_builder_settings: + # TODO remove warning when deprecated + self.log.warning(( + "Seems like old version of settings is used." + " Can't access custom templates in host \"{}\"." + ).format(self.application.full_label)) + return - if not create_first_version: - return False - - template_path = ( - host_settings - ["workfile_builder"] - ["template_path"] - [platform.system().lower()] - ) - - if template_path: - if not os.path.exists(template_path): - self.log.warning( - "Couldn't find workfile template file in {}".format( - template_path - ) - ) - return False + if not workfile_builder_settings["create_first_version"]: + self.log.info(( + "Project \"{}\" has turned off to create first workfile for" + " application \"{}\"" + ).format(project_name, self.application.full_label)) + return + # Backwards compatibility + template_profiles = workfile_builder_settings.get("custom_templates") + if not template_profiles: self.log.info( - f"Creating workfile from template: \"{template_path}\"" + "Custom templates are not filled. Skipping template copy." + ) + return + + project_doc = self.data.get("project_doc") + asset_doc = self.data.get("asset_doc") + anatomy = self.data.get("anatomy") + if project_doc and asset_doc: + self.log.debug("Started filtering of custom template paths.") + template_path = get_custom_workfile_template_by_context( + template_profiles, project_doc, asset_doc, task_name, anatomy ) - # Copy template workfile to new destinantion - shutil.copy2( - os.path.normpath(template_path), - os.path.normpath(last_workfile) + else: + self.log.warning(( + "Global data collection probably did not execute." + " Using backup solution." + )) + dbcon = self.data.get("dbcon") + template_path = get_custom_workfile_template_by_string_context( + template_profiles, project_name, asset_name, task_name, + dbcon, anatomy ) - self.log.info(f"Workfile to open: \"{last_workfile}\"") + if not template_path: + self.log.info( + "Registered custom templates didn't match current context." + ) + return - return True \ No newline at end of file + if not os.path.exists(template_path): + self.log.warning( + "Couldn't find workfile template file \"{}\"".format( + template_path + ) + ) + return + + self.log.info( + f"Creating workfile from template: \"{template_path}\"" + ) + + # Copy template workfile to new destinantion + shutil.copy2( + os.path.normpath(template_path), + os.path.normpath(last_workfile) + ) From a2a94886a49b5f0503259cd7d9419ac0bba4c195 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 17:11:42 +0200 Subject: [PATCH 42/44] fix host/group name --- openpype/hooks/pre_copy_template_workfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hooks/pre_copy_template_workfile.py b/openpype/hooks/pre_copy_template_workfile.py index 44cad1931c..29a522f933 100644 --- a/openpype/hooks/pre_copy_template_workfile.py +++ b/openpype/hooks/pre_copy_template_workfile.py @@ -56,7 +56,7 @@ class CopyTemplateWorkfile(PreLaunchHook): task_name = self.data["task_name"] project_settings = get_project_settings(project_name) - host_settings = project_settings[self.application.group.name] + host_settings = project_settings[self.application.host_name] workfile_builder_settings = host_settings.get("workfile_builder") if not workfile_builder_settings: From edbcf7323bbeb2e5b9181b8924ecd6ceffcc89c8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 1 Jun 2021 17:12:21 +0200 Subject: [PATCH 43/44] removed duplicated get_custom_workfile_template in init file --- openpype/lib/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index 6d9f4498f5..02ae9635c1 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -223,7 +223,6 @@ __all__ = [ "apply_project_environments_value", "compile_list_of_regexes", - "get_custom_workfile_template", "filter_profiles", From d96354a7544cc236e189b303110ab19e2980425e Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 1 Jun 2021 20:44:01 +0200 Subject: [PATCH 44/44] update avalon core --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index e9882d0fff..07756c7368 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit e9882d0ffff27fed03a03459f496c29da0310cd2 +Subproject commit 07756c7368e4447d28f27dc88b6a46c95692e035