From 72c3bab5ec5ec06167afb1705a0d4fa7c47f31a4 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 23 Aug 2021 12:31:55 +0200 Subject: [PATCH 01/28] enhancement branches don't bump minor version --- .github/workflows/prerelease.yml | 2 +- tools/ci_tools.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/prerelease.yml b/.github/workflows/prerelease.yml index d0853e74d6..82f9a6ae9d 100644 --- a/.github/workflows/prerelease.yml +++ b/.github/workflows/prerelease.yml @@ -47,7 +47,7 @@ jobs: enhancementLabel: '**πŸš€ Enhancements**' bugsLabel: '**πŸ› Bug fixes**' deprecatedLabel: '**⚠️ Deprecations**' - addSections: '{"documentation":{"prefix":"### πŸ“– Documentation","labels":["documentation"]},"tests":{"prefix":"### βœ… Testing","labels":["tests"]}}' + addSections: '{"documentation":{"prefix":"### πŸ“– Documentation","labels":["documentation"]},"tests":{"prefix":"### βœ… Testing","labels":["tests"]},"feature":{"prefix":"### πŸ†• New features","labels":["feature"]},}' issues: false issuesWoLabels: false sinceTag: "3.0.0" diff --git a/tools/ci_tools.py b/tools/ci_tools.py index 436551c243..3c1aaae991 100644 --- a/tools/ci_tools.py +++ b/tools/ci_tools.py @@ -36,7 +36,7 @@ def get_log_since_tag(version): def release_type(log): regex_minor = ["feature/", "(feat)"] - regex_patch = ["bugfix/", "fix/", "(fix)"] + regex_patch = ["bugfix/", "fix/", "(fix)", "enhancement/"] for reg in regex_minor: if re.search(reg, log): return "minor" From 3d9d15829adf156da1d884675d10f33c4b6e96e0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 25 Aug 2021 17:18:18 +0200 Subject: [PATCH 02/28] wrap paths in ffmpeg args to quotes --- openpype/plugins/publish/extract_jpeg.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/plugins/publish/extract_jpeg.py b/openpype/plugins/publish/extract_jpeg.py index b1289217e6..1057b5c696 100644 --- a/openpype/plugins/publish/extract_jpeg.py +++ b/openpype/plugins/publish/extract_jpeg.py @@ -95,7 +95,7 @@ class ExtractJpegEXR(pyblish.api.InstancePlugin): # use same input args like with mov jpeg_items.extend(ffmpeg_args.get("input") or []) # input file - jpeg_items.append("-i {}".format(full_input_path)) + jpeg_items.append("-i \"{}\"".format(full_input_path)) # output arguments from presets jpeg_items.extend(ffmpeg_args.get("output") or []) @@ -104,7 +104,7 @@ class ExtractJpegEXR(pyblish.api.InstancePlugin): jpeg_items.append("-vframes 1") # output file - jpeg_items.append(full_output_path) + jpeg_items.append("\"{}\"".format(full_output_path)) subprocess_jpeg = " ".join(jpeg_items) From ada23f369b7e6946d675a7c3bb267394cb4dbb18 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 15:02:17 +0200 Subject: [PATCH 03/28] added base of anatomy template enum entity --- openpype/settings/entities/__init__.py | 4 ++- openpype/settings/entities/enum_entity.py | 42 +++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/openpype/settings/entities/__init__.py b/openpype/settings/entities/__init__.py index 9cda702e9a..8c30d5044c 100644 --- a/openpype/settings/entities/__init__.py +++ b/openpype/settings/entities/__init__.py @@ -106,7 +106,8 @@ from .enum_entity import ( ToolsEnumEntity, TaskTypeEnumEntity, ProvidersEnum, - DeadlineUrlEnumEntity + DeadlineUrlEnumEntity, + AnatomyTemplatesEnumEntity ) from .list_entity import ListEntity @@ -162,6 +163,7 @@ __all__ = ( "TaskTypeEnumEntity", "ProvidersEnum", "DeadlineUrlEnumEntity", + "AnatomyTemplatesEnumEntity", "ListEntity", diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 5db31959a5..17915d9948 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -494,3 +494,45 @@ class DeadlineUrlEnumEntity(BaseEnumEntity): if key in self.valid_keys: new_value.append(key) self._current_value = new_value + + +class AnatomyTemplatesEnumEntity(BaseEnumEntity): + schema_types = ["anatomy-templates-enum"] + + def _item_initalization(self): + self.multiselection = False + + self.enum_items = [] + self.valid_keys = set() + + enum_default = self.schema_data.get("default") or "work" + + self.value_on_not_set = enum_default + self.valid_value_types = (STRING_TYPE,) + + # GUI attribute + self.placeholder = self.schema_data.get("placeholder") + + def _get_enum_values(self): + templates_entity = self.get_entity_from_path( + "project_anatomy/templates" + ) + + valid_keys = set() + enum_items_list = [] + + for key, value in templates_entity.items(): + print(key, value) + enum_items_list.append( + {key: key}) + valid_keys.add(key) + return enum_items_list, valid_keys + + def set_override_state(self, *args, **kwargs): + super(AnatomyTemplatesEnumEntity, self).set_override_state( + *args, **kwargs + ) + + self.enum_items, self.valid_keys = self._get_enum_values() + if self._current_value not in self.valid_keys: + self._current_value = self.value_on_not_set From a06ab7e0ef08c5cb0a90bbdceddd4681cf9b5288 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 15:03:54 +0200 Subject: [PATCH 04/28] added `workfile_template_profiles` to settings --- .../defaults/project_settings/global.json | 7 +++++ openpype/settings/entities/enum_entity.py | 1 - .../schemas/schema_global_tools.json | 31 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/openpype/settings/defaults/project_settings/global.json b/openpype/settings/defaults/project_settings/global.json index aab8c2196c..63c4bc5091 100644 --- a/openpype/settings/defaults/project_settings/global.json +++ b/openpype/settings/defaults/project_settings/global.json @@ -249,6 +249,13 @@ ] }, "Workfiles": { + "workfile_template_profiles": [ + { + "task_types": [], + "hosts": [], + "workfile_template": "work" + } + ], "last_workfile_on_startup": [ { "hosts": [], diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index 17915d9948..d174b6a3df 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -522,7 +522,6 @@ class AnatomyTemplatesEnumEntity(BaseEnumEntity): enum_items_list = [] for key, value in templates_entity.items(): - print(key, value) enum_items_list.append( {key: key}) valid_keys.add(key) diff --git a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json index 9e39eeb39e..245560f115 100644 --- a/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json +++ b/openpype/settings/entities/schemas/projects_schema/schemas/schema_global_tools.json @@ -65,6 +65,37 @@ "key": "Workfiles", "label": "Workfiles", "children": [ + { + "type": "list", + "key": "workfile_template_profiles", + "label": "Workfile template profiles", + "use_label_wrap": true, + "object_type": { + "type": "dict", + "children": [ + { + "key": "task_types", + "label": "Task types", + "type": "task-types-enum" + }, + { + "type": "hosts-enum", + "key": "hosts", + "label": "Hosts", + "multiselection": true + }, + { + "type": "splitter" + }, + { + "key": "workfile_template", + "label": "Workfile template", + "type": "anatomy-templates-enum", + "multiselection": false + } + ] + } + }, { "type": "list", "key": "last_workfile_on_startup", From 59cff86ce4ea05f7ff1161cf274c1b5bbc336546 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 15:17:04 +0200 Subject: [PATCH 05/28] fixed templates enum entity --- openpype/settings/entities/enum_entity.py | 32 ++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index d174b6a3df..c35a800883 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -521,10 +521,36 @@ class AnatomyTemplatesEnumEntity(BaseEnumEntity): valid_keys = set() enum_items_list = [] - for key, value in templates_entity.items(): - enum_items_list.append( - {key: key}) + others_entity = None + for key, entity in templates_entity.items(): + # Skip defaults key + if key == "defaults": + continue + + if key == "others": + others_entity = entity + continue + + label = key + if hasattr(entity, "label"): + label = entity.label or label + + enum_items_list.append({key: label}) valid_keys.add(key) + + if others_entity is not None: + print(others_entity) + get_child_label_func = getattr( + others_entity, "get_child_label", None + ) + for key, child_entity in others_entity.items(): + label = key + if callable(get_child_label_func): + label = get_child_label_func(child_entity) or label + + enum_items_list.append({key: label}) + valid_keys.add(key) + return enum_items_list, valid_keys def set_override_state(self, *args, **kwargs): From 9d4451a3d40bb507a257ff2fd8e38826966a3f82 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 15:18:28 +0200 Subject: [PATCH 06/28] removed debug print --- openpype/settings/entities/enum_entity.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/settings/entities/enum_entity.py b/openpype/settings/entities/enum_entity.py index c35a800883..c5330a2f04 100644 --- a/openpype/settings/entities/enum_entity.py +++ b/openpype/settings/entities/enum_entity.py @@ -539,7 +539,6 @@ class AnatomyTemplatesEnumEntity(BaseEnumEntity): valid_keys.add(key) if others_entity is not None: - print(others_entity) get_child_label_func = getattr( others_entity, "get_child_label", None ) From c0d36a27984ef232c6d66bd37f55db7ef3156e0c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 18:44:39 +0200 Subject: [PATCH 07/28] hide not used widgets --- openpype/tools/workfiles/app.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 42f0e422ae..66e204e89c 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -126,10 +126,14 @@ class NameWindow(QtWidgets.QDialog): # for "{version". if "{version" in self.template: inputs_layout.addRow("Version:", version_widget) + else: + version_widget.setVisible(False) # Add subversion only if template containt `{comment}` if "{comment}" in self.template: inputs_layout.addRow("Subversion:", subversion_input) + else: + subversion_input.setVisible(False) inputs_layout.addRow("Extension:", ext_combo) inputs_layout.addRow("Preview:", preview_label) From 43d718d0ee3401b446cc91ce2192e0ed5d4959b2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 18:44:52 +0200 Subject: [PATCH 08/28] reimplemented task model --- openpype/tools/workfiles/model.py | 145 +++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/openpype/tools/workfiles/model.py b/openpype/tools/workfiles/model.py index 368988fd4e..92fbf76b95 100644 --- a/openpype/tools/workfiles/model.py +++ b/openpype/tools/workfiles/model.py @@ -1,7 +1,7 @@ import os import logging -from Qt import QtCore +from Qt import QtCore, QtGui from avalon import style from avalon.vendor import qtawesome @@ -9,6 +9,10 @@ from avalon.tools.models import TreeModel, Item log = logging.getLogger(__name__) +TASK_NAME_ROLE = QtCore.Qt.UserRole + 1 +TASK_TYPE_ROLE = QtCore.Qt.UserRole + 2 +TASK_ORDER_ROLE = QtCore.Qt.UserRole + 3 + class FilesModel(TreeModel): """Model listing files with specified extensions in a root folder""" @@ -151,3 +155,142 @@ class FilesModel(TreeModel): return "Date modified" return super(FilesModel, self).headerData(section, orientation, role) + + +class TasksProxyModel(QtCore.QSortFilterProxyModel): + def lessThan(self, x_index, y_index): + x_order = x_index.data(TASK_ORDER_ROLE) + y_order = y_index.data(TASK_ORDER_ROLE) + if x_order is not None and y_order is not None: + if x_order < y_order: + return True + if x_order > y_order: + return False + + elif x_order is None and y_order is not None: + return True + + elif y_order is None and x_order is not None: + return False + + x_name = x_index.data(QtCore.Qt.DisplayRole) + y_name = y_index.data(QtCore.Qt.DisplayRole) + if x_name == y_name: + return True + + if x_name == tuple(sorted((x_name, y_name)))[0]: + return False + return True + + +class TasksModel(QtGui.QStandardItemModel): + """A model listing the tasks combined for a list of assets""" + def __init__(self, dbcon, parent=None): + super(TasksModel, self).__init__(parent=parent) + self.dbcon = dbcon + self._default_icon = qtawesome.icon( + "fa.male", + color=style.colors.default + ) + self._no_tasks_icon = qtawesome.icon( + "fa.exclamation-circle", + color=style.colors.mid + ) + self._cached_icons = {} + self._project_task_types = {} + + self._refresh_task_types() + + def _refresh_task_types(self): + # Get the project configured icons from database + project = self.dbcon.find_one( + {"type": "project"}, + {"config.tasks"} + ) + tasks = project["config"].get("tasks") or {} + self._project_task_types = tasks + + def _try_get_awesome_icon(self, icon_name): + icon = None + if icon_name: + try: + icon = qtawesome.icon( + "fa.{}".format(icon_name), + color=style.colors.default + ) + + except Exception: + pass + return icon + + def headerData(self, section, orientation, role): + # Show nice labels in the header + if ( + role == QtCore.Qt.DisplayRole + and orientation == QtCore.Qt.Horizontal + ): + if section == 0: + return "Tasks" + + return super(TasksModel, self).headerData(section, orientation, role) + + def _get_icon(self, task_icon, task_type_icon): + if task_icon in self._cached_icons: + return self._cached_icons[task_icon] + + icon = self._try_get_awesome_icon(task_icon) + if icon is not None: + self._cached_icons[task_icon] = icon + return icon + + if task_type_icon in self._cached_icons: + icon = self._cached_icons[task_type_icon] + self._cached_icons[task_icon] = icon + return icon + + icon = self._try_get_awesome_icon(task_type_icon) + if icon is None: + icon = self._default_icon + + self._cached_icons[task_icon] = icon + self._cached_icons[task_type_icon] = icon + + return icon + + def set_asset(self, asset_doc): + """Set assets to track by their database id + + Arguments: + asset_doc (dict): Asset document from MongoDB. + """ + self.clear() + + if not asset_doc: + return + + asset_tasks = asset_doc.get("data", {}).get("tasks") or {} + items = [] + for task_name, task_info in asset_tasks.items(): + task_icon = task_info.get("icon") + task_type = task_info.get("type") + task_order = task_info.get("order") + task_type_info = self._project_task_types.get(task_type) or {} + task_type_icon = task_type_info.get("icon") + icon = self._get_icon(task_icon, task_type_icon) + + label = "{} ({})".format(task_name, task_type or "type N/A") + item = QtGui.QStandardItem(label) + item.setData(task_name, TASK_NAME_ROLE) + item.setData(task_type, TASK_TYPE_ROLE) + item.setData(task_order, TASK_ORDER_ROLE) + item.setData(icon, QtCore.Qt.DecorationRole) + item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) + items.append(item) + + if not items: + item = QtGui.QStandardItem("No task") + item.setData(self._no_tasks_icon, QtCore.Qt.DecorationRole) + item.setFlags(QtCore.Qt.NoItemFlags) + items.append(item) + + self.invisibleRootItem().appendRows(items) From a4f8521e49c3cd3d24ee403ee90e4a9bfad07dd2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 18:45:26 +0200 Subject: [PATCH 09/28] implemented functions to retrieve template key for workfile --- openpype/lib/avalon_context.py | 64 ++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index c4217cc6d5..b363027ec2 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -344,6 +344,70 @@ def get_latest_version(asset_name, subset_name, dbcon=None, project_name=None): return version_doc +def get_workfile_template_key_from_context( + project_name, asset_name, task_name, host_name, + dbcon=None, project_settings=None +): + if not dbcon: + from avalon.api import AvalonMongoDB + + dbcon = AvalonMongoDB() + + dbcon.Session["AVALON_PROJECT"] = project_name + asset_doc = dbcon.find_one( + { + "type": "asset", + "name": asset_name + }, + { + "data.tasks": 1 + } + ) + asset_tasks = asset_doc.get("data", {}).get("tasks") or {} + task_info = asset_tasks.get(task_name) or {} + task_type = task_info.get("type") + + return get_workfile_template_key( + project_name, task_type, host_name, project_settings + ) + + +def get_workfile_template_key( + project_name, task_type, host_name, project_settings=None +): + default = "work" + if not task_type or not host_name: + return default + + if not project_settings: + project_settings = get_project_settings(project_name) + + try: + profiles = ( + project_settings + ["global"] + ["tools"] + ["Workfiles"] + ["workfile_template_profiles"] + ) + except Exception: + profiles = [] + + if not profiles: + return default + + from .profiles_filtering import filter_profiles + + profile_filter = { + "task_types": task_type, + "hosts": host_name + } + profile = filter_profiles(profiles, profile_filter) + if profile: + return profile["workfile_template"] or default + return default + + def get_workdir_data(project_doc, asset_doc, task_name, host_name): """Prepare data for workdir template filling from entered information. From 461c33321861628737e6da76b9915e0e6738851f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:08:06 +0200 Subject: [PATCH 10/28] changed arguments and filled docstrings to new functions --- openpype/lib/avalon_context.py | 65 +++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index b363027ec2..449dde51c4 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -345,15 +345,47 @@ def get_latest_version(asset_name, subset_name, dbcon=None, project_name=None): def get_workfile_template_key_from_context( - project_name, asset_name, task_name, host_name, + asset_name, task_name, host_name, project_name=None, dbcon=None, project_settings=None ): + """Helper function to get template key for workfile template. + + Do the same as `get_workfile_template_key` but returns value for "session + context". + + It is required to pass one of 'dbcon' with already set project name or + 'project_name' arguments. + + Args: + asset_name(str): Name of asset document. + task_name(str): Task name for which is template key retrieved. + Must be available on asset document under `data.tasks`. + host_name(str): Name of host implementation for which is workfile + used. + project_name(str): Project name where asset and task is. Not required + when 'dbcon' is passed. + dbcon(AvalonMongoDB): Connection to mongo with already set project + under `AVALON_PROJECT`. Not required when 'project_name' is passed. + project_settings(dict): Project settings for passed 'project_name'. + Not required at all but makes function faster. + Raises: + ValueError: When both 'dbcon' and 'project_name' were not + passed. + """ if not dbcon: + if not project_name: + raise ValueError(( + "`get_workfile_template_key_from_context` requires to pass" + " one of 'dbcon' or 'project_name' arguments." + )) from avalon.api import AvalonMongoDB dbcon = AvalonMongoDB() + dbcon.Session["AVALON_PROJECT"] = project_name + + elif not project_name: + project_name = dbcon.Session["AVALON_PROJECT"] - dbcon.Session["AVALON_PROJECT"] = project_name asset_doc = dbcon.find_one( { "type": "asset", @@ -368,18 +400,43 @@ def get_workfile_template_key_from_context( task_type = task_info.get("type") return get_workfile_template_key( - project_name, task_type, host_name, project_settings + task_type, host_name, project_name, project_settings ) def get_workfile_template_key( - project_name, task_type, host_name, project_settings=None + task_type, host_name, project_name=None, project_settings=None ): + """Workfile template key which should be used to get workfile template. + + Function is using profiles from project settings to return right template + for passet task type and host name. + + One of 'project_name' or 'project_settings' must be passed it is preffered + to pass settings if are already available. + + Args: + task_type(str): Name of task type. + host_name(str): Name of host implementation (e.g. "maya", "nuke", ...) + project_name(str): Name of project in which context should look for + settings. Not required if `project_settings` are passed. + project_settings(dict): Prepare project settings for project name. + Not needed if `project_name` is passed. + + Raises: + ValueError: When both 'project_name' and 'project_settings' were not + passed. + """ default = "work" if not task_type or not host_name: return default if not project_settings: + if not project_name: + raise ValueError(( + "`get_workfile_template_key` requires to pass" + " one of 'project_name' or 'project_settings' arguments." + )) project_settings = get_project_settings(project_name) try: From 96b1309ec927909f360b6e22f653ac85b5537bec Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:10:24 +0200 Subject: [PATCH 11/28] use new functions in already existing workdir functions --- openpype/lib/__init__.py | 4 ++++ openpype/lib/avalon_context.py | 25 +++++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/openpype/lib/__init__.py b/openpype/lib/__init__.py index 9bcd0f7587..3d392dc745 100644 --- a/openpype/lib/__init__.py +++ b/openpype/lib/__init__.py @@ -71,6 +71,8 @@ from .avalon_context import ( get_linked_assets, get_latest_version, + get_workfile_template_key, + get_workfile_template_key_from_context, get_workdir_data, get_workdir, get_workdir_with_workdir_data, @@ -189,6 +191,8 @@ __all__ = [ "get_linked_assets", "get_latest_version", + "get_workfile_template_key", + "get_workfile_template_key_from_context", "get_workdir_data", "get_workdir", "get_workdir_with_workdir_data", diff --git a/openpype/lib/avalon_context.py b/openpype/lib/avalon_context.py index 449dde51c4..497348af33 100644 --- a/openpype/lib/avalon_context.py +++ b/openpype/lib/avalon_context.py @@ -494,7 +494,8 @@ def get_workdir_data(project_doc, asset_doc, task_name, host_name): def get_workdir_with_workdir_data( - workdir_data, anatomy=None, project_name=None, template_key=None + workdir_data, anatomy=None, project_name=None, + template_key=None, dbcon=None ): """Fill workdir path from entered data and project's anatomy. @@ -508,8 +509,10 @@ def get_workdir_with_workdir_data( `project_name` is entered. project_name (str): Project's name. Optional if `anatomy` is entered otherwise Anatomy object is created with using the project name. - template_key (str): Key of work templates in anatomy templates. By - default is seto to `"work"`. + template_key (str): Key of work templates in anatomy templates. If not + passed `get_workfile_template_key_from_context` is used to get it. + dbcon(AvalonMongoDB): Mongo connection. Required only if 'template_key' + and 'project_name' are not passed. Returns: TemplateResult: Workdir path. @@ -527,7 +530,13 @@ def get_workdir_with_workdir_data( anatomy = Anatomy(project_name) if not template_key: - template_key = "work" + template_key = get_workfile_template_key_from_context( + workdir_data["asset"], + workdir_data["task"], + workdir_data["app"], + project_name=workdir_data["project"]["name"], + dbcon=dbcon + ) anatomy_filled = anatomy.format(workdir_data) # Output is TemplateResult object which contain usefull data @@ -568,7 +577,9 @@ def get_workdir( project_doc, asset_doc, task_name, host_name ) # Output is TemplateResult object which contain usefull data - return get_workdir_with_workdir_data(workdir_data, anatomy, template_key) + return get_workdir_with_workdir_data( + workdir_data, anatomy, template_key=template_key + ) @with_avalon @@ -637,7 +648,9 @@ def create_workfile_doc(asset_doc, task_name, filename, workdir, dbcon=None): # Prepare anatomy anatomy = Anatomy(project_doc["name"]) # Get workdir path (result is anatomy.TemplateResult) - template_workdir = get_workdir_with_workdir_data(workdir_data, anatomy) + template_workdir = get_workdir_with_workdir_data( + workdir_data, anatomy, dbcon=dbcon + ) template_workdir_path = str(template_workdir).replace("\\", "/") # Replace slashses in workdir path where workfile is located From 960c5a2279e155cdbfdd8c600d7d86a6fde48d3d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:10:55 +0200 Subject: [PATCH 12/28] template key is used when launching application --- openpype/lib/applications.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openpype/lib/applications.py b/openpype/lib/applications.py index 71ab2eac61..fbf991a32e 100644 --- a/openpype/lib/applications.py +++ b/openpype/lib/applications.py @@ -28,7 +28,8 @@ from . import ( from .local_settings import get_openpype_username from .avalon_context import ( get_workdir_data, - get_workdir_with_workdir_data + get_workdir_with_workdir_data, + get_workfile_template_key_from_context ) from .python_module_tools import ( @@ -1236,8 +1237,18 @@ def prepare_context_environments(data): anatomy = data["anatomy"] + template_key = get_workfile_template_key_from_context( + asset_doc["name"], + task_name, + app.host_name, + project_name=project_name, + dbcon=data["dbcon"] + ) + try: - workdir = get_workdir_with_workdir_data(workdir_data, anatomy) + workdir = get_workdir_with_workdir_data( + workdir_data, anatomy, template_key=template_key + ) except Exception as exc: raise ApplicationLaunchFailed( From eb0ec073b1243b1c1b392cf43a1c2ce830954549 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:11:19 +0200 Subject: [PATCH 13/28] reduced project query time by projection of required (and used) keys --- openpype/tools/workfiles/app.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 66e204e89c..ca202ae2ca 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -55,9 +55,13 @@ class NameWindow(QtWidgets.QDialog): # Set work file data for template formatting asset_name = session["AVALON_ASSET"] - project_doc = io.find_one({ - "type": "project" - }) + project_doc = io.find_one( + {"type": "project"}, + { + "name": True, + "data.code": True + } + ) self.data = { "project": { "name": project_doc["name"], From 7e1ac056b6044a60ba38924e8d6254aa210da4aa Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:13:13 +0200 Subject: [PATCH 14/28] reorganized attributes and used new task models --- openpype/tools/workfiles/app.py | 74 ++++++++++++++++----------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index ca202ae2ca..2fa2d19b35 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -12,10 +12,15 @@ from avalon import style, io, api, pipeline from avalon.tools import lib as tools_lib from avalon.tools.widgets import AssetWidget -from avalon.tools.models import TasksModel from avalon.tools.delegates import PrettyTimeDelegate -from .model import FilesModel +from .model import ( + TASK_NAME_ROLE, + TASK_TYPE_ROLE, + FilesModel, + TasksModel, + TasksProxyModel +) from .view import FilesView from openpype.lib import ( @@ -313,32 +318,30 @@ class TasksWidget(QtWidgets.QWidget): task_changed = QtCore.Signal() - def __init__(self, parent=None): + def __init__(self, dbcon=None, parent=None): super(TasksWidget, self).__init__(parent) - self.setContentsMargins(0, 0, 0, 0) - view = QtWidgets.QTreeView() - view.setIndentation(0) - model = TasksModel(io) - view.setModel(model) + tasks_view = QtWidgets.QTreeView(self) + tasks_view.setIndentation(0) + tasks_view.setSortingEnabled(True) + if dbcon is None: + dbcon = io + + tasks_model = TasksModel(dbcon) + tasks_proxy = TasksProxyModel() + tasks_proxy.setSourceModel(tasks_model) + tasks_view.setModel(tasks_proxy) layout = QtWidgets.QVBoxLayout(self) layout.setContentsMargins(0, 0, 0, 0) - layout.addWidget(view) + layout.addWidget(tasks_view) - # Hide the default tasks "count" as we don't need that data here. - view.setColumnHidden(1, True) + selection_model = tasks_view.selectionModel() + selection_model.currentChanged.connect(self.task_changed) - selection = view.selectionModel() - selection.currentChanged.connect(self.task_changed) - - self.models = { - "tasks": model - } - - self.widgets = { - "view": view, - } + self._tasks_model = tasks_model + self._tasks_proxy = tasks_proxy + self._tasks_view = tasks_view self._last_selected_task = None @@ -354,7 +357,7 @@ class TasksWidget(QtWidgets.QWidget): if current: self._last_selected_task = current - self.models["tasks"].set_assets(asset_docs=[asset]) + self._tasks_model.set_asset(asset_doc) if self._last_selected_task: self.select_task(self._last_selected_task) @@ -374,21 +377,20 @@ class TasksWidget(QtWidgets.QWidget): """ # Clear selection - view = self.widgets["view"] - model = view.model() - selection_model = view.selectionModel() + selection_model = self._tasks_view.selectionModel() selection_model.clearSelection() # Select the task mode = selection_model.Select | selection_model.Rows - for row in range(model.rowCount(QtCore.QModelIndex())): - index = model.index(row, 0, QtCore.QModelIndex()) + for row in range(self._tasks_model.rowCount()): + index = self._tasks_model.index(row, 0) name = index.data(QtCore.Qt.DisplayRole) - if name == task: + if name == task_name: selection_model.select(index, mode) # Set the currently active index - view.setCurrentIndex(index) + self._tasks_view.setCurrentIndex(index) + break def get_current_task(self): """Return name of task at current index (selected) @@ -397,16 +399,12 @@ class TasksWidget(QtWidgets.QWidget): str: Name of the current task. """ - view = self.widgets["view"] - index = view.currentIndex() - index = index.sibling(index.row(), 0) # ensure column zero for name + index = self._tasks_view.currentIndex() + selection_model = self._tasks_view.selectionModel() + if index.isValid() and selection_model.isSelected(index): + return index.data(TASK_NAME_ROLE) + return None - selection = view.selectionModel() - if selection.isSelected(index): - # Ignore when the current task is not selected as the "No task" - # placeholder might be the current index even though it's - # disallowed to be selected. So we only return if it is selected. - return index.data(QtCore.Qt.DisplayRole) class FilesWidget(QtWidgets.QWidget): From 9449df703f5f8d53d63b46c17f7838d8e148040f Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:18:58 +0200 Subject: [PATCH 15/28] added task type as part of task widget context --- openpype/tools/workfiles/app.py | 56 +++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 2fa2d19b35..11d6257b06 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -345,15 +345,15 @@ class TasksWidget(QtWidgets.QWidget): self._last_selected_task = None - def set_asset(self, asset): - if asset is None: - # Asset deselected + def set_asset(self, asset_doc): + # Asset deselected + if asset_doc is None: return # Try and preserve the last selected task and reselect it # after switching assets. If there's no currently selected # asset keep whatever the "last selected" was prior to it. - current = self.get_current_task() + current = self.get_current_task_name() if current: self._last_selected_task = current @@ -365,7 +365,7 @@ class TasksWidget(QtWidgets.QWidget): # Force a task changed emit. self.task_changed.emit() - def select_task(self, task): + def select_task(self, task_name): """Select a task by name. If the task does not exist in the current model then selection is only @@ -384,7 +384,7 @@ class TasksWidget(QtWidgets.QWidget): mode = selection_model.Select | selection_model.Rows for row in range(self._tasks_model.rowCount()): index = self._tasks_model.index(row, 0) - name = index.data(QtCore.Qt.DisplayRole) + name = index.data(TASK_NAME_ROLE) if name == task_name: selection_model.select(index, mode) @@ -392,7 +392,7 @@ class TasksWidget(QtWidgets.QWidget): self._tasks_view.setCurrentIndex(index) break - def get_current_task(self): + def get_current_task_name(self): """Return name of task at current index (selected) Returns: @@ -405,6 +405,12 @@ class TasksWidget(QtWidgets.QWidget): return index.data(TASK_NAME_ROLE) return None + def get_current_task_type(self): + index = self._tasks_view.currentIndex() + selection_model = self._tasks_view.selectionModel() + if index.isValid() and selection_model.isSelected(index): + return index.data(TASK_TYPE_ROLE) + return None class FilesWidget(QtWidgets.QWidget): @@ -417,7 +423,8 @@ class FilesWidget(QtWidgets.QWidget): # Setup self._asset = None - self._task = None + self._task_name = None + self._task_type = None # Pype's anatomy object for current project self.anatomy = Anatomy(io.Session["AVALON_PROJECT"]) @@ -512,14 +519,15 @@ class FilesWidget(QtWidgets.QWidget): self.btn_browse = btn_browse self.btn_save = btn_save - def set_asset_task(self, asset, task): + def set_asset_task(self, asset, task_name, task_type): self._asset = asset - self._task = task + self._task_name = task_name + self._task_type = task_type # Define a custom session so we can query the work root # for a "Work area" that is not our current Session. # This way we can browse it even before we enter it. - if self._asset and self._task: + if self._asset and self._task_name and self._task_type: session = self._get_session() self.root = self.host.work_root(session) self.files_model.set_root(self.root) @@ -542,7 +550,7 @@ class FilesWidget(QtWidgets.QWidget): changes = pipeline.compute_session_changes( session, asset=self._asset, - task=self._task + task=self._task_name, ) session.update(changes) @@ -555,14 +563,14 @@ class FilesWidget(QtWidgets.QWidget): changes = pipeline.compute_session_changes( session, asset=self._asset, - task=self._task + task=self._task_name, ) if not changes: # Return early if we're already in the right Session context # to avoid any unwanted Task Changed callbacks to be triggered. return - api.update_current_task(asset=self._asset, task=self._task) + api.update_current_task(asset=self._asset, task=self._task_name) def open_file(self, filepath): host = self.host @@ -706,7 +714,7 @@ class FilesWidget(QtWidgets.QWidget): self._enter_session() # Make sure we are in the right session self.host.save_file(file_path) - self.set_asset_task(self._asset, self._task) + self.set_asset_task(self._asset, self._task_name, self._task_type) pipeline.emit("after.workfile.save", [file_path]) @@ -733,7 +741,7 @@ class FilesWidget(QtWidgets.QWidget): changes = pipeline.compute_session_changes( session, asset=self._asset, - task=self._task + task=self._task_name, ) session.update(changes) @@ -756,7 +764,7 @@ class FilesWidget(QtWidgets.QWidget): # Force a full to the asset as opposed to just self.refresh() so # that it will actually check again whether the Work directory exists - self.set_asset_task(self._asset, self._task) + self.set_asset_task(self._asset, self._task_name, self._task_type) def refresh(self): """Refresh listed files for current selection in the interface""" @@ -1005,7 +1013,7 @@ class Window(QtWidgets.QMainWindow): if asset_docs: asset_doc = asset_docs[0] - task_name = self.tasks_widget.get_current_task() + task_name = self.tasks_widget.get_current_task_name() workfile_doc = None if asset_doc and task_name and filepath: @@ -1032,7 +1040,7 @@ class Window(QtWidgets.QMainWindow): def _get_current_workfile_doc(self, filepath=None): if filepath is None: filepath = self.files_widget._get_selected_filepath() - task_name = self.tasks_widget.get_current_task() + task_name = self.tasks_widget.get_current_task_name() asset_docs = self.assets_widget.get_selected_assets() if not task_name or not asset_docs or not filepath: return @@ -1052,7 +1060,7 @@ class Window(QtWidgets.QMainWindow): workdir, filename = os.path.split(filepath) asset_docs = self.assets_widget.get_selected_assets() asset_doc = asset_docs[0] - task_name = self.tasks_widget.get_current_task() + task_name = self.tasks_widget.get_current_task_name() create_workfile_doc(asset_doc, task_name, filename, workdir, io) def set_context(self, context): @@ -1071,7 +1079,6 @@ class Window(QtWidgets.QMainWindow): # Select the asset self.assets_widget.select_assets([asset], expand=True) - # Force a refresh on Tasks? self.tasks_widget.set_asset(asset_document) if "task" in context: @@ -1101,12 +1108,13 @@ class Window(QtWidgets.QMainWindow): asset = self.assets_widget.get_selected_assets() or None if asset is not None: asset = asset[0] - task = self.tasks_widget.get_current_task() + task_name = self.tasks_widget.get_current_task_name() + task_type = self.tasks_widget.get_current_task_type() self.tasks_widget.setEnabled(bool(asset)) - self.files_widget.setEnabled(all([bool(task), bool(asset)])) - self.files_widget.set_asset_task(asset, task) + self.files_widget.setEnabled(all([bool(task_name), bool(asset)])) + self.files_widget.set_asset_task(asset, task_name, task_type) self.files_widget.refresh() From 2bb5059b85d574432f017d9eb65028984ffcbd76 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:19:30 +0200 Subject: [PATCH 16/28] use template key functions from openpype lib --- openpype/tools/workfiles/app.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 11d6257b06..3a5272c4b9 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -28,7 +28,8 @@ from openpype.lib import ( get_workdir, get_workfile_doc, create_workfile_doc, - save_workfile_data_to_doc + save_workfile_data_to_doc, + get_workfile_template_key ) log = logging.getLogger(__name__) @@ -547,10 +548,16 @@ class FilesWidget(QtWidgets.QWidget): """Return a modified session for the current asset and task""" session = api.Session.copy() + self.template_key = get_workfile_template_key( + self._task_type, + session["AVALON_APP"], + project_name=session["AVALON_PROJECT"] + ) changes = pipeline.compute_session_changes( session, asset=self._asset, task=self._task_name, + template_key=self.template_key ) session.update(changes) @@ -564,6 +571,7 @@ class FilesWidget(QtWidgets.QWidget): session, asset=self._asset, task=self._task_name, + template_key=self.template_key ) if not changes: # Return early if we're already in the right Session context @@ -742,6 +750,7 @@ class FilesWidget(QtWidgets.QWidget): session, asset=self._asset, task=self._task_name, + template_key=self.template_key ) session.update(changes) From cb6b27f62e94bdfdd3e6b59debb2649452c01724 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:19:39 +0200 Subject: [PATCH 17/28] minor fixes --- openpype/tools/workfiles/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 3a5272c4b9..e559eb61f3 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -628,7 +628,7 @@ class FilesWidget(QtWidgets.QWidget): result = messagebox.exec_() if result == messagebox.Yes: return True - elif result == messagebox.No: + if result == messagebox.No: return False return None @@ -950,7 +950,7 @@ class Window(QtWidgets.QMainWindow): assets_widget = AssetWidget(io, parent=home_body_widget) assets_widget.set_current_asset_btn_visibility(True) - tasks_widget = TasksWidget(home_body_widget) + tasks_widget = TasksWidget(io, home_body_widget) files_widget = FilesWidget(home_body_widget) side_panel = SidePanelWidget(home_body_widget) From fd30b9290487e866c567875c935be8539f191ec5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 26 Aug 2021 19:31:20 +0200 Subject: [PATCH 18/28] added new anatomy-templates-enum to readme --- openpype/settings/entities/schemas/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/openpype/settings/entities/schemas/README.md b/openpype/settings/entities/schemas/README.md index 2034d4e463..05605f8ce1 100644 --- a/openpype/settings/entities/schemas/README.md +++ b/openpype/settings/entities/schemas/README.md @@ -380,6 +380,20 @@ How output of the schema could look like on save: } ``` +### anatomy-templates-enum +- enumeration of all available anatomy template keys +- have only single selection mode +- it is possible to define default value `default` + - `"work"` is used if default value is not specified +``` +{ + "key": "host", + "label": "Host name", + "type": "anatomy-templates-enum", + "default": "publish" +} +``` + ### hosts-enum - enumeration of available hosts - multiselection can be allowed with setting key `"multiselection"` to `True` (Default: `False`) From 412dccc6182d456f660aca01b9f7444627f31686 Mon Sep 17 00:00:00 2001 From: Toke Stuart Jepsen Date: Fri, 27 Aug 2021 11:08:38 +0100 Subject: [PATCH 19/28] Fix PyQt5 on Windows build. --- tools/build_dependencies.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tools/build_dependencies.py b/tools/build_dependencies.py index 3898450471..e5a430e220 100644 --- a/tools/build_dependencies.py +++ b/tools/build_dependencies.py @@ -135,6 +135,16 @@ progress_bar.close() # iterate over frozen libs and create list to delete libs_dir = build_dir / "lib" +# On Windows "python3.dll" is needed for PyQt5 from the build. +if platform.system().lower() == "windows": + src = Path(libs_dir / "PyQt5" / "python3.dll") + dst = Path(deps_dir / "PyQt5" / "python3.dll") + if src.exists(): + shutil.copyfile(src, dst) + else: + _print("Could not find {}".format(src), 1) + sys.exit(1) + to_delete = [] # _print("Finding duplicates ...") deps_items = list(deps_dir.iterdir()) From d8b62cd2dd129fdf7307e782c95879ce74aec6b8 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 27 Aug 2021 14:17:05 +0200 Subject: [PATCH 20/28] fixed hierarchy position of houdini submit to deadline plugins --- .../deadline/plugins/publish/submit_houdini_remote_publish.py | 0 .../deadline/plugins/publish/submit_houdini_render_deadline.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename openpype/modules/{ => default_modules}/deadline/plugins/publish/submit_houdini_remote_publish.py (100%) rename openpype/modules/{ => default_modules}/deadline/plugins/publish/submit_houdini_render_deadline.py (100%) diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_remote_publish.py b/openpype/modules/default_modules/deadline/plugins/publish/submit_houdini_remote_publish.py similarity index 100% rename from openpype/modules/deadline/plugins/publish/submit_houdini_remote_publish.py rename to openpype/modules/default_modules/deadline/plugins/publish/submit_houdini_remote_publish.py diff --git a/openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py b/openpype/modules/default_modules/deadline/plugins/publish/submit_houdini_render_deadline.py similarity index 100% rename from openpype/modules/deadline/plugins/publish/submit_houdini_render_deadline.py rename to openpype/modules/default_modules/deadline/plugins/publish/submit_houdini_render_deadline.py From 1c571b62febbc70340b39b5c4ba7c3f23ed44d7c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 27 Aug 2021 14:41:24 +0200 Subject: [PATCH 21/28] pass template key --- openpype/tools/workfiles/app.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index e559eb61f3..b542e6e718 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -578,7 +578,11 @@ class FilesWidget(QtWidgets.QWidget): # to avoid any unwanted Task Changed callbacks to be triggered. return - api.update_current_task(asset=self._asset, task=self._task_name) + api.update_current_task( + asset=self._asset, + task=self._task_name, + template_key=self.template_key + ) def open_file(self, filepath): host = self.host From ca1dfbd98c24f9b8bc22961a1cb91eac5436cdbf Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 28 Aug 2021 03:38:52 +0000 Subject: [PATCH 22/28] [Automated] Bump version --- CHANGELOG.md | 27 +++++++++++++++------------ openpype/version.py | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c55be842a..4259a0f725 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,26 @@ # Changelog -## [3.4.0-nightly.2](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.4.0-nightly.3](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.1...HEAD) **Merged pull requests:** +- Removed deprecated submodules [\#1967](https://github.com/pypeclub/OpenPype/pull/1967) +- Launcher: Fix crashes on action click [\#1964](https://github.com/pypeclub/OpenPype/pull/1964) +- Settings: Minor fixes in UI and missing default values [\#1963](https://github.com/pypeclub/OpenPype/pull/1963) +- Blender: Toggle system console works on windows [\#1962](https://github.com/pypeclub/OpenPype/pull/1962) +- Resolve path when adding to zip [\#1960](https://github.com/pypeclub/OpenPype/pull/1960) +- Bump url-parse from 1.5.1 to 1.5.3 in /website [\#1958](https://github.com/pypeclub/OpenPype/pull/1958) +- Global: Avalon Host name collector [\#1949](https://github.com/pypeclub/OpenPype/pull/1949) +- Global: Define hosts in CollectSceneVersion [\#1948](https://github.com/pypeclub/OpenPype/pull/1948) - Maya: Add Xgen family support [\#1947](https://github.com/pypeclub/OpenPype/pull/1947) - Add face sets to exported alembics [\#1942](https://github.com/pypeclub/OpenPype/pull/1942) -- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) +- Bump path-parse from 1.0.6 to 1.0.7 in /website [\#1933](https://github.com/pypeclub/OpenPype/pull/1933) +- \#1894 - adds host to template\_name\_profiles for filtering [\#1915](https://github.com/pypeclub/OpenPype/pull/1915) +- Disregard publishing time. [\#1888](https://github.com/pypeclub/OpenPype/pull/1888) - Dynamic modules [\#1872](https://github.com/pypeclub/OpenPype/pull/1872) +- Houdini: add Camera, Point Cache, Composite, Redshift ROP and VDB Cache support [\#1821](https://github.com/pypeclub/OpenPype/pull/1821) ## [3.3.1](https://github.com/pypeclub/OpenPype/tree/3.3.1) (2021-08-20) @@ -45,6 +56,7 @@ - Nuke: update video file crassing [\#1916](https://github.com/pypeclub/OpenPype/pull/1916) - Fix - texture validators for workfiles triggers only for textures workfiles [\#1914](https://github.com/pypeclub/OpenPype/pull/1914) - submodules: avalon-core update [\#1911](https://github.com/pypeclub/OpenPype/pull/1911) +- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) - Settings UI: List order works as expected [\#1906](https://github.com/pypeclub/OpenPype/pull/1906) - Add support for multiple Deadline β˜ οΈβž– servers [\#1905](https://github.com/pypeclub/OpenPype/pull/1905) - Hiero: loaded clip was not set colorspace from version data [\#1904](https://github.com/pypeclub/OpenPype/pull/1904) @@ -63,6 +75,7 @@ - TVPaint: Increment workfile [\#1885](https://github.com/pypeclub/OpenPype/pull/1885) - Allow Multiple Notes to run on tasks. [\#1882](https://github.com/pypeclub/OpenPype/pull/1882) - Normalize path returned from Workfiles. [\#1880](https://github.com/pypeclub/OpenPype/pull/1880) +- Feature/webpublisher backend [\#1876](https://github.com/pypeclub/OpenPype/pull/1876) - Prepare for pyside2 [\#1869](https://github.com/pypeclub/OpenPype/pull/1869) - Filter hosts in settings host-enum [\#1868](https://github.com/pypeclub/OpenPype/pull/1868) - Local actions with process identifier [\#1867](https://github.com/pypeclub/OpenPype/pull/1867) @@ -70,23 +83,13 @@ - Maya: add support for `RedshiftNormalMap` node, fix `tx` linear space πŸš€ [\#1863](https://github.com/pypeclub/OpenPype/pull/1863) - Workfiles tool event arguments fix [\#1862](https://github.com/pypeclub/OpenPype/pull/1862) - Maya: support for configurable `dirmap` πŸ—ΊοΈ [\#1859](https://github.com/pypeclub/OpenPype/pull/1859) -- Maya: don't add reference members as connections to the container set πŸ“¦ [\#1855](https://github.com/pypeclub/OpenPype/pull/1855) - Settings list can use template or schema as object type [\#1815](https://github.com/pypeclub/OpenPype/pull/1815) - Maya: expected files -\> render products βš™οΈ overhaul [\#1812](https://github.com/pypeclub/OpenPype/pull/1812) -- Settings error dialog on show [\#1798](https://github.com/pypeclub/OpenPype/pull/1798) ## [3.2.0](https://github.com/pypeclub/OpenPype/tree/3.2.0) (2021-07-13) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.2.0-nightly.7...3.2.0) -**Merged pull requests:** - -- Build: don't add Poetry to `PATH` [\#1808](https://github.com/pypeclub/OpenPype/pull/1808) -- Nuke: ftrack family plugin settings preset [\#1805](https://github.com/pypeclub/OpenPype/pull/1805) -- nuke: fixing wrong name of family folder when `used existing frames` [\#1803](https://github.com/pypeclub/OpenPype/pull/1803) -- Collect ftrack family bugs [\#1801](https://github.com/pypeclub/OpenPype/pull/1801) -- Standalone publisher last project [\#1799](https://github.com/pypeclub/OpenPype/pull/1799) - ## [2.18.4](https://github.com/pypeclub/OpenPype/tree/2.18.4) (2021-06-24) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/2.18.3...2.18.4) diff --git a/openpype/version.py b/openpype/version.py index 5fd6520953..2e769a1b62 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.4.0-nightly.2" +__version__ = "3.4.0-nightly.3" From 6533934577e22ec53c2f4a93811d696a07054b9e Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 28 Aug 2021 15:12:56 +0200 Subject: [PATCH 23/28] Added Moonrock Animation Studio to OpenPype users --- website/src/pages/index.js | 7 ++++++- website/static/img/moonrock_logo.png | Bin 0 -> 22947 bytes 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 website/static/img/moonrock_logo.png diff --git a/website/src/pages/index.js b/website/src/pages/index.js index 6a233ddb66..00cf002aec 100644 --- a/website/src/pages/index.js +++ b/website/src/pages/index.js @@ -120,7 +120,12 @@ const studios = [ title: "Bad Clay", image: "/img/badClay_logo.png", infoLink: "https://www.bad-clay.com/", - } + }, + { + title: "Moonrock Animation Studio", + image: "/img/moonrock_logo.png", + infoLink: "https://www.moonrock.eu/", + } ]; function Service({imageUrl, title, description}) { diff --git a/website/static/img/moonrock_logo.png b/website/static/img/moonrock_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..249db7c2470b37bc24cd4649feb418238a690c34 GIT binary patch literal 22947 zcmdqJgNJyh7NFyO7B8a4fboWS?Gztg?3P`7P4?Q9hA}P%PLnA{o zFu)Ms=J~zf`$xQ97neG-&p!L?z1F?%b+2`ZefCuK8aWF&1OmCHuBNODf#98jpA}MK z@Co}TITG*}nY)^i7X-rNdi8@>qel81e0alK#nAh?o2|FcD^DAUkB^VAgR7I5)hl-! zVK+~^v~3v{2;?S2UHOroZ~Eq}Pdek+`Q_e(_~&YdB%YfigpZt=H(4I!+}+TQ7h(y> zVRm{V#zL?4J8V{ib_NF4GQNtfeY^>E&?WOW{wq!*RdKS`Wqjiqd9C@{PQBT|&I<)16yBKA zg}G3rWq*5x;lVuQZ5R=vBfgdharU5$=Z^$Gbm2}F)lDe67{RzB6xzn>V6s5&OD9BJ zfaeuD<#f?n97HZy^Oi@qMQ>fj`6Gb|!3>^s>B$;R7E`a#a%3t&AZcJ_L2LVJyMa*@ zU9S|Qf71F3yk>~>BKheN!Xhi*rYOQ5Qm`0zfrE=cDhLh)m13=9$y?Qqn+T){0`LRy zeuiEzh#j$`+NImwPYr3KxSz^Hr_KlF>G+89U&lcLP;t1=1+mo*w7dMfRP;nRZ2rC5T%tL5zzM=@-pL%#lFl5&Sx$di;;D8W= zcU*=b9KpBHWbYM37=j(~5_z!d_|LvCGz8MURNfX769aMe{Ms5iTm-kvFC)CTmQGo# zqO2S@(DW-v{3udgs7e3lbk006Ep2aYFv2{vqEbY`ajzjCK69`678Lq*82=%$FAMfb zJ*-Mc^D&MYPTCM08WWQ@q=3>uIc>g;GxnU}NA19Q1u)9VF=`#32;>o3<(8%jqazaq z5GMRB8rme~Vtippft9)7=*ax%MPkPzMP=nDFaqIjtxt}oY@^i^8y>fhe88$K>j>Nh zw*4H?mRb62Tihs7Z%%V%F5PAbeWm=r5=OTG&WCi2fwW1_uKkFAH@@WIsP3?{#4)4y zgNc?8VPPRS6nY+Os^wy}^#I8o1fJ*-CsOv(#zu2opNA^Z((=)N7 zeha_@PQX?UUGrteaePWO)}0POh$=&KI9faN2_N1#W~!|5xSquIk35~&yQ4qX+=*3H znak%q)UI+zvbdPLHHeB5e88;{W}fqDWpvcjAs(@%zzDrH1f`_=_gmB%$TI_uSp;l^mG1x3E~1+kA##CkrZK`Re8_zk4l=MqSRd zDJ77NS|%ZFSX0?q55F72?m@5Xpx5U75lkceJ4}9YeC&GC^0A0Jo9Lia3|As~E8*A; zU(!kNpBU%S6u9O|g$YTL^{}iznWZ#JNN-ssxs#f@;eS*JO^Ul=fVwHnX;n^CI(6aJls>`3k*OsuAVD{`&I)lym1}f;@^XwF! zS@#1wCkLY>=kLUA(P=u`aWNbf^r2=5ilUyk)1FX=F>07; zh&Ch|Jj?O=UelsDsljrKIzDdP{n2|bG!xQbOhTK~;X*Cgd2U&fUv&8I zZ+G){6T0QsTc&{iud)I4KE2#2zFRX55`(3mzmG%CXlT{z@DOa9+IJi!Ym<}dcK(PB zVm=F*j5~+T552n~)*_2V{*`Gr{%$PmP6KdYh2ShzQVXV%T&9tF z{mxZ?QNPUCV>wCnaeYv4tx~Ad)t7qfHCApGf~n&V>!@TzPn(5sn>E_Yxc7ff`P|!J zq`lwBgTyfe97OzO;c6FA)SMhAa`p4UxE}1Sudms&`V{$c=gd#*h|Idnghcr2Rz92D z^IHAWgRSvg(U`7x(Nt1WTE->+F~-{@eo{{b{ZXWv>B^0mE$S(p1NOq&7i?VTsIoKH zYBiN&tnN0{(bU@`)l0;cabLkbaH;oKNw^; z08K-e0QbkB{12hG9#T$By^naFtzB3aN;2eC_LbHy+ikW9<_vC*BXF;Tkve3M2c6b- z##ioGvnzM#=<0T4J=(igV?R}Gb2UhSXq)8Jm?TLH%#mpl`mIb!&DS5h&5jN_u<85! zt6qeUJPnVUpo#b6GjMy)->Ez|=+~4;89%A}t>z-}PWR z-PqVL#PX^vu^}O{>dcI%-gmlZNu2D!?F%_tt(D2#d58L?VoJ3m<=BOZUN=zP8jd-* zaoW@*rC(}DJ9Ck@?oE6Vl~JM1z<9dM8kO;)zjS0ow|>etZSttF?}#ouJk+a9smGWf z)2koZY;FFET{&mC!EN4;_cfBJLdR){keyEJqe@#-M{2;c9`Xpq9NYy zBY2pAE|(yAtMKgG?4Yo}rAiF9!Gqi(*j6OakBjri=th*|H5o_W5eKW-wZf2U4C^GC z#SPgaGQm(*M*o1Vp*%X3!knBpWeo`-BT9$s+;~q3+HBZ!z7!43G*b$p4ZVpenHAn% z7qXnM@W&)W@)7p;MMc1T^{04i;8~B2Ue=QsR$IsR2CIlylDNNv#aL!5x;ZgyPxi*Rkyg=Szr(Wnj*=gmF5TX#8Qj%nBAjeTZhq~0EU{=ao7lzE7~(TLDnUz(shjt5iK^o!3t zGc)7B1&`&XL`acoowM^Xo*sWA!qigTdR_V$S)wXJ_Ja6qKuY;@@lbckwOuDPjb-2W zp{vhdv$?iX$A*#zwG2EukYSPq#L(@IO6zG)(NK3G`EetdzfcnkWjzeC_yUU&)Xh#D zj8tF(*O$B~(Z>LQww~V@*6jEMX|JP7QsKw!*(VBMbeD;*u_zlEeeG=nOJaCPIoU6z zJPu}D!bk4E(_JnVo(Ts#%Ca#Q{UlP({}W;g*vJh*idOI;9SOnf_B%K76ggX;532Dv6OFGb}~PY|XBioUN56j@huO z304gXk`>S|6`g8ORDk!Dl>OKkJYR<$6oJ7`wcwc=IBkL+o*+9E%CQs!{ZN z>)~7&R1!^aCXc3ZC{*N(=gfA?uEslDSK0TBf`!&T&!#r#1NM+~=`c~wE*o%kf2JL* z+>!*}#3))#jPZ0gh>87Ub(l-T>}L?aYR`P9P<&}p!<=6Dwyes`W=ksXThq3 zn{=P8$_M~k3wr2{>g6#iHzuhJJn?jNa?%ouiCBM#hB)LZn!`0vqTs5Rp*<1^8@9`i&3_sA*QD!>CVZAHUZDT0{%Tj zBDv{+;l47??K>KwME4zK0nF4jx3B|8k*#R{g&>Uo>JDICz(OChyRhFB0`nipq9Mu7 z|K~%8q_j}*nb&(5M7{n;IEjfWn7Z0AAS)UcbN^ZP;C#J;$kiMmPUM0Wjo;N<=PuEB zW+y_}5WeSRlyy|MdiDPciQ%PIkV@-bIy7l=G%(rM(+<3C*w&q@ z8Q13Fwx9sp!HoV0GJ0kSS2jTO#%Vtk&`I3cd4Rr|92|g`k!tK!W>8^frYm!{`*Srj z+ISaCy2$R)NjtaP`$6JFENG_{+maz0kZPx8fg`HcY4XlwHLYhdS8sHt2LI-najv;m z(Xvl|dA25>CL0BqMnHz|BAIcmJ*`!f-q493z23T4E`fR=ckz&usF_r{_lSDS$!gjr zAQNF`?LVoc-MensDW~(pFv_DmMMG=0cEBD2)%|LzMsu~B_V+zqo43Tf64*5XdwLpz zRh2*0Q7+akp|8w`#c%<0clF9@hLNhvfg^~CizDaoMTNBltV(agtt@TLpS<5HBj8FR z4|10_BzeCqAS9&qCkB|STrt0ZfFEX9Rq}K__h9a^x;hyF2^Hnt7d*~(>^EaEzNYS{ z1$Wv2od5vlQfhUU=#S}ruCL#fn<)4DRy3RLZhf+MDR%_<`Qsv0&UC7qd!O>I>^+Fi z)Mpl!&EOXbh+Aa!H%gso=i7Sg;eYYC+LHBw6>5LZJX_{X2YfNxW$>>QF)IscZ7o&O zeSXZ3k9fU?FJIDWMVg7*9Pci?3^_l{cJ=CdcO%?GLMRs#I@L+J~oM&BmW)V-2FNYrKbe|1(Qbuwqu=VZe%OAQ!)C7w3ZR5?Yp!d zj_c{`8+RKf^7K_zfnD_4@8wmkKkxm(E9Nkg*HfQK3kGrl`9?lSjKN&JS)Q67a~+uW z51|I6qPn`eH4ct0Z-&mij#_VN{lD`T4^bcnLoN=~GTVxZix=hscH*6JH%4Zp6q1XE zaA*er9U`%jX4v(mx-or|y|no=o{=DAFm6lGu=3_ekhQW18ls+~xKmLBP*9H1zi}ao z6>7@aR$iU}?j~HlW%rJw!X%o!wY?uaM)eCly-JX}nRFi$n>Hm5>Zr0a_TFzmvq--# z)i0qazfCi%5c^Rl8(ZiWHBuTzK%%RY)WRz|mYb+LQ}1%)fumj?&feZ0^}VD#&YSbb zbE?_~sw4(}%moNQw%mKwvi9Ui_}K-vz0hvZK6+o~XwoY1^j~4p_U-UdbrYq?Hots? zEeO(6$%gB!EG&ji-o>zYe*pMwJ;WltZqE<)B;CF}uS#6}p+1T{=s*fpfVe_ftssi+ zi*ppT|^i9j%`eFMj&?QPh6uW)v0s z@1bm^8#2D4CeBqv-=uvCKokI+uFC(=@w$lFpJZ;${6pRV7dRa(jN|&l$Bizk_Wdd@Byi6 z+9lhfE3iPf^~{y7^pJ~_)tv{wwh~FRG_k?PMkJNG0DIowQkrxuDFacMB0oQ0(6~0{ z(Teb9kpM~BA%FmyUH~4N=b^C&iczEzf?CU)njb&Wz zRW7*qlk-A!|6I?&zzgh@YFj3y6R^sW1;WktPhHbZK0Dj9fd~C&Fc_>xHlB#$x-UKN zQw%_&CH5f9@SJU$i*3ei&iOy>khpxi6ygUD9?TipeY3d`i>-d4ukX(pa^@kJx%R@q z)aD}i`CPdwSLokLc|$8F0I?Xb*0c%r;Nx;Oju&Q&j*0RYzCDFl zOf!fNVgcqSBbp-dD`KT(WrzMpn+{iVxvFr5(oS-gR@JR#hRD^@kA38O-ZFo2)L@n= z7xZV|;Nw=!pd7`PSYNWoQkNgtrB(S%Q4>JbTT)X~4dvQ#+s%V#=eAk1@oJE@S0R;M zBjWRcUKLeUcQN$(R#vhj+9!gSBLi5wM*1MCf3r`e{uiJ>8yQ@hWM6ED5uPX_P& z5r5SYF)7!atrVTwK2KTe5kt63u}M8{IE@G+xGnG3pCLQbyqv7rlE5wv28d1%Nbj(n z*nNI|`|&%`OUcOL1j*GelX5k&^t|BfceScCWGK3;>y4XVZ&^ww37NMcoAh>;Ccw8ffL{laDX7|<7Fm-xN9bKcAc83AW&|%;arVt)pjaI7!6)N!fwx6 zO-+E^WR?#O6vXl4|C3!;EKr}*Ij0QxBa zU5!9EDzjR)Ss%(y_ZpC_+HxB$(z!1#-c{fJt^|)Zx6Y#*{h9LfPGjFco!|zZ1>oV` z7t6?$LPI=KCB1l-y5g5UK7V?5Dg=;IW-(hz-f!M?b{T#=fU{(%C)~UeA%Me_TID?k zo(ezRD3Js#2M-7c+~LI6a!eXr^^*cga;?84m_CJv=n)NiiZrq2@n%UQ$J^qYh~#vW)Mzt6;`3}8+dtv)9!DZGxxV@~CbU8h!j z#w7+7N862S92Gu0b4h2;)DKaihV$CM6C|vAXb!BT!ng30@sDo+JX2>CwFqqpJlQwY z_6_EFn!XO(nVUVU3G=m6{}69d=lIFz7o$Oh)RHB@QVE;i9}VZbKWNK21k2df&W5W& zRK$q3yQcpYW^$m(M6Q4MMwsJ2D#7cqba*?aVxWD+}zwRVPh}O4l6?P^YXZk z&Z#+MCav469Y7F}r002J(SCl^7r-hp>rF3YQcrpJQ+v{F)kQzEQk)>PZX6HD$8CO^ zr38j1RhC5EY+jTA2gh~V77W@?8Lhe#;)DFhuC%Zwd9ngPB4sX)mp0)`36htyONsIs z3qPY(-#h+Y?N93trbCnrB)Li ziB?eBOP87YmA!6GJ0LSqocT;QxcwJlpVWC+b-jBv_WecGPD6}fCDnTn!}|qJHL+Si zu@wdc+6hbsfR^R(AhKy ztsRmI&HMRzlKPJNlalY>_vHXzHY5>Pu{=B8GgDDfSDML~a$Nx!$`B5`OcV6pB~-g-^!A)!iL{&YAI zzMk_II@2aRQ>eNI0*mbR0XdxWYaqrl(@Sd0>=9-LpE_*fgcJ_|QSyKC^CHb*(U>l? z!h8bw==ENl9J;iobUt-C3#hT^;oNSC-~`}@Z(+l!FvioCc4O2yE#7D@wPgk@luKjr z;1Jz(w%^yd|64$5zT6-4Z{+(6f#AKj=7CF>i5#-2RP0in8Eab&^Q!>S-UYR*6wwyd zQ{DQv$9y#ZgnlZD@<#GH?l5D`Phvi>#=zK^WjY|^p-0Z4NitiRVO0kj*?4dn90f2U z%jok>0>Uvx2me}E_Kjg2Zdyt~S1Uv2D}^u|A@#UsKng9m-HJ8i=jT_P$^Z-b+XQnO zkj1`)fUKtR;uNjr83_Db2AmZSPFRs2bH$D&CIJ7O_2_0t0zVnQn+oe7{x3!`=-K1AJw87nU5fff+XH|pHx=gxfUVy4S_E{jxm+?rsa zdH?wfyAPXy0Z)MAzaZ>vN@0dSf8jr!i3h&BsQ2{h=>zhYXOm224xVe@e5$S0hef{8 z@*b{FWGntR!Tn=YI5k~JJBI}zFKb}0^8&Ejl9#4JwjW$=Y;1UNF81~of4gY#4F6!jKo?yZ*qw$hhK!l-vXoVJL3P1zdlB_s`;Pf z0378SplCcGTvR74I<5ZsO35iFvnyyrab3{jpkE^K;V0{U0L24N6|J`Hxsw>ewraqh zH-<^XW~CI2OAV{uSS8AeC!r_Yia?s(a=iF9Y+Pg>IGWxvx1C5UCOIzf%rQ(7$PdaO zs~RjN$m<1pcjImcMVS>Lh~-RRe|tCr?zdk=3eRZD0qSauCjDj4(=^+}!FXzsEIr|* zctuNPF3%3e@8bU($|lg3J!BwZb4T!)=PHUco&s+Hh3OIYL*|DvXkZ~<4 zJDOv$_U}_%S0<2Fgs(_9;9nAG=3m28F^T_wFMvj5Fafys34y*zv>NN+!Jk#eL6C~x z0C_L3Jb;=B+-0hus;37)nJX;{T)ja6lAhdd^cx&x=pCP=8by8 zom00QZqtgL+YYczrZVHYoPvTVdTp6usf4`FbL{-!WR+E!6+_8j7>1H64rrJ^ObK5) zutVePCoL)3ju$C_LzU$&+f3IwNDk)k{&E8RrUj75@w;(j@?ksR;aFyKskdE#hW5a2 zfDMQbcxYz7=SeA989_%zjD998F%7g}BUNUXme&-r}6aMEmUm3`bOxn zCg-Zl{&KGj;05D%m7!OJJ|l2n9qfr~GQb_(?7?{9c_vg7y1WKxd0#;c8ksEmYH&>m zQeYgd1_iQF3&^sQzC%jQ7?AjTR$Y`$ueTi8Rk#=cM<@XF z;LkVd2`P;#ocQjWE9E6oPU3-mrRpR73bX#QhB-%Y-}@l!y+~>>AZY<|dGToO;H(lMj8vdsS4%bZ>VMG0|A}%3kLB7F(A&<6hN4k`T`vPm02*C# z%~Xxu0l*gHZkn~rQUWeeNejN9D6OYTA_B1$D5=RccdfdfnV2}SE2S4+4dAHgn^(3l z2LdOs?p^@I|HjMGU<^qLj*gD&VBq zDp4RBU;mRSpNZRPpO=b?sp#emd8s02Vpd)zqrtH)=BJodC){$9b^MXmnX_%mMchMVT~Rj6Wta;E$BT z=PLzkoL0H*6=r>yf4_I1lz%_0Sk)Xpj*!XvEv0td9-m!36_o0#Kn=3`O2E8RJ)VIO z0E<HS4 zdyuNZ82CI74-YZuiNvpBcE+knb>$?&K=kF=7>-`zv#5f_lo|qM62y&67$q%7@bN3g zljUK199yv}XU0qzr%7~A+@o;fy@hB_UELfdz0FPFb}b+o8^3E^CK7s~kPCZ%Unfyc zCiUk7Wsv9I1vC+Cgo^XVXfb$1FA4sANl;=K3<(=7Q?iaNU}e-yl*tk3B>PK>v;wdK ziULb`Az&A|!J!IXr718 zS1PJ>#}&X#z9MINMd;<#6x1@i5RkQ0f%~t59J3ajl?kB?s8p2wE+w!Y;zt>xX^a4x zD*!!UD&+FKELSbbu*LW8RkXd5f_1FRq=!4L{hlYv1zr-b8b|je1Lpe`Ff_yN_fQXD z9@YP0bG4jly-27(X2A(EjgMnl>v{J{z+j}tPCM!vt1Y|Ay>cK-eRwJro3EL2wc~Sy z7Z#veGMby%RTf%~i(Cg=m|LZjIH*y};lF;%wm;Q|U1{7W{=aHWVi((eEvurdq!K7* zoM`4`kKD)c)!h3*5GKl(pBU105)dy9Wa{2LT+bbY z6j89`fSRvs(?1??vs+hoaCyCuS?)QhX6fM^5P$y8O^tx6#2`Z24I?{Zd-+bnJJ0bzs=sCS#7({rV zS;Q;_F9mo(GN9mZ!M9UVQF(th#!7D7x2G`=+>3-U7&$>%`WVO#*Oy@IsSv2%#+as@ zD|~_Y%8^=6Vt^dp{x(eh%8`IzAa{A@Rgd)41kXPhpL7g*p;i+D_+;CJs3lwApjFs`?*$W4uHe-6mArQ*1d zwGMxofe;7)qCNrY6i*Ng3RZphUnRu*gyn_`k3Xum0LhSZ)vxPUK0L0&wJ`8-iSjBw zpqZ=3`B7>Xv9R}o&lBecULo2`!2*DS^hFBBZ)0=1&CiMj;8(qt5wPf&0UjBxfrN9% zz8{EtEk|^O51I~o-)w9+zD9beg1V|Ty9!-VRaKHzf@D-h+bLLE=>yJ(R6{`@V;n>? z%FOXoyB~1*k3JP&0fA{DUSbXa2D+Kev^p_Tcy^|l{viN!{T9$$(qtflHmY~N0cf}N zK)U3We`<$rg-M}r{!)XCQ?y`|MLb!)Pk@FF1SO6H0p|O zVB4^=U^CkehLdNj0E$T363F5S{nF0@g2r&2lL6qR66iaY)`uHoY@niK93^fvNBkI7 z(DI4782d%Aov;m*K8S$7=VWL9kcwiy%B+A&83)|Eg!UoHkVrl#+3i^P?Ft-(3sz9lDx9`O9?rrw_vb&%25o%qS`}%`Xkv(`7$=Utr)MynI{q{z1f4 z={UxJb>t}sw=yLLP~x?gq8{r1h2IKtxvOm-zsvPFQD&cXsXGyn04G00Vrc&Oqqwia zv%G)FEreZP@bV${SNg6hMP*iMlpwM{1S*nIwQ|jOo}PaDkFAnmkxqiHmSlX0+lewA zz%EO{xL|DaJYWlySGQh6sEprImOaf&BTc8&Ga^wJ7(BQmBC?hhP6f`1_H_3rwd6VG zuY>a_iw>DiVj8pRd^NoS{VLb|BLpF)=C=t@>c2j4x(;;d1~7hCCJ``}Odx^I0b_#^ z?MkC*7D1m*U?zcS*sJkJBj4-mKLajN1DL9bY7*($mRrbQ%g4R@!rK~o8DF(Y59$79 zUvt$j4g+I>Kvus9RMXs+7GMSu_QN?Ulq~mSD%vlm0qH1l|LYe58vn*eELyw`!_t&h zHQiSnfE0YT#CZt}`BpPXXb zs$rBK+Xz`P5wZe~pr+YS)+}C0`R1aMtWAZ%X)tPb$NUFuq>DZhiLS$zwob68ro27Xa_`6`gD zY7%axi3Xi|2LqYMUM8~D$35|295i1c|Lrwx@{wFzTYt0%(a_Wc?n{1-!vZU1^;pl2 zz88GvdzHxWY~O9F0KJaE-v8tRHo~mJumFD^0sLt|dcK8GPQ?JZzPM+`1i}^(7x=w+ z$nNhwlmb$belhp^cgK1dvC%w`N>8Q+gRhe8F-SB)rXfjE$NET6{UMPVVUr1o`gd^p z*M*GlSC}@xHZ7~^F$QWo3Yu%J8ccQdy(i5s^U#Qt8r@Zw6WUxImG07;^61kd+(bziI|ZPToQuTzs~<8YCwxOG&MB% zOKV607pUB-pScGP5q;;^dIN$Jl#y$_|F!vQA%xtT!TOLFpoXt)kffc^C*1r*Wv)x5 zsE3K@aNULzi9Fsa4e!hbdn@=7?ylnJ=f{c`#NTPZl#||R5d*sdQt()kGrA$EeicPo ze?PoQ>Mw5WTvY9+V->3)PAP$-mOts$)>~d0gS=BvX)6NF6k7Fo8N~j^B(WMQDnx)C zn2iFVG-2F`(6#kY|4QQmmSfH64&5z+(Zr_sV@8(gE!-^PVDF30j=SZ}ilCX4K!!nq zDp6g6&XenSxLm0DM^LrA<`R{rXUB=Y`HG*9?-i(WdrA9j12*;+0c6ubpdi|_=NkU$ zlC?Q#gV9uFbF@0!-*t_hAt?=y_y>^K92_AfU?A-;mX{7_D_QyXRkURNr#|YU_)%-) zk2-dNh&?dv59o32fX?Rkl9C(utVzv-4nM&@TJD-7pL}@>I&g)+wmoMFGl#6<6?0r~ z1sghA+{615Ncj~|&cvC}1<(SlrhtQ(Tgkt$Guv88F~8{Wk2Bb7*<0#P=mePfFvn5Pkwt253|6 z&H0c?cqmyZ?HYVG3g7r%V*9;krWpuIFP3u;`6@~H_p50^|4q3@SfBgbS6rvZ|3Ezv zq!C7@#>U3p6j-j_JoOLEQr>qm){Inpzw?H2;%fqUxmR3xyV0?e@pJ(pvn1Hx1PWZ> zU}yGa5}#|!zEF{4xrW#Y`>B(ZV$0Q}$`d<5?@Q{_E2;zfdi!%!-hKv>LVewU?w_j+ z;0i+wyL)o{;QyR6K~Hus=&fW})I`l7%sp-g(=UMnl2IPitpwBvS?^j#z}^Y^Q%%w` z`q9QtCBb#t#}k?SfXsJQJXvFv*V4ya)pH-Ct!`PBQNfvEL&}}cBvA6qnKVEE?pzsH zDW4o0A0JQo^vQ^+OR&xeu2QJ%S>P5$SI~&ahTk~UH;IHV#tGaP?VUWFFxOU63WvQb zJ(jMd-^~HdcY-l_8HRNA*6AejvP!&^&!+W%$$Cq6(>;9;wjF* zU$70*Lu1C17THJ>O+^(m#rzLBoi5U-rxu1^ShuEXc*Si06p0842~m4B)1|NZ#RF&- z`6lj?3j0|5^(`yHza6xM^MILMIU&t>g%FC4>2;uti)*XQje~S7^A|{G9Xe;jIp4&! zD67f(SB=t2xLq_d?B>^8L4jdqRzXfq4$Qun%dUB=o)vJ0CfK`LUy@_8-6$|K=*jst z0!87!q`vGAl-NJWybP?0YbjIzz$5f5i8_zvn6Hw8e;=xA{X5Jn^kiAo$`I6!8l0!9 z9noJ=akD^a{Ql21&Fv7uu8_hO%&V+?ub3RpR&)zN=G_@XD^U9OWmOtz;adbfwrIuF z<)izRO0Mn1Q0UYIJ)BWuYT&VU7O3&erAvC%`o>q$-hNyI0bpc?*7McK2Ode?khGCLTw3wf1Mm{v6d zbNT%0`I8TmZN$Qa#>+t;-^P#z;L-a`*`z#1Lk%{8T(0l4G1}V%=gICT5XQ$WM{^}} zRD7uQBb#&stv%g%mz`QtP~z?O%Zn9?>k;B>IxPL2{diT3y9P*zZc^v4ESLI&!2{x@ z)uBtgtQ7|Cj~|RL)<}H48N$?Q9dhH6)6TSTl+fd>b<=RA}B0e-IvR9 z5cJufK?V0egnkGs3mY!#(bTx=UIWD|Mt7F&@H9z3~UFTN-!M0JKIKzl{R-6|)BFBL7 zYz%-m1L5c3|IU2WFsDqP-8>3k}=d3kwwzQn#=2QB@fR_>aS+x9GiD&@dMK8cg{)a<7kA1g;FXZ567q=Mv zwA-_@v&%uLm+@dVKZhO}!>WfR6s0;I6;FtX;R1!6AlboY#6e4;?4Ur?ivxgd*^QIf zKWR<^p=9u|&!)GfD3x{9W&M-b{4yFOcTG{xP>`GG!H)qT?h9X4>C3!IONu8h{-hq! zr4~Q6&IRvykuUq1nIpgZ2jKq z0Z*EjCitoLqjmY;-@-xk-$LzCNpx7EQF~EHM8LSIGI^e&h-K$N3kTu|K?Po6I}Zz1 zu?tgxIf7@EqUW6JOIsv02EY=$8bOIkv*^;0KRPvSw35gnzQ*`ogq5 zy3e7x?>rpwFhr*WvmTi$0$JSKV#VEKZrj;$X^`$Um79y2mNYL7~kQ$Sy}@N|Pfp_FN2^Qp6N?LgYH5VK>f!#o@Jj z9yfc1t$`&zx6bXU!>8&Dx;{@_fBX1^*5cN#__o+r$P+4Q@V?nl{#W_T7~HqG-;4+{ zJaZiH%b;$PzXP#%KGwA_&CRcMNxsH+gM%i@Wp6ElY zJa}W1kLP|%yli?}P@%Rumd7KXdooyiDC!&P+rm#&e%S|Cw|3b#!w+6%& z)*PK1F`fo_%nRpA^*&&1&`}ulozwjx1!?~ogiF}>@?$-gd&V+2V?5XtIrnq+wYnp1 z6U`-5x9ASVc~cp!?{%z-hy#DWlt2O@sxF*$GALXI9zA~IA$P>t$wor6vKtH; z0QZnp$_dWJ11~@j>s#W!juNyU1X6=nd#v33!doh$r#inx#h>f$FnJEa&m-O1Djt#t zi69lO^%3~aieHz2|C;_f8N6rI(2suLV4}46$$4v8SB}L zsQ#@fGq@^#*?h=z>GDu4ok8|Ilf-M`9-QBGtn$R;Pi~8sSbSH)U}jwu+`Cg&g9(c& zv6|RycyFGy0v9nHb27fM-KS5244MsWkY(^C!}k0h#ou4~&c5r0w4YY|)6swUEFSl6 zdO_|3$NkF~O|Rc!!*IL9G;&YmDT?Fg6cg@*R&cI8Qq#R5kt4yKlN)Y@ZozL5`?v%z$OKv8s)rB8HW>3U5Q%WTa^=|7C5b~9io=R z)t4zsQ3XfPU0LxU*n=2$_azU{Er^U#?I5y&Xs-Y6hv?=q82L$}h+|kY%lX{n`qt!* z%;LoAA!-Ed_nW|{obP|4EZgH{6Z^e-8krHNi6bthk*4cdo`$5{x9%wi9WCcswq1Uhdaczz?6}|r++fMyM z`}Ol!H;u{gz4qz9qpLJ#6;hdsJ9wN6#G1eU31&WV;KQKgq}u~(Im&6Gbex;%0t0*Q zA@`W0FW@CUk37fdw{MRH^=|3^Hib88=UgBE5>ZKUz6$T#eI!>>(c?u|^zx~KdYZ0> z{2T0K2R|m5_ZKY0?{P%!VAk(2X|Eop@stLA!puW7`=W^TPxsre!0V&ouVV0qI__HnS}@{P3fY@-?yq9l2fTk2 z=M&tXZr2wdJs|qCp3+CQ9u??A7nT6;PJUxcojc_7W7dhfx?N0h(p*l%oxtmjbzr#r z_Tc$l)P-D!Yj6}hX|UwM5Y3T+S~k}G?@?4EjjGoGrZ>4>(Ojc)&N(}`B7ERlC8f`q z(RwJZl_L3|;@0NQ3?6m`uOXsRp5hhb={O;$K{a!OsPUYq)b;1x?GH7S4XPyk%#r^l12fGF*RT1J2O zzon;JJ4yKU<_XP2D-DUns7m}J`lvR-=A0K4l!ET&kGj=llw?xSxipWn-NH;BOZ3>) zeWW2yT=n1osu?I7uXS>_aZR{(2zzTXIr)-1HO#efL$Na8(_g+#rtKpL&YlYy<{Al4 zx9HZ)HV^H%0}OF5ub<-2V)qV~FFx|Z1n&szi8mw9jX07;VTm?xKlw>kf9Llk{?T1Q z#8H}~+Gw};M{*&|3gJ%CIEpynx?tvq!KGK5548z;T(VTbFCQ41r?cP`m{`_~%fj-9 zd|W$f;F@GR@>xBn>X>+AL112>Gs%=yN!}XGIx$ogDj0mWnx$ryEz+$8Ln1GD)*83& zA(!3<@7UezHNJ)sJ`*czNUDb_Fm8MwcgM z?MK&#gAxjHo6_--9A~OO2mg3A&mT;cM@zRI-MJaSAbxw2`)t_HxjD|FhT)R z(#qMl6u~6Jr1z=@+bJg7%(F8iarif^sbUJQzZkr@pLt$TH-yu=o$8htoIdzk7TNhg z9V2j7BXScfK-*0+S+2U@cD8(bUXc@{vr7y$wBwoY__y%brTamaWeB;+weRm0XV1}5wGWkL<2@I-dzU3WxHL7zuqr; zpa1Fu*M#Cu10|+OD0xcpr*G7$WzOZ1KkJ3l_rVzZ`GAFXROefGfVuji%(h9O*J-K4 zqb*j{19fxqdp(OhIMv!67%!R88M^W{OMOD$S{$9}>eXwQ&SH0J<`KlC6iNeWM z_`UDgE)?hO@!z<7XFvbS;pSwo-F)bbQ~0Iq`3YP^LH&qyTi3{|Bb~+Dly!i(o^S$v z&3F@w`1Y_wu_yVLBIojmmt5k6%|hU=+;(x;Du(;`cYZTijTbyNJnqqXY6wSo^F2E2 z)%JE&d95;3E&G!Fg7>E!;!DR;;7#9i0g4vOeS5B`-Va100{Dn{a(OrS$ikIYoeGNVN>7o zm*R^3s{yyO53bl3vJOR-3Vj>krU0+|gxqhpb;tipRa%bwAm@XiPgMoE<(HPvB@Cs& zy##x5;aT9P(Z&gWkN#5N?EtU4nedil{UiS0%CE&;5{gO*{s-}=xcg5@_Ze=qaC3sL zDAzB*Yw~?IKW^^_cul?&h%~3U%Xv$2m+^xZ`)}h00Oeckvr_0=;1-z)QlNs|r`}MO zj{6{mH|TNSJHTtwaFru0ClY*c_FjaubZ)bP7W!J?1l){t&FP4n^{3E5e%}Fp?(>@W zh<<{aHu!%lOY$JRbv5Fik8MuS30ZS6y#E9nnsfPWo?D~g5@{( zGE1LJkep$y)4i^sztl~|egeT}6&nsb1{^`~TS`eO^vB|!$8Ju0T*2*&8z{R2xt$;v z;RYDzBgk=|mVy@MaqsuJtRndXbFCeMt80IWV&l0MdT?{x?+R?y%xfxfBMyg=+x_b^ z@t@!K|A=oQmLS>lxm0S!?-#Nb{~`~;uB4>pa|v?tj$#Z(F2$+oGX4Z$&j7DK2sekp zkp%l$C8f|`9>YG)Bmc|mL5_n$21Ujx&f~rkcf2R%I7_N4aN}~G4|~J;+)J;<4L0!m zhBgE@dsG=W_g@5AemY*`<0bq-;1LQks z?j_vic|Yglo+tDZayd5F zVt)v3QXs!#Ukru*5#0Hx5J7%Fit)Iw3GkY53(SZ-;9D;b2D%fYl}R%F%QQR?270`xG(9UDD-*v>A+6{yzcwJ z=^Od~o$!B@t{(S+S&icMEA#-nM4qB>LFS{L5^!5VK9eB(v(_5_p3M^cM}p_0&_`*S zF5?F+_DACGPjBp!U=|Dg1Gv@j3b`l0p<4VG&*~0r8R9;p66BoaHy?hJAccPWfZNJ~ zCxLU=`0v#x1gn`PxZ0S@LSvg0#_Dws-~#y>%{OP3x*hk6(VRaMe1@*M-OLkn(V zg{c9y^$KfGG9v=K{&j*6N*Lp_t$f#`?;jxNDv~|eWDx%Ep_<&r8r&OTn~^*d8lngB ze-C~$G;WIDdh|gq-vw2LTeK+Xn%57o{?GbwpV!B=9{ptCEuZ!RZXv56@AHfha&IWe zc`NCQT%C*mdw48|?X|{T?eN=X8g6k0;kO=rkdAL_+;qu7j^iL}H~8|~NsvMh?wR=@ zKkUnK1K3vhyly$c=U#{C3Oxinv7A@H_M>(!{`qrVJO1@F zP=Xr}=Jy`X$#J`{2iRt$E40PPuh5STxSc_`Iv3>k^@Ku0`|TiTp$9j!kKgv{aDzPj zUYF~)@hA&@kU}|&kS?)=tTX;!syyJR9JjkU!M@ly2=^X+llKDb_kjrZ8wS5Gbsp~bI_RP-O@0$#yR-QJ?VVeU zomCabf1Q~!?VQq#v?(DPJEm%M0gMS=5@W;%qG*gEq5%^L zYD5w625Plps2Avifmp49ptMO_TOqWXX$b?Q%+So7rjrcHTKU&*szFxHbQqlGzcU6`xrcr9`sImjtg5T z9Wf^k|nT|hY&re zPW=hzz`M!6krx_@B8eV+=P55?*Xb`47vuA~zmZe_2OPRvXt7Zzc+TcuBW~N*BKjg* z8#hp%z4tfwtnvRk5Iu>WJg34Z@x2e%=!3DJM|Tq8NNBCK?<_3GtqpOUl2aZv%W6ls* zL?07~d7q&>lfwk|Rj?H1C3?^q@vOtf>%GD~$Wc-$CIKdC#>gP+WDZF}~>Bt8$eg{p{N zn9#Nd%kkB_Xdy2##rT%v-}!u+>Ua6_z#{seM(A$fcaV1yurRZf#SlICyvxr=+JN$i zehQUE^-hqX`KWoZ4Am&`PTr4`raD`OZwAqN{ToryC(FhRY2UqV4x5>rpu8>XRluVGW4kq>?W+Uq9zb(ySxAxIXA%9+BK2>< zmlE9~;F#D_6if8W=%0r5C(?9(D~sqsZ3jap%7^f^h0Kd}C?&=_p8pVk2HlBq6v*Qp z!!)YDUL>~RJCo1kiwSL8MBhwk%Zmx%kH)yV$siCtXgAAqJ+TvUC%)~p+d{Ddw^3}z z%S%yBb?=xSD_}g|4X{6r0=SFB7$U`833ORR|4;%Oo`Pg8v@>|6N1>%Cmgqr5)NPAv z2GvAQfij8SW3N+=q8!qcXM`gt7%r==?44+?NH~UeY(Oc7A@}8e(l-HFk0$ewaqJ@P zv$2T2mC#lQCJ3)}F(^bog1;1S-W0NKSb_g&D3d1$d}IS8H+b2 zCX;(9W-I?)EOtWP8L7`A`iCR+XSm<6lgTmE$G$HtB`Js=RJ5Wq=kd&wW*l*a%WH-jHjHMtI(Zk|WvZ+f%mQD1amHckQ zZZA0jdDKB2&{e*cH?PGib_!O!!Z=I)&qMG72qaU=VcuJ@2 zBR=z>8$3i`WigeIZTvwZdhnHFZ6QKQi4DlR$}=Av0KN>o1K$E<3N6}qpoMa%y;n%T zqtFdkk#8UqUz&L6-yB0;{zm!NXi0D7j=l_RU+9o#z8Ys&0+DJVwpdb4TXI87(i33N}^q8~v_y53&2D4CAX(F?btZPb1kqx_(} zc1$3T^1a6An#7;sz7GY5^}}Z5!Ng)YnzO9D`FTWkPbaXMVIw*QikWK`P~`dx=)Io- z&Oz_}B)YEiBJ@wAql;AYx`k_ymm5oJPUWFQ5MVYUBh>p`t+EV7rG=tW_Qy zrT>n@4$`(Nz7e%_x6nd;E4uDjSgVAT9zAF~=kmllp&E}q!x(xHc~$iU0(BFt z`uf}7>AdNLmPfxMr`~>e(6E`wi}Y{`tuLk~`l3)J(P!9>zl>oSvY)io!17=n@H?u% z7nwAH+bK5c83u>wL7vth=szjOqHLlExYJ>?MgN_^yckC*r+JQ(ijrRuSY#zJ-VFS? z%ebnNALP7_Du}*;uiSVGH7;7xq|Ex#km$p(h42X6)Utq5eyXZM*NIU?e4ZewBIO9_ z^5iXei2j_C#^OOgvL95UZ=h#x*?pPfslqG%TqqMXnBf!i*1YO z^K@VJ;BENN>z9<1x4tkW`f!Y*A696@X$sj(d=zg{*hp9rk5n>;0-eh2n&lz-JgtF? z#7f}zEFI^d5v{jVy#hn9wi6Skl%E^wwWxx;7)?&*0au8J?tJ0J4 z5PeSD%(q6pZp3@?H)j@BI+v^mqS%!wNKEUPeehk5w|#A%+-Y lhyleo#ReA*F~krB Date: Tue, 31 Aug 2021 10:25:11 +0200 Subject: [PATCH 24/28] fix attribute name from `host` to `hosts` --- .../default_modules/ftrack/plugins/publish/collect_username.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/modules/default_modules/ftrack/plugins/publish/collect_username.py b/openpype/modules/default_modules/ftrack/plugins/publish/collect_username.py index 7a303a1608..39b7433e11 100644 --- a/openpype/modules/default_modules/ftrack/plugins/publish/collect_username.py +++ b/openpype/modules/default_modules/ftrack/plugins/publish/collect_username.py @@ -26,7 +26,7 @@ class CollectUsername(pyblish.api.ContextPlugin): """ order = pyblish.api.CollectorOrder - 0.488 label = "Collect ftrack username" - host = ["webpublisher"] + hosts = ["webpublisher"] _context = None From da0ea31ec9446509cf37e7036d81689adbb71a07 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Tue, 31 Aug 2021 10:31:36 +0200 Subject: [PATCH 25/28] Webpublisher - fixed documentation, host and ip are provided by command line --- website/docs/admin_webserver_for_webpublisher.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/website/docs/admin_webserver_for_webpublisher.md b/website/docs/admin_webserver_for_webpublisher.md index dced825bdc..6e72ccaf32 100644 --- a/website/docs/admin_webserver_for_webpublisher.md +++ b/website/docs/admin_webserver_for_webpublisher.md @@ -40,14 +40,13 @@ Deploy OP build distribution (Openpype Igniter) on an OS of your choice. ```sh #!/usr/bin/env bash export OPENPYPE_DEBUG=3 -export WEBSERVER_HOST_IP=localhost export FTRACK_BOT_API_USER=YOUR_API_USER export FTRACK_BOT_API_KEY=YOUR_API_KEY export PYTHONDONTWRITEBYTECODE=1 export OPENPYPE_MONGO=YOUR_MONGODB_CONNECTION pushd /opt/openpype -./openpype_console webpublisherwebserver --upload_dir YOUR_SHARED_FOLDER_ON_HOST --executable /opt/openpype/openpype_console > /tmp/openpype.log 2>&1 +./openpype_console webpublisherwebserver --upload_dir YOUR_SHARED_FOLDER_ON_HOST --executable /opt/openpype/openpype_console --host YOUR_HOST_IP --port YOUR_HOST_PORT > /tmp/openpype.log 2>&1 ``` 1. create service file `sudo vi /etc/systemd/system/openpye-webserver.service` From 3a8b1f403ae2155ffe705886dda8b222983ff80c Mon Sep 17 00:00:00 2001 From: OpenPype Date: Tue, 31 Aug 2021 09:35:27 +0000 Subject: [PATCH 26/28] [Automated] Bump version --- CHANGELOG.md | 9 +++++---- openpype/version.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4259a0f725..e1737458b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,12 @@ # Changelog -## [3.4.0-nightly.3](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.4.0-nightly.4](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.3.1...HEAD) **Merged pull requests:** +- Ftrack: Fix hosts attribute in collect ftrack username [\#1972](https://github.com/pypeclub/OpenPype/pull/1972) - Removed deprecated submodules [\#1967](https://github.com/pypeclub/OpenPype/pull/1967) - Launcher: Fix crashes on action click [\#1964](https://github.com/pypeclub/OpenPype/pull/1964) - Settings: Minor fixes in UI and missing default values [\#1963](https://github.com/pypeclub/OpenPype/pull/1963) @@ -18,7 +19,9 @@ - Add face sets to exported alembics [\#1942](https://github.com/pypeclub/OpenPype/pull/1942) - Bump path-parse from 1.0.6 to 1.0.7 in /website [\#1933](https://github.com/pypeclub/OpenPype/pull/1933) - \#1894 - adds host to template\_name\_profiles for filtering [\#1915](https://github.com/pypeclub/OpenPype/pull/1915) +- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) - Disregard publishing time. [\#1888](https://github.com/pypeclub/OpenPype/pull/1888) +- Feature/webpublisher backend [\#1876](https://github.com/pypeclub/OpenPype/pull/1876) - Dynamic modules [\#1872](https://github.com/pypeclub/OpenPype/pull/1872) - Houdini: add Camera, Point Cache, Composite, Redshift ROP and VDB Cache support [\#1821](https://github.com/pypeclub/OpenPype/pull/1821) @@ -56,7 +59,6 @@ - Nuke: update video file crassing [\#1916](https://github.com/pypeclub/OpenPype/pull/1916) - Fix - texture validators for workfiles triggers only for textures workfiles [\#1914](https://github.com/pypeclub/OpenPype/pull/1914) - submodules: avalon-core update [\#1911](https://github.com/pypeclub/OpenPype/pull/1911) -- Environments: Tool environments in alphabetical order [\#1910](https://github.com/pypeclub/OpenPype/pull/1910) - Settings UI: List order works as expected [\#1906](https://github.com/pypeclub/OpenPype/pull/1906) - Add support for multiple Deadline β˜ οΈβž– servers [\#1905](https://github.com/pypeclub/OpenPype/pull/1905) - Hiero: loaded clip was not set colorspace from version data [\#1904](https://github.com/pypeclub/OpenPype/pull/1904) @@ -75,7 +77,6 @@ - TVPaint: Increment workfile [\#1885](https://github.com/pypeclub/OpenPype/pull/1885) - Allow Multiple Notes to run on tasks. [\#1882](https://github.com/pypeclub/OpenPype/pull/1882) - Normalize path returned from Workfiles. [\#1880](https://github.com/pypeclub/OpenPype/pull/1880) -- Feature/webpublisher backend [\#1876](https://github.com/pypeclub/OpenPype/pull/1876) - Prepare for pyside2 [\#1869](https://github.com/pypeclub/OpenPype/pull/1869) - Filter hosts in settings host-enum [\#1868](https://github.com/pypeclub/OpenPype/pull/1868) - Local actions with process identifier [\#1867](https://github.com/pypeclub/OpenPype/pull/1867) @@ -83,8 +84,8 @@ - Maya: add support for `RedshiftNormalMap` node, fix `tx` linear space πŸš€ [\#1863](https://github.com/pypeclub/OpenPype/pull/1863) - Workfiles tool event arguments fix [\#1862](https://github.com/pypeclub/OpenPype/pull/1862) - Maya: support for configurable `dirmap` πŸ—ΊοΈ [\#1859](https://github.com/pypeclub/OpenPype/pull/1859) +- Maya: don't add reference members as connections to the container set πŸ“¦ [\#1855](https://github.com/pypeclub/OpenPype/pull/1855) - Settings list can use template or schema as object type [\#1815](https://github.com/pypeclub/OpenPype/pull/1815) -- Maya: expected files -\> render products βš™οΈ overhaul [\#1812](https://github.com/pypeclub/OpenPype/pull/1812) ## [3.2.0](https://github.com/pypeclub/OpenPype/tree/3.2.0) (2021-07-13) diff --git a/openpype/version.py b/openpype/version.py index 2e769a1b62..17bd0ff892 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.4.0-nightly.3" +__version__ = "3.4.0-nightly.4" From 2b2698639b60dd6495545dbe1ff95216f1c04069 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 31 Aug 2021 19:10:25 +0200 Subject: [PATCH 27/28] change source url of arrow submodule from git to https --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index 82fd194d26..28f164726d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,7 +6,7 @@ url = https://github.com/pypeclub/avalon-unreal-integration.git [submodule "openpype/modules/default_modules/ftrack/python2_vendor/arrow"] path = openpype/modules/default_modules/ftrack/python2_vendor/arrow - url = git@github.com:arrow-py/arrow.git + url = https://github.com/arrow-py/arrow.git [submodule "openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api"] path = openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api url = https://bitbucket.org/ftrack/ftrack-python-api.git From f36f504faacb7a86690b90bccc45f82ce9395b14 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 31 Aug 2021 19:18:45 +0200 Subject: [PATCH 28/28] updated avalon-core --- repos/avalon-core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/repos/avalon-core b/repos/avalon-core index 52e24a9993..f48fce09c0 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 52e24a9993e5223b0a719786e77a4b87e936e556 +Subproject commit f48fce09c0986c1fd7f6731de33907be46b436c5