From bf39fc72a550ce8ac6fc8d4c07bc2359ec9cdfa8 Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 19 Jan 2022 18:31:24 -0800 Subject: [PATCH 01/22] Update submodules. --- openpype/modules/default_modules/ftrack/python2_vendor/arrow | 2 +- .../default_modules/ftrack/python2_vendor/ftrack-python-api | 2 +- repos/avalon-core | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/python2_vendor/arrow b/openpype/modules/default_modules/ftrack/python2_vendor/arrow index b746fedf72..4c4689c6d9 160000 --- a/openpype/modules/default_modules/ftrack/python2_vendor/arrow +++ b/openpype/modules/default_modules/ftrack/python2_vendor/arrow @@ -1 +1 @@ -Subproject commit b746fedf7286c3755a46f07ab72f4c414cd41fc0 +Subproject commit 4c4689c6d97ed2b1f37a67b96c561266c66ee088 diff --git a/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api b/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api index d277f474ab..ddf943a5dc 160000 --- a/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api +++ b/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api @@ -1 +1 @@ -Subproject commit d277f474ab016e7b53479c36af87cb861d0cc53e +Subproject commit ddf943a5dcc44d2cecf29896d2075f5198b699aa diff --git a/repos/avalon-core b/repos/avalon-core index ffe9e910f1..047fe1f5bb 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit ffe9e910f1f382e222d457d8e4a8426c41ed43ae +Subproject commit 047fe1f5bba425b8b41c2197961925c1e2ec5fdf From 48fd45ed1aedfba8ac8afdc1f947970c2d76dc85 Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Mon, 24 Jan 2022 14:42:58 -0800 Subject: [PATCH 02/22] Revert "Update submodules." This reverts commit bf39fc72a550ce8ac6fc8d4c07bc2359ec9cdfa8. --- openpype/modules/default_modules/ftrack/python2_vendor/arrow | 2 +- .../default_modules/ftrack/python2_vendor/ftrack-python-api | 2 +- repos/avalon-core | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/modules/default_modules/ftrack/python2_vendor/arrow b/openpype/modules/default_modules/ftrack/python2_vendor/arrow index 4c4689c6d9..b746fedf72 160000 --- a/openpype/modules/default_modules/ftrack/python2_vendor/arrow +++ b/openpype/modules/default_modules/ftrack/python2_vendor/arrow @@ -1 +1 @@ -Subproject commit 4c4689c6d97ed2b1f37a67b96c561266c66ee088 +Subproject commit b746fedf7286c3755a46f07ab72f4c414cd41fc0 diff --git a/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api b/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api index ddf943a5dc..d277f474ab 160000 --- a/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api +++ b/openpype/modules/default_modules/ftrack/python2_vendor/ftrack-python-api @@ -1 +1 @@ -Subproject commit ddf943a5dcc44d2cecf29896d2075f5198b699aa +Subproject commit d277f474ab016e7b53479c36af87cb861d0cc53e diff --git a/repos/avalon-core b/repos/avalon-core index 047fe1f5bb..ffe9e910f1 160000 --- a/repos/avalon-core +++ b/repos/avalon-core @@ -1 +1 @@ -Subproject commit 047fe1f5bba425b8b41c2197961925c1e2ec5fdf +Subproject commit ffe9e910f1f382e222d457d8e4a8426c41ed43ae From c5aa315c30413cc4e78cf113bff159a00f51164d Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Tue, 29 Mar 2022 11:30:00 -0700 Subject: [PATCH 03/22] Add toggle button for Loaders' family filter widget. --- openpype/tools/libraryloader/app.py | 11 +++++++++-- openpype/tools/loader/app.py | 9 ++++++++- openpype/tools/loader/widgets.py | 6 ++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index b73b415128..6825b3c975 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -84,11 +84,15 @@ class LibraryLoaderWindow(QtWidgets.QDialog): families_filter_view = FamilyListView( dbcon, self.family_config_cache, left_side_splitter ) + families_toggle_button = QtWidgets.QPushButton("Toggle All") + left_side_splitter.addWidget(projects_combobox) left_side_splitter.addWidget(assets_widget) left_side_splitter.addWidget(families_filter_view) - left_side_splitter.setStretchFactor(1, 65) - left_side_splitter.setStretchFactor(2, 35) + left_side_splitter.addWidget(families_toggle_button) + left_side_splitter.setStretchFactor(0, 65) + left_side_splitter.setStretchFactor(1, 30) + left_side_splitter.setStretchFactor(2, 5) # --- Middle part --- # Subsets widget @@ -163,6 +167,9 @@ class LibraryLoaderWindow(QtWidgets.QDialog): families_filter_view.active_changed.connect( self._on_family_filter_change ) + families_toggle_button.clicked.connect( + families_filter_view.toggle_all + ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) subsets_widget.active_changed.connect(self.on_subsetschanged) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 923a1fabdb..68a59e1ccc 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -67,10 +67,14 @@ class LoaderWindow(QtWidgets.QDialog): families_filter_view = FamilyListView( io, self.family_config_cache, left_side_splitter ) + families_toggle_button = QtWidgets.QPushButton("Toggle All") + left_side_splitter.addWidget(assets_widget) left_side_splitter.addWidget(families_filter_view) + left_side_splitter.addWidget(families_toggle_button) left_side_splitter.setStretchFactor(0, 65) - left_side_splitter.setStretchFactor(1, 35) + left_side_splitter.setStretchFactor(1, 30) + left_side_splitter.setStretchFactor(2, 5) # --- Middle part --- # Subsets widget @@ -147,6 +151,9 @@ class LoaderWindow(QtWidgets.QDialog): families_filter_view.active_changed.connect( self._on_family_filter_change ) + families_toggle_button.clicked.connect( + families_filter_view.toggle_all + ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) subsets_widget.active_changed.connect(self.on_subsetschanged) diff --git a/openpype/tools/loader/widgets.py b/openpype/tools/loader/widgets.py index 42fb62b632..b5f1df1e36 100644 --- a/openpype/tools/loader/widgets.py +++ b/openpype/tools/loader/widgets.py @@ -1070,6 +1070,12 @@ class FamilyListView(QtWidgets.QListView): def set_all_checked(self): self._set_checkstates(True, self._get_all_indexes()) + def toggle_all(self): + if self.get_enabled_families(): + self.set_all_unchecked() + else: + self.set_all_checked() + def _get_all_indexes(self): indexes = [] model = self._family_model From ea84c18d2f1d6a1c11fca506512a4ce7e164a114 Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Tue, 29 Mar 2022 11:53:13 -0700 Subject: [PATCH 04/22] Fix left splitter indexing. --- openpype/tools/libraryloader/app.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index 6825b3c975..59f4aa4d7a 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -90,9 +90,9 @@ class LibraryLoaderWindow(QtWidgets.QDialog): left_side_splitter.addWidget(assets_widget) left_side_splitter.addWidget(families_filter_view) left_side_splitter.addWidget(families_toggle_button) - left_side_splitter.setStretchFactor(0, 65) - left_side_splitter.setStretchFactor(1, 30) - left_side_splitter.setStretchFactor(2, 5) + left_side_splitter.setStretchFactor(1, 65) + left_side_splitter.setStretchFactor(2, 30) + left_side_splitter.setStretchFactor(3, 5) # --- Middle part --- # Subsets widget From a64b3f5b7696534b3384a21143be9842397da482 Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 18 May 2022 16:31:14 -0700 Subject: [PATCH 05/22] Revert "Add toggle button for Loaders' family filter widget." This reverts commit c5aa315c30413cc4e78cf113bff159a00f51164d. --- openpype/tools/libraryloader/app.py | 9 +-------- openpype/tools/loader/app.py | 9 +-------- openpype/tools/loader/widgets.py | 6 ------ 3 files changed, 2 insertions(+), 22 deletions(-) diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index 99dfce36e3..7fda6bd6f9 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -82,15 +82,11 @@ class LibraryLoaderWindow(QtWidgets.QDialog): families_filter_view = FamilyListView( dbcon, self.family_config_cache, left_side_splitter ) - families_toggle_button = QtWidgets.QPushButton("Toggle All") - left_side_splitter.addWidget(projects_combobox) left_side_splitter.addWidget(assets_widget) left_side_splitter.addWidget(families_filter_view) - left_side_splitter.addWidget(families_toggle_button) left_side_splitter.setStretchFactor(1, 65) - left_side_splitter.setStretchFactor(2, 30) - left_side_splitter.setStretchFactor(3, 5) + left_side_splitter.setStretchFactor(2, 35) # --- Middle part --- # Subsets widget @@ -165,9 +161,6 @@ class LibraryLoaderWindow(QtWidgets.QDialog): families_filter_view.active_changed.connect( self._on_family_filter_change ) - families_toggle_button.clicked.connect( - families_filter_view.toggle_all - ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) subsets_widget.active_changed.connect(self.on_subsetschanged) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index 57baeae061..bb589c199d 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -71,14 +71,10 @@ class LoaderWindow(QtWidgets.QDialog): families_filter_view = FamilyListView( legacy_io, self.family_config_cache, left_side_splitter ) - families_toggle_button = QtWidgets.QPushButton("Toggle All") - left_side_splitter.addWidget(assets_widget) left_side_splitter.addWidget(families_filter_view) - left_side_splitter.addWidget(families_toggle_button) left_side_splitter.setStretchFactor(0, 65) - left_side_splitter.setStretchFactor(1, 30) - left_side_splitter.setStretchFactor(2, 5) + left_side_splitter.setStretchFactor(1, 35) # --- Middle part --- # Subsets widget @@ -159,9 +155,6 @@ class LoaderWindow(QtWidgets.QDialog): families_filter_view.active_changed.connect( self._on_family_filter_change ) - families_toggle_button.clicked.connect( - families_filter_view.toggle_all - ) assets_widget.selection_changed.connect(self.on_assetschanged) assets_widget.refresh_triggered.connect(self.on_assetschanged) subsets_widget.active_changed.connect(self.on_subsetschanged) diff --git a/openpype/tools/loader/widgets.py b/openpype/tools/loader/widgets.py index b5f1df1e36..42fb62b632 100644 --- a/openpype/tools/loader/widgets.py +++ b/openpype/tools/loader/widgets.py @@ -1070,12 +1070,6 @@ class FamilyListView(QtWidgets.QListView): def set_all_checked(self): self._set_checkstates(True, self._get_all_indexes()) - def toggle_all(self): - if self.get_enabled_families(): - self.set_all_unchecked() - else: - self.set_all_checked() - def _get_all_indexes(self): indexes = [] model = self._family_model From 1133dedb545efe81aaf5febc5819d7bd3ab6a3ab Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Tue, 7 Jun 2022 16:07:54 -0700 Subject: [PATCH 06/22] Support Maya instances in pointCache extraction. --- .../hosts/maya/plugins/publish/extract_pointcache.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/extract_pointcache.py b/openpype/hosts/maya/plugins/publish/extract_pointcache.py index c4c8610ebb..4aaf223403 100644 --- a/openpype/hosts/maya/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/maya/plugins/publish/extract_pointcache.py @@ -65,7 +65,7 @@ class ExtractAlembic(openpype.api.Extractor): "writeColorSets": writeColorSets, "writeFaceSets": writeFaceSets, "uvWrite": True, - "selection": True, + "selection": False, "worldSpace": instance.data.get("worldSpace", True) } @@ -80,12 +80,10 @@ class ExtractAlembic(openpype.api.Extractor): options["writeUVSets"] = True with suspended_refresh(): - with maintained_selection(): - cmds.select(nodes, noExpand=True) - extract_alembic(file=path, - startFrame=start, - endFrame=end, - **options) + extract_alembic(file=path, + startFrame=start, + endFrame=end, + **options) if "representations" not in instance.data: instance.data["representations"] = [] From b63ae623f4715401528f61fe8e469f47a70a0e5c Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 8 Jun 2022 14:54:42 -0700 Subject: [PATCH 07/22] Borrowed child node discovery logic from Colorbleed, to properly support instanced objects. --- .../maya/plugins/publish/collect_instances.py | 49 ++++++++++++++++--- .../plugins/publish/extract_pointcache.py | 11 +++-- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_instances.py b/openpype/hosts/maya/plugins/publish/collect_instances.py index 1d59a68bf6..48cc446541 100644 --- a/openpype/hosts/maya/plugins/publish/collect_instances.py +++ b/openpype/hosts/maya/plugins/publish/collect_instances.py @@ -1,9 +1,50 @@ from maya import cmds +import maya.api.OpenMaya as om import pyblish.api import json +def get_all_children(nodes): + """Return all children of `nodes` including each instanced child. + Using maya.cmds.listRelatives(allDescendents=True) includes only the first + instance. As such, this function acts as an optimal replacement with a + focus on a fast query. + Borrowed from Colorbleed: https://tinyurl.com/bdht6fyh + + """ + + sel = om.MSelectionList() + traversed = set() + iterator = om.MItDag(om.MItDag.kDepthFirst) + for node in nodes: + + if node in traversed: + # Ignore if already processed as a child + # before + continue + + sel.clear() + sel.add(node) + dag = sel.getDagPath(0) + + iterator.reset(dag) + iterator.next() # ignore self + while not iterator.isDone(): + + path = iterator.fullPathName() + + if path in traversed: + iterator.prune() + iterator.next() + continue + + traversed.add(path) + iterator.next() + + return list(traversed) + + class CollectInstances(pyblish.api.ContextPlugin): """Gather instances by objectSet and pre-defined attribute @@ -86,12 +127,8 @@ class CollectInstances(pyblish.api.ContextPlugin): # Collect members members = cmds.ls(members, long=True) or [] - # `maya.cmds.listRelatives(noIntermediate=True)` only works when - # `shapes=True` argument is passed, since we also want to include - # transforms we filter afterwards. - children = cmds.listRelatives(members, - allDescendents=True, - fullPath=True) or [] + dag_members = cmds.ls(members, type="dagNode", long=True) + children = get_all_children(dag_members) children = cmds.ls(children, noIntermediate=True, long=True) parents = [] diff --git a/openpype/hosts/maya/plugins/publish/extract_pointcache.py b/openpype/hosts/maya/plugins/publish/extract_pointcache.py index 4aaf223403..33bcdaf92c 100644 --- a/openpype/hosts/maya/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/maya/plugins/publish/extract_pointcache.py @@ -65,7 +65,7 @@ class ExtractAlembic(openpype.api.Extractor): "writeColorSets": writeColorSets, "writeFaceSets": writeFaceSets, "uvWrite": True, - "selection": False, + "selection": True, "worldSpace": instance.data.get("worldSpace", True) } @@ -80,10 +80,11 @@ class ExtractAlembic(openpype.api.Extractor): options["writeUVSets"] = True with suspended_refresh(): - extract_alembic(file=path, - startFrame=start, - endFrame=end, - **options) + with maintained_selection(): + extract_alembic(file=path, + startFrame=start, + endFrame=end, + **options) if "representations" not in instance.data: instance.data["representations"] = [] From 122536675fb043fda7d62710149c65cfd089d674 Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 8 Jun 2022 14:58:50 -0700 Subject: [PATCH 08/22] Use next() builtin --- openpype/hosts/maya/plugins/publish/collect_instances.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_instances.py b/openpype/hosts/maya/plugins/publish/collect_instances.py index 48cc446541..c76afe53f6 100644 --- a/openpype/hosts/maya/plugins/publish/collect_instances.py +++ b/openpype/hosts/maya/plugins/publish/collect_instances.py @@ -29,18 +29,18 @@ def get_all_children(nodes): dag = sel.getDagPath(0) iterator.reset(dag) - iterator.next() # ignore self + next(iterator) # ignore self while not iterator.isDone(): path = iterator.fullPathName() if path in traversed: iterator.prune() - iterator.next() + next(iterator) continue traversed.add(path) - iterator.next() + next(iterator) return list(traversed) From ce7b19d51b687f2e5a8abff64c8b741fd933bbad Mon Sep 17 00:00:00 2001 From: "felix.wang" Date: Wed, 8 Jun 2022 15:04:55 -0700 Subject: [PATCH 09/22] Change back to do actual selection. --- openpype/hosts/maya/plugins/publish/extract_pointcache.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openpype/hosts/maya/plugins/publish/extract_pointcache.py b/openpype/hosts/maya/plugins/publish/extract_pointcache.py index 33bcdaf92c..c4c8610ebb 100644 --- a/openpype/hosts/maya/plugins/publish/extract_pointcache.py +++ b/openpype/hosts/maya/plugins/publish/extract_pointcache.py @@ -81,6 +81,7 @@ class ExtractAlembic(openpype.api.Extractor): with suspended_refresh(): with maintained_selection(): + cmds.select(nodes, noExpand=True) extract_alembic(file=path, startFrame=start, endFrame=end, From 34156e280bf7ebbd565e9754ae9f71fdf463d79f Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 9 Jun 2022 18:17:38 +0200 Subject: [PATCH 10/22] create new action to create daily review sessions --- .../action_create_review_session.py | 286 ++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 openpype/modules/ftrack/event_handlers_server/action_create_review_session.py diff --git a/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py new file mode 100644 index 0000000000..3b7cb224f0 --- /dev/null +++ b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py @@ -0,0 +1,286 @@ +import threading +import datetime +import copy +import collections + +import ftrack_api + +from openpype.lib import get_datetime_data +from openpype.api import get_project_settings +from openpype_modules.ftrack.lib import ServerAction + + +class CreateDailyReviewSessionServerAction(ServerAction): + """Create daily review session object per project. + + Action creates review sessions based on settings. Settings define if is + action enabled and what is a template for review session name. Logic works + in a way that if review session with the name already exists then skip + process. If review session for current day does not exist but yesterdays + review exists and is empty then yesterdays is renamed otherwise creates + new review session. + + Also contains cycle creation of dailies which is triggered each morning. + This option must be enabled in project settings. Cycle creation is also + checked on registration of action. + """ + + identifier = "create.daily.review.session" + #: Action label. + label = "OpenPype Admin" + variant = "- Create Daily Review Session (Server)" + #: Action description. + description = "Manually create daily review session" + role_list = {"Pypeclub", "Administrator", "Project Manager"} + + settings_key = "create_daily_review_session" + default_template = "{yy}{mm}{dd}" + + def __init__(self, *args, **kwargs): + super(CreateDailyReviewSessionServerAction, self).__init__(*args, **kwargs) + + self._cycle_timer = None + self._last_cyle_time = None + self._day_delta = datetime.timedelta(days=1) + + def discover(self, session, entities, event): + """Show action only on AssetVersions.""" + + valid_selection = False + for ent in event["data"]["selection"]: + # Ignore entities that are not tasks or projects + if ent["entityType"].lower() in ( + "show", "task", "reviewsession", "assetversion" + ): + valid_selection = True + break + else: + self.log.info(ent["entityType"]) + + if not valid_selection: + return False + return self.valid_roles(session, entities, event) + + def launch(self, session, entities, event): + project_entity = self.get_project_from_entity(entities[0], session) + project_name = project_entity["full_name"] + project_settings = self.get_project_settings_from_event( + event, project_name + ) + action_settings = self._extract_action_settings(project_settings) + project_name_by_id = { + project_entity["id"]: project_name + } + settings_by_project_id = { + project_entity["id"]: action_settings + } + self._process_review_session( + session, settings_by_project_id, project_name_by_id + ) + return True + + def register(self, *args, **kwargs): + """Override register to be able trigger """ + # Register server action as would be normally + super(CreateDailyReviewSessionServerAction, self).register(*args, **kwargs) + + # Create threading timer which will trigger creation of report + # at the 00:00:01 of next day + # - callback will trigger another timer which will have 1 day offset + now = datetime.datetime.now() + # Create object of today morning + today_morning = datetime.datetime( + now.year, now.month, now.day, 0, 0, 1 + ) + # Add a day delta (to calculate next day date) + next_day_morning = today_morning + self._day_delta + # Calculate first delta in seconds for first threading timer + first_delta = (next_day_morning - now).total_seconds() + # Store cycle time which will be used to create next timer + self._last_cyle_time = next_day_morning + # Create timer thread + self._cycle_timer = threading.Timer(first_delta, self._timer_callback) + self._cycle_timer.start() + + self._check_review_session() + + def _timer_callback(self): + if ( + self._cycle_timer is not None + and self._last_cyle_time is not None + ): + now = datetime.datetime.now() + while self._last_cyle_time < now: + self._last_cyle_time = self._last_cyle_time + self._day_delta + + delay = (self._last_cyle_time - now).total_seconds() + + self._cycle_timer = threading.Timer(delay, self._timer_callback) + self._cycle_timer.start() + self._check_review_session() + + def _check_review_session(self): + session = ftrack_api.Session( + server_url=self.session.server_url, + api_key=self.session.api_key, + api_user=self.session.api_user, + auto_connect_event_hub=False + ) + project_entities = session.query( + "select id, full_name from Project" + ).all() + project_names_by_id = { + project_entity["id"]: project_entity["full_name"] + for project_entity in project_entities + } + + action_settings_by_project_id = self._get_action_settings( + project_names_by_id + ) + enabled_action_settings_by_project_id = {} + for item in action_settings_by_project_id.items(): + project_id, action_settings = item + if action_settings.get("cycle_enabled"): + enabled_action_settings_by_project_id[project_id] = ( + action_settings + ) + + if not enabled_action_settings_by_project_id: + self.log.info(( + "There are no projects that have enabled" + " cycle review sesison creation" + )) + + else: + self._process_review_session( + session, + enabled_action_settings_by_project_id, + project_names_by_id + ) + + session.close() + + def _process_review_session( + self, session, settings_by_project_id, project_names_by_id + ): + review_sessions = session.query(( + "select id, name, project_id" + " from ReviewSession where project_id in ({})" + ).format(self.join_query_keys(settings_by_project_id))).all() + + review_sessions_by_project_id = collections.defaultdict(list) + for review_session in review_sessions: + project_id = review_session["project_id"] + review_sessions_by_project_id[project_id].append(review_session) + + # Prepare fill data for today's review sesison and yesterdays + now = datetime.datetime.now() + today_obj = datetime.datetime( + now.year, now.month, now.day, 0, 0, 0 + ) + yesterday_obj = today_obj - self._day_delta + + today_fill_data = get_datetime_data(today_obj) + yesterday_fill_data = get_datetime_data(yesterday_obj) + + # Loop through projects and try to create daily reviews + for project_id, action_settings in settings_by_project_id.items(): + review_session_template = ( + action_settings["review_session_template"] + ).strip() or self.default_template + + today_project_fill_data = copy.deepcopy(today_fill_data) + yesterday_project_fill_data = copy.deepcopy(yesterday_fill_data) + project_name = project_names_by_id[project_id] + today_project_fill_data["project_name"] = project_name + yesterday_project_fill_data["project_name"] = project_name + + today_session_name = self._fill_review_template( + review_session_template, today_project_fill_data + ) + yesterday_session_name = self._fill_review_template( + review_session_template, yesterday_project_fill_data + ) + # Skip if today's session name could not be filled + if not today_session_name: + continue + + # Find matchin review session + project_review_sessions = review_sessions_by_project_id[project_id] + todays_session = None + yesterdays_session = None + for review_session in project_review_sessions: + session_name = review_session["name"] + if session_name == today_session_name: + todays_session = review_session + break + elif session_name == yesterday_session_name: + yesterdays_session = review_session + + # Skip if today's session already exist + if todays_session is not None: + self.log.debug(( + "Todays ReviewSession \"{}\"" + " in project \"{}\" already exists" + ).format(today_session_name, project_name)) + continue + + # Check if there is yesterday's session and is empty + # - in that case just rename it + if ( + yesterdays_session is not None + and len(yesterdays_session["review_session_objects"]) == 0 + ): + self.log.debug(( + "Renaming yesterdays empty review session \"{}\" to \"{}\"" + " in project \"{}\"" + ).format( + yesterday_session_name, today_session_name, project_name + )) + yesterdays_session["name"] = today_session_name + session.commit() + continue + + # Create new review session with new name + self.log.debug(( + "Creating new review session \"{}\" in project \"{}\"" + ).format(today_session_name, project_name)) + session.create("ReviewSession", { + "project_id": project_id, + "name": today_session_name + }) + session.commit() + + def _get_action_settings(self, project_names_by_id): + settings_by_project_id = {} + for project_id, project_name in project_names_by_id.items(): + project_settings = get_project_settings(project_name) + action_settings = self._extract_action_settings(project_settings) + settings_by_project_id[project_id] = action_settings + return settings_by_project_id + + def _extract_action_settings(self, project_settings): + return ( + project_settings + .get("ftrack", {}) + .get(self.settings_frack_subkey, {}) + .get(self.settings_key) + ) or {} + + def _fill_review_template(self, template, data): + output = None + try: + output = template.format(**data) + except Exception: + self.log.warning( + ( + "Failed to fill review session template {} with data {}" + ).format(template, data), + exc_info=True + ) + return output + + +def register(session): + '''Register plugin. Called when used as an plugin.''' + CreateDailyReviewSessionServerAction(session).register() From 08d1f97f1112e7efc0190f146139c366d8f84de8 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 9 Jun 2022 18:17:54 +0200 Subject: [PATCH 11/22] added settings for new action --- .../defaults/project_settings/ftrack.json | 9 +++++ .../schema_project_ftrack.json | 38 +++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/openpype/settings/defaults/project_settings/ftrack.json b/openpype/settings/defaults/project_settings/ftrack.json index 9d59deea3d..831c34835e 100644 --- a/openpype/settings/defaults/project_settings/ftrack.json +++ b/openpype/settings/defaults/project_settings/ftrack.json @@ -116,6 +116,15 @@ "Administrator", "Project manager" ] + }, + "create_daily_review_session": { + "enabled": true, + "role_list": [ + "Administrator", + "Project Manager" + ], + "cycle_enabled": false, + "review_session_template": "{yy}{mm}{dd}" } }, "user_handlers": { diff --git a/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json b/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json index 16cab49d5d..f8f9d5093d 100644 --- a/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json +++ b/openpype/settings/entities/schemas/projects_schema/schema_project_ftrack.json @@ -388,6 +388,44 @@ "object_type": "text" } ] + }, + { + "key": "create_daily_review_session", + "label": "Create daily review session", + "type": "dict", + "is_group": true, + "checkbox_key": "enabled", + "children": [ + { + "type": "boolean", + "key": "enabled" + }, + { + "type": "list", + "key": "role_list", + "label": "Roles", + "object_type": "text", + "use_label_wrap": true + }, + { + "type": "boolean", + "key": "cycle_enabled", + "label": "Create daily review session" + }, + { + "type": "separator" + }, + { + "type": "text", + "key": "review_session_template", + "label": "ReviewSession template", + "placeholder": "Default: {yy}{mm}{dd}" + }, + { + "type": "label", + "label": "Possible formatting keys in template:
- \"project_name\" - <Name of project>
- \"d\" - <Day of month number> in shortest possible way.
- \"dd\" - <Day of month number> with 2 digits.
- \"ddd\" - <Week day name> shortened week day. e.g.: `Mon`, ...
- \"dddd\" - <Week day name> full name of week day. e.g.: `Monday`, ...
- \"m\" - <Month number> in shortest possible way. e.g.: `1` if January
- \"mm\" - <Month number> with 2 digits.
- \"mmm\" - <Month name> shortened month name. e.g.: `Jan`, ...
- \"mmmm\" -<Month name> full month name. e.g.: `January`, ...
- \"yy\" - <Year number> shortened year. e.g.: `19`, `20`, ...
- \"yyyy\" - <Year number> full year. e.g.: `2019`, `2020`, ..." + } + ] } ] }, From 5999693fdf748025aa79cf9cf232d77406c4c9a6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Thu, 9 Jun 2022 18:27:00 +0200 Subject: [PATCH 12/22] fix too long lines --- .../event_handlers_server/action_create_review_session.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py index 3b7cb224f0..8a1d898193 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py +++ b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py @@ -37,7 +37,9 @@ class CreateDailyReviewSessionServerAction(ServerAction): default_template = "{yy}{mm}{dd}" def __init__(self, *args, **kwargs): - super(CreateDailyReviewSessionServerAction, self).__init__(*args, **kwargs) + super(CreateDailyReviewSessionServerAction, self).__init__( + *args, **kwargs + ) self._cycle_timer = None self._last_cyle_time = None @@ -82,7 +84,9 @@ class CreateDailyReviewSessionServerAction(ServerAction): def register(self, *args, **kwargs): """Override register to be able trigger """ # Register server action as would be normally - super(CreateDailyReviewSessionServerAction, self).register(*args, **kwargs) + super(CreateDailyReviewSessionServerAction, self).register( + *args, **kwargs + ) # Create threading timer which will trigger creation of report # at the 00:00:01 of next day From 0616db322d92be36cebd96c8d6e020fd7e9590c7 Mon Sep 17 00:00:00 2001 From: Felix Wang Date: Thu, 9 Jun 2022 10:42:20 -0700 Subject: [PATCH 13/22] Update openpype/hosts/maya/plugins/publish/collect_instances.py Co-authored-by: Roy Nieterau --- openpype/hosts/maya/plugins/publish/collect_instances.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_instances.py b/openpype/hosts/maya/plugins/publish/collect_instances.py index c76afe53f6..433fa9886d 100644 --- a/openpype/hosts/maya/plugins/publish/collect_instances.py +++ b/openpype/hosts/maya/plugins/publish/collect_instances.py @@ -10,7 +10,6 @@ def get_all_children(nodes): Using maya.cmds.listRelatives(allDescendents=True) includes only the first instance. As such, this function acts as an optimal replacement with a focus on a fast query. - Borrowed from Colorbleed: https://tinyurl.com/bdht6fyh """ From f782cf4f6df2bd1762c662a77d81dd33e54239dc Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Fri, 10 Jun 2022 14:53:40 +0200 Subject: [PATCH 14/22] hiero: otio p3 compatibility issue - metadata on effect use update rather then __setter__ --- openpype/hosts/hiero/api/otio/hiero_export.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/hiero/api/otio/hiero_export.py b/openpype/hosts/hiero/api/otio/hiero_export.py index 1e4088d9c0..81cb43fa12 100644 --- a/openpype/hosts/hiero/api/otio/hiero_export.py +++ b/openpype/hosts/hiero/api/otio/hiero_export.py @@ -132,7 +132,7 @@ def create_time_effects(otio_clip, track_item): otio_effect = otio.schema.TimeEffect() otio_effect.name = name otio_effect.effect_name = effect_name - otio_effect.metadata = metadata + otio_effect.metadata.update(metadata) # add otio effect to clip effects otio_clip.effects.append(otio_effect) From b227ba58568a3521ead74da5f2135b6e7645b132 Mon Sep 17 00:00:00 2001 From: Jakub Trllo Date: Fri, 10 Jun 2022 14:54:48 +0200 Subject: [PATCH 15/22] removed debug log --- .../event_handlers_server/action_create_review_session.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py index 8a1d898193..8a8e86e7b9 100644 --- a/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py +++ b/openpype/modules/ftrack/event_handlers_server/action_create_review_session.py @@ -56,8 +56,6 @@ class CreateDailyReviewSessionServerAction(ServerAction): ): valid_selection = True break - else: - self.log.info(ent["entityType"]) if not valid_selection: return False From 213aa2241f00cdf8524aa95a05a408e59a8f791d Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 10 Jun 2022 16:41:09 +0200 Subject: [PATCH 16/22] :sparkles: add pointcache family to gpu cache loader --- openpype/hosts/maya/plugins/load/load_gpucache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index 6d5e945508..a9df22faaa 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -10,7 +10,7 @@ from openpype.api import get_project_settings class GpuCacheLoader(load.LoaderPlugin): """Load Alembic as gpuCache""" - families = ["model"] + families = ["model", "pointcache"] representations = ["abc"] label = "Import Gpu Cache" From f2c252be4e442136bd98fda4691a62ab23626e71 Mon Sep 17 00:00:00 2001 From: Ondrej Samohel Date: Fri, 10 Jun 2022 17:32:20 +0200 Subject: [PATCH 17/22] :recycle: add animation family there too --- openpype/hosts/maya/plugins/load/load_gpucache.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/maya/plugins/load/load_gpucache.py b/openpype/hosts/maya/plugins/load/load_gpucache.py index a9df22faaa..179819f904 100644 --- a/openpype/hosts/maya/plugins/load/load_gpucache.py +++ b/openpype/hosts/maya/plugins/load/load_gpucache.py @@ -10,7 +10,7 @@ from openpype.api import get_project_settings class GpuCacheLoader(load.LoaderPlugin): """Load Alembic as gpuCache""" - families = ["model", "pointcache"] + families = ["model", "animation", "pointcache"] representations = ["abc"] label = "Import Gpu Cache" From f1a5a122cf1801f0b812a3e10936b7336b630a15 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Thu, 9 Jun 2022 18:35:54 +0200 Subject: [PATCH 18/22] Project Manager: fix tools not being visible until when editable (cherry picked from commit fbdd225c8b0cc579a022d69c179a5f90fc6a387d) --- openpype/tools/project_manager/project_manager/delegates.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/openpype/tools/project_manager/project_manager/delegates.py b/openpype/tools/project_manager/project_manager/delegates.py index 31487ff132..b066bbb159 100644 --- a/openpype/tools/project_manager/project_manager/delegates.py +++ b/openpype/tools/project_manager/project_manager/delegates.py @@ -205,3 +205,9 @@ class ToolsDelegate(QtWidgets.QStyledItemDelegate): def setModelData(self, editor, model, index): model.setData(index, editor.value(), QtCore.Qt.EditRole) + + def displayText(self, value, locale): + if value: + return ", ".join(value) + else: + return From c486fb6f59a0d4ed977d8260c08c7d54bf5e3ba5 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 10 Jun 2022 13:06:49 +0200 Subject: [PATCH 19/22] Force edit mode on add task button (cherry picked from commit 96ca15b565b952d4e17c2010e8846ca18272d681) --- openpype/tools/project_manager/project_manager/window.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index c281479d4f..10b28f535f 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -245,7 +245,8 @@ class ProjectManagerWindow(QtWidgets.QWidget): self.hierarchy_view.add_asset() def _on_add_task(self): - self.hierarchy_view.add_task() + # Colorbleed edit: force the task to directly be in edit mode + self.hierarchy_view._add_task_and_edit() def _on_create_folders(self): project_name = self._current_project() From cbc6fb8b330abc88c0e8c64c57a966cd09fd8077 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 10 Jun 2022 20:54:12 +0200 Subject: [PATCH 20/22] Make `add_task_and_edit` method public --- openpype/tools/project_manager/project_manager/view.py | 6 +++--- openpype/tools/project_manager/project_manager/window.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openpype/tools/project_manager/project_manager/view.py b/openpype/tools/project_manager/project_manager/view.py index 74f5a06b71..f995d45f44 100644 --- a/openpype/tools/project_manager/project_manager/view.py +++ b/openpype/tools/project_manager/project_manager/view.py @@ -386,7 +386,7 @@ class HierarchyView(QtWidgets.QTreeView): self._source_model.delete_indexes(indexes) def _on_ctrl_shift_enter_pressed(self): - self._add_task_and_edit() + self.add_task_and_edit() def add_asset(self, parent_index=None): if parent_index is None: @@ -428,9 +428,9 @@ class HierarchyView(QtWidgets.QTreeView): self.edit(new_index) def _add_task_action(self): - self._add_task_and_edit() + self.add_task_and_edit() - def _add_task_and_edit(self): + def add_task_and_edit(self): new_index = self.add_task() if new_index is None: return diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index 10b28f535f..ed3445174d 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -246,7 +246,7 @@ class ProjectManagerWindow(QtWidgets.QWidget): def _on_add_task(self): # Colorbleed edit: force the task to directly be in edit mode - self.hierarchy_view._add_task_and_edit() + self.hierarchy_view.add_task_and_edit() def _on_create_folders(self): project_name = self._current_project() From 46e17b4816b6506c2b4aabe94ec15c2c1e71fb5d Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 10 Jun 2022 20:54:33 +0200 Subject: [PATCH 21/22] Remove comment --- openpype/tools/project_manager/project_manager/window.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/tools/project_manager/project_manager/window.py b/openpype/tools/project_manager/project_manager/window.py index ed3445174d..458a36ac39 100644 --- a/openpype/tools/project_manager/project_manager/window.py +++ b/openpype/tools/project_manager/project_manager/window.py @@ -245,7 +245,6 @@ class ProjectManagerWindow(QtWidgets.QWidget): self.hierarchy_view.add_asset() def _on_add_task(self): - # Colorbleed edit: force the task to directly be in edit mode self.hierarchy_view.add_task_and_edit() def _on_create_folders(self): From 01bec693275472ef976ffd29df2048aba16f3cf0 Mon Sep 17 00:00:00 2001 From: OpenPype Date: Sat, 11 Jun 2022 03:44:47 +0000 Subject: [PATCH 22/22] [Automated] Bump version --- CHANGELOG.md | 44 +++++++++++++++++++------------------------- openpype/version.py | 2 +- pyproject.toml | 2 +- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7798cb48..d0d25908cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,23 +1,39 @@ # Changelog -## [3.11.0-nightly.1](https://github.com/pypeclub/OpenPype/tree/HEAD) +## [3.11.0-nightly.2](https://github.com/pypeclub/OpenPype/tree/HEAD) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/3.10.0...HEAD) ### 📖 Documentation +- Documentation: Add app key to template documentation [\#3299](https://github.com/pypeclub/OpenPype/pull/3299) - doc: adding royal render and multiverse to the web site [\#3285](https://github.com/pypeclub/OpenPype/pull/3285) **🚀 Enhancements** +- updated poetry installation source [\#3316](https://github.com/pypeclub/OpenPype/pull/3316) +- TVPaint: Extractor use mark in/out range to render [\#3309](https://github.com/pypeclub/OpenPype/pull/3309) +- Ftrack: Delivery action can work on ReviewSessions [\#3307](https://github.com/pypeclub/OpenPype/pull/3307) +- Maya: Look assigner UI improvements [\#3298](https://github.com/pypeclub/OpenPype/pull/3298) +- Ftrack: Action to transfer values of hierarchical attributes [\#3284](https://github.com/pypeclub/OpenPype/pull/3284) +- Maya: better handling of legacy review subsets names [\#3269](https://github.com/pypeclub/OpenPype/pull/3269) - General: Updated windows oiio tool [\#3268](https://github.com/pypeclub/OpenPype/pull/3268) - Unreal: add support for skeletalMesh and staticMesh to loaders [\#3267](https://github.com/pypeclub/OpenPype/pull/3267) - Maya: reference loaders could store placeholder in referenced url [\#3264](https://github.com/pypeclub/OpenPype/pull/3264) - TVPaint: Init file for TVPaint worker also handle guideline images [\#3250](https://github.com/pypeclub/OpenPype/pull/3250) - Nuke: Change default icon path in settings [\#3247](https://github.com/pypeclub/OpenPype/pull/3247) +- Maya: publishing of animation and pointcache on a farm [\#3225](https://github.com/pypeclub/OpenPype/pull/3225) +- Maya: Look assigner UI improvements [\#3208](https://github.com/pypeclub/OpenPype/pull/3208) +- Nuke: add pointcache and animation to loader [\#3186](https://github.com/pypeclub/OpenPype/pull/3186) **🐛 Bug fixes** +- Houdini: Fix Houdini VDB manage update wrong file attribute name [\#3322](https://github.com/pypeclub/OpenPype/pull/3322) +- General: Vendorized modules for Python 2 and update poetry lock [\#3305](https://github.com/pypeclub/OpenPype/pull/3305) +- Fix - added local targets to install host [\#3303](https://github.com/pypeclub/OpenPype/pull/3303) +- Settings: Add missing default settings for nuke gizmo [\#3301](https://github.com/pypeclub/OpenPype/pull/3301) +- Maya: Fix swaped width and height in reviews [\#3300](https://github.com/pypeclub/OpenPype/pull/3300) +- Maya: point cache publish handles Maya instances [\#3297](https://github.com/pypeclub/OpenPype/pull/3297) - Global: extract review slate issues [\#3286](https://github.com/pypeclub/OpenPype/pull/3286) - Webpublisher: return only active projects in ProjectsEndpoint [\#3281](https://github.com/pypeclub/OpenPype/pull/3281) - Hiero: add support for task tags 3.10.x [\#3279](https://github.com/pypeclub/OpenPype/pull/3279) @@ -30,24 +46,15 @@ - Unreal: Fixed Render creation in UE5 [\#3239](https://github.com/pypeclub/OpenPype/pull/3239) - Unreal: Fixed Camera loading in UE5 [\#3238](https://github.com/pypeclub/OpenPype/pull/3238) - Flame: debugging [\#3224](https://github.com/pypeclub/OpenPype/pull/3224) -- add silent audio to slate [\#3162](https://github.com/pypeclub/OpenPype/pull/3162) **Merged pull requests:** -- Maya: better handling of legacy review subsets names [\#3269](https://github.com/pypeclub/OpenPype/pull/3269) -- Deadline: publishing of animation and pointcache on a farm [\#3225](https://github.com/pypeclub/OpenPype/pull/3225) -- Nuke: add pointcache and animation to loader [\#3186](https://github.com/pypeclub/OpenPype/pull/3186) -- Add a gizmo menu to nuke [\#3172](https://github.com/pypeclub/OpenPype/pull/3172) +- Maya: add pointcache family to gpu cache loader [\#3318](https://github.com/pypeclub/OpenPype/pull/3318) ## [3.10.0](https://github.com/pypeclub/OpenPype/tree/3.10.0) (2022-05-26) [Full Changelog](https://github.com/pypeclub/OpenPype/compare/CI/3.10.0-nightly.6...3.10.0) -**🆕 New features** - -- General: OpenPype modules publish plugins are registered in host [\#3180](https://github.com/pypeclub/OpenPype/pull/3180) -- General: Creator plugins from addons can be registered [\#3179](https://github.com/pypeclub/OpenPype/pull/3179) - **🚀 Enhancements** - Maya: FBX camera export [\#3253](https://github.com/pypeclub/OpenPype/pull/3253) @@ -55,10 +62,6 @@ - Project Manager: Allow to paste Tasks into multiple assets at the same time [\#3226](https://github.com/pypeclub/OpenPype/pull/3226) - Project manager: Sped up project load [\#3216](https://github.com/pypeclub/OpenPype/pull/3216) - Loader UI: Speed issues of loader with sync server [\#3199](https://github.com/pypeclub/OpenPype/pull/3199) -- Looks: add basic support for Renderman [\#3190](https://github.com/pypeclub/OpenPype/pull/3190) -- Maya: added clean\_import option to Import loader [\#3181](https://github.com/pypeclub/OpenPype/pull/3181) -- Add the scripts menu definition to nuke [\#3168](https://github.com/pypeclub/OpenPype/pull/3168) -- Maya: add maya 2023 to default applications [\#3167](https://github.com/pypeclub/OpenPype/pull/3167) **🐛 Bug fixes** @@ -76,12 +79,6 @@ - Photoshop: skip collector when automatic testing [\#3202](https://github.com/pypeclub/OpenPype/pull/3202) - Nuke: render/workfile version sync doesn't work on farm [\#3185](https://github.com/pypeclub/OpenPype/pull/3185) - Ftrack: Review image only if there are no mp4 reviews [\#3183](https://github.com/pypeclub/OpenPype/pull/3183) -- Ftrack: Locations deepcopy issue [\#3177](https://github.com/pypeclub/OpenPype/pull/3177) -- General: Avoid creating multiple thumbnails [\#3176](https://github.com/pypeclub/OpenPype/pull/3176) -- General/Hiero: better clip duration calculation [\#3169](https://github.com/pypeclub/OpenPype/pull/3169) -- General: Oiio conversion for ffmpeg checks for invalid characters [\#3166](https://github.com/pypeclub/OpenPype/pull/3166) -- Fix for attaching render to subset [\#3164](https://github.com/pypeclub/OpenPype/pull/3164) -- Harmony: fixed missing task name in render instance [\#3163](https://github.com/pypeclub/OpenPype/pull/3163) **🔀 Refactored code** @@ -92,7 +89,6 @@ - Harmony: message length in 21.1 [\#3257](https://github.com/pypeclub/OpenPype/pull/3257) - Harmony: 21.1 fix [\#3249](https://github.com/pypeclub/OpenPype/pull/3249) - Maya: added jpg to filter for Image Plane Loader [\#3223](https://github.com/pypeclub/OpenPype/pull/3223) -- Webpublisher: replace space by underscore in subset names [\#3160](https://github.com/pypeclub/OpenPype/pull/3160) ## [3.9.8](https://github.com/pypeclub/OpenPype/tree/3.9.8) (2022-05-19) @@ -103,15 +99,13 @@ - nuke: generate publishing nodes inside render group node [\#3206](https://github.com/pypeclub/OpenPype/pull/3206) - Loader UI: Speed issues of loader with sync server [\#3200](https://github.com/pypeclub/OpenPype/pull/3200) - Backport of fix for attaching renders to subsets [\#3195](https://github.com/pypeclub/OpenPype/pull/3195) +- Looks: add basic support for Renderman [\#3190](https://github.com/pypeclub/OpenPype/pull/3190) **🐛 Bug fixes** - Standalone Publisher: Always create new representation for thumbnail [\#3204](https://github.com/pypeclub/OpenPype/pull/3204) - Nuke: render/workfile version sync doesn't work on farm [\#3184](https://github.com/pypeclub/OpenPype/pull/3184) - Ftrack: Review image only if there are no mp4 reviews [\#3182](https://github.com/pypeclub/OpenPype/pull/3182) -- Ftrack: Locations deepcopy issue [\#3175](https://github.com/pypeclub/OpenPype/pull/3175) -- General: Avoid creating multiple thumbnails [\#3174](https://github.com/pypeclub/OpenPype/pull/3174) -- General: TemplateResult can be copied [\#3170](https://github.com/pypeclub/OpenPype/pull/3170) **Merged pull requests:** diff --git a/openpype/version.py b/openpype/version.py index 4c78a6e0a1..4b0a688cbf 100644 --- a/openpype/version.py +++ b/openpype/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- """Package declaring Pype version.""" -__version__ = "3.11.0-nightly.1" +__version__ = "3.11.0-nightly.2" diff --git a/pyproject.toml b/pyproject.toml index 63bd08d644..4289c74ebe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "OpenPype" -version = "3.11.0-nightly.1" # OpenPype +version = "3.11.0-nightly.2" # OpenPype description = "Open VFX and Animation pipeline with support." authors = ["OpenPype Team "] license = "MIT License"